blob: 9dd5a909a817206715b5e62d24454a66222c12bd [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"
Rafael Espindola3e34e652015-02-03 16:33:53 +000016#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000017#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000018#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000019#include "clang/Driver/Driver.h"
20#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000021#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000022#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000023#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000024#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000025#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000026#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000027#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000028#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000029#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000030#include "llvm/Option/Arg.h"
31#include "llvm/Option/ArgList.h"
32#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000033#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000034#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000035#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000036#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000037#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000038#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000040#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000041#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000042
Daniel Dunbar1a093d22009-03-18 06:00:36 +000043using namespace clang::driver;
44using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000045using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000046using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000047
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000048static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
49 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
50 options::OPT_fpic, options::OPT_fno_pic,
51 options::OPT_fPIE, options::OPT_fno_PIE,
52 options::OPT_fpie, options::OPT_fno_pie);
53 if (!LastPICArg)
54 return;
55 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
56 LastPICArg->getOption().matches(options::OPT_fpic) ||
57 LastPICArg->getOption().matches(options::OPT_fPIE) ||
58 LastPICArg->getOption().matches(options::OPT_fpie)) {
59 CmdArgs.push_back("-KPIC");
60 }
61}
62
Daniel Dunbar64198ef2009-09-10 01:21:05 +000063/// CheckPreprocessingOptions - Perform some validation of preprocessing
64/// arguments that is shared with gcc.
65static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000066 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
67 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
68 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000069 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000070 << A->getBaseArg().getAsString(Args)
71 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
72 }
73 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000074}
75
Daniel Dunbar4eadb602009-09-10 01:21:12 +000076/// CheckCodeGenerationOptions - Perform some validation of code generation
77/// arguments that is shared with gcc.
78static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
79 // In gcc, only ARM checks this, but it seems reasonable to check universally.
80 if (Args.hasArg(options::OPT_static))
81 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
82 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000083 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000084 << A->getAsString(Args) << "-static";
85}
86
Bob Wilsond5aad2a2014-11-04 22:28:48 +000087// Add backslashes to escape spaces and other backslashes.
88// This is used for the space-separated argument list specified with
89// the -dwarf-debug-flags option.
90static void EscapeSpacesAndBackslashes(const char *Arg,
91 SmallVectorImpl<char> &Res) {
92 for ( ; *Arg; ++Arg) {
93 switch (*Arg) {
94 default: break;
95 case ' ':
96 case '\\':
97 Res.push_back('\\');
98 break;
99 }
100 Res.push_back(*Arg);
101 }
102}
103
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000104// Quote target names for inclusion in GNU Make dependency files.
105// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000106static void QuoteTarget(StringRef Target,
107 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000108 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
109 switch (Target[i]) {
110 case ' ':
111 case '\t':
112 // Escape the preceding backslashes
113 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
114 Res.push_back('\\');
115
116 // Escape the space/tab
117 Res.push_back('\\');
118 break;
119 case '$':
120 Res.push_back('$');
121 break;
122 case '#':
123 Res.push_back('\\');
124 break;
125 default:
126 break;
127 }
128
129 Res.push_back(Target[i]);
130 }
131}
132
Bill Wendlingc0938f32012-03-12 22:10:06 +0000133static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000134 ArgStringList &CmdArgs,
135 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000136 const char *EnvVar) {
137 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000138 bool CombinedArg = false;
139
Bill Wendling281ca292012-03-12 21:22:35 +0000140 if (!DirList)
141 return; // Nothing to do.
142
Chad Rosier616e8a52012-10-30 21:42:09 +0000143 StringRef Name(ArgName);
144 if (Name.equals("-I") || Name.equals("-L"))
145 CombinedArg = true;
146
Bill Wendling281ca292012-03-12 21:22:35 +0000147 StringRef Dirs(DirList);
148 if (Dirs.empty()) // Empty string should not add '.'.
149 return;
150
151 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000152 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000153 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 if (CombinedArg) {
155 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
156 } else {
157 CmdArgs.push_back(ArgName);
158 CmdArgs.push_back(".");
159 }
Bill Wendling281ca292012-03-12 21:22:35 +0000160 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000161 if (CombinedArg) {
162 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
163 } else {
164 CmdArgs.push_back(ArgName);
165 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
166 }
Bill Wendling281ca292012-03-12 21:22:35 +0000167 }
Nico Weber89355782012-03-19 15:00:03 +0000168 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000169 }
170
171 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000172 if (CombinedArg) {
173 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
174 } else {
175 CmdArgs.push_back(ArgName);
176 CmdArgs.push_back(".");
177 }
Bill Wendling281ca292012-03-12 21:22:35 +0000178 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000179 if (CombinedArg) {
180 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
181 } else {
182 CmdArgs.push_back(ArgName);
183 CmdArgs.push_back(Args.MakeArgString(Dirs));
184 }
Bill Wendling281ca292012-03-12 21:22:35 +0000185 }
186}
187
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188static void AddLinkerInputs(const ToolChain &TC,
189 const InputInfoList &Inputs, const ArgList &Args,
190 ArgStringList &CmdArgs) {
191 const Driver &D = TC.getDriver();
192
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000193 // Add extra linker input arguments which are not treated as inputs
194 // (constructed via -Xarch_).
195 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
196
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000197 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 if (!TC.HasNativeLLVMSupport()) {
199 // Don't try to pass LLVM inputs unless we have native support.
200 if (II.getType() == types::TY_LLVM_IR ||
201 II.getType() == types::TY_LTO_IR ||
202 II.getType() == types::TY_LLVM_BC ||
203 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000204 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000205 << TC.getTripleString();
206 }
207
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000208 // Add filenames immediately.
209 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000210 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000211 continue;
212 }
213
214 // Otherwise, this is a linker input argument.
215 const Arg &A = II.getInputArg();
216
217 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000218 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000219 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000220 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000221 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000222 else if (A.getOption().matches(options::OPT_z)) {
223 // Pass -z prefix for gcc linker compatibility.
224 A.claim();
225 A.render(Args, CmdArgs);
226 } else {
227 A.renderAsInput(Args, CmdArgs);
228 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 }
Bill Wendling281ca292012-03-12 21:22:35 +0000230
231 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000232 // and only supported on native toolchains.
233 if (!TC.isCrossCompiling())
234 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000235}
236
John McCall31168b02011-06-15 23:02:42 +0000237/// \brief Determine whether Objective-C automated reference counting is
238/// enabled.
239static bool isObjCAutoRefCount(const ArgList &Args) {
240 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
241}
242
Ted Kremeneke65b0862012-03-06 20:05:56 +0000243/// \brief Determine whether we are linking the ObjC runtime.
244static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000245 if (isObjCAutoRefCount(Args)) {
246 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000247 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000248 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249 return Args.hasArg(options::OPT_fobjc_link_runtime);
250}
251
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000252static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000253 // Don't forward inputs from the original command line. They are added from
254 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000255 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000256 !O.hasFlag(options::DriverOption) &&
257 !O.hasFlag(options::LinkerInput);
258}
259
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000260void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000261 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000262 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000263 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000264 ArgStringList &CmdArgs,
265 const InputInfo &Output,
266 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000267 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000268
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000269 CheckPreprocessingOptions(D, Args);
270
271 Args.AddLastArg(CmdArgs, options::OPT_C);
272 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000273
274 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000275 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 (A = Args.getLastArg(options::OPT_MD)) ||
277 (A = Args.getLastArg(options::OPT_MMD))) {
278 // Determine the output location.
279 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000280 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000281 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000282 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000283 } else if (Output.getType() == types::TY_Dependencies) {
284 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000285 } else if (A->getOption().matches(options::OPT_M) ||
286 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000287 DepFile = "-";
288 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000289 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000290 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000291 }
292 CmdArgs.push_back("-dependency-file");
293 CmdArgs.push_back(DepFile);
294
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000295 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
297 const char *DepTarget;
298
299 // If user provided -o, that is the dependency target, except
300 // when we are only generating a dependency file.
301 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
302 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000303 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000304 } else {
305 // Otherwise derive from the base input.
306 //
307 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000308 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000309 llvm::sys::path::replace_extension(P, "o");
310 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
313 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000314 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000315 QuoteTarget(DepTarget, Quoted);
316 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 }
318
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000319 if (A->getOption().matches(options::OPT_M) ||
320 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000322
323 if (isa<PrecompileJobAction>(JA))
324 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000325 }
326
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000327 if (Args.hasArg(options::OPT_MG)) {
328 if (!A || A->getOption().matches(options::OPT_MD) ||
329 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000330 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000331 CmdArgs.push_back("-MG");
332 }
333
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000335
336 // Convert all -MQ <target> args to -MT <quoted target>
337 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
338 options::OPT_MQ),
339 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000340 const Arg *A = *it;
341 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000342
Daniel Dunbara442fd52010-06-11 22:00:13 +0000343 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000344 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000345 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000346 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000347 CmdArgs.push_back(Args.MakeArgString(Quoted));
348
349 // -MT flag - no change
350 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000351 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000352 }
353 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000354
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 // Add -i* options, and automatically translate to
356 // -include-pch/-include-pth for transparent PCH support. It's
357 // wonky, but we include looking for .gch so we can support seamless
358 // replacement into a build system already set up to be generating
359 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000360 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000361 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
362 ie = Args.filtered_end(); it != ie; ++it) {
363 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000364
365 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000366 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
367 RenderedImplicitInclude = true;
368
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000369 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000370 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000371
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000372 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000373 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000374 SmallString<128> P(A->getValue());
375 // We want the files to have a name like foo.h.pch. Add a dummy extension
376 // so that replace_extension does the right thing.
377 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000379 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000380 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000382 }
383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000385 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000386 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000387 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000388 }
389
Douglas Gregor111af7d2009-04-18 00:34:01 +0000390 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000391 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000392 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000393 FoundPCH = UsePCH;
394 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000396 }
397
398 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000399 if (IsFirstImplicitInclude) {
400 A->claim();
401 if (UsePCH)
402 CmdArgs.push_back("-include-pch");
403 else
404 CmdArgs.push_back("-include-pth");
405 CmdArgs.push_back(Args.MakeArgString(P.str()));
406 continue;
407 } else {
408 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000409 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000410 << P.str() << A->getAsString(Args);
411 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000412 }
413 }
414
415 // Not translated, render as usual.
416 A->claim();
417 A->render(Args, CmdArgs);
418 }
419
420 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000421 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
422 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000423
424 // Add -Wp, and -Xassembler if using the preprocessor.
425
426 // FIXME: There is a very unfortunate problem here, some troubled
427 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
428 // really support that we would have to parse and then translate
429 // those options. :(
430 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
431 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000432
433 // -I- is a deprecated GCC feature, reject it.
434 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000435 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000436
437 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
438 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000439 StringRef sysroot = C.getSysRoot();
440 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000441 if (!Args.hasArg(options::OPT_isysroot)) {
442 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000443 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444 }
445 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000446
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000447 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000448 // FIXME: We should probably sink the logic for handling these from the
449 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000450 // CPATH - included following the user specified includes (but prior to
451 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000452 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000453 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000454 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000456 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000457 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000458 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000459 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000461
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000462 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000463 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000464 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000465
466 // Add system include arguments.
467 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000468}
469
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470// FIXME: Move to target hook.
471static bool isSignedCharDefault(const llvm::Triple &Triple) {
472 switch (Triple.getArch()) {
473 default:
474 return true;
475
Tim Northover9bb857a2013-01-31 12:13:10 +0000476 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000477 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000478 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000479 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000480 case llvm::Triple::thumb:
481 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000482 if (Triple.isOSDarwin() || Triple.isOSWindows())
483 return true;
484 return false;
485
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000488 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000489 return true;
490 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000491
Bill Schmidt778d3872013-07-26 01:36:11 +0000492 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000493 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000494 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000495 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000496 }
497}
498
Robert Lytton0e076492013-08-13 09:43:10 +0000499static bool isNoCommonDefault(const llvm::Triple &Triple) {
500 switch (Triple.getArch()) {
501 default:
502 return false;
503
504 case llvm::Triple::xcore:
505 return true;
506 }
507}
508
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000509// Handle -mhwdiv=.
510static void getARMHWDivFeatures(const Driver &D, const Arg *A,
511 const ArgList &Args,
512 std::vector<const char *> &Features) {
513 StringRef HWDiv = A->getValue();
514 if (HWDiv == "arm") {
515 Features.push_back("+hwdiv-arm");
516 Features.push_back("-hwdiv");
517 } else if (HWDiv == "thumb") {
518 Features.push_back("-hwdiv-arm");
519 Features.push_back("+hwdiv");
520 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
521 Features.push_back("+hwdiv-arm");
522 Features.push_back("+hwdiv");
523 } else if (HWDiv == "none") {
524 Features.push_back("-hwdiv-arm");
525 Features.push_back("-hwdiv");
526 } else
527 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
528}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000529
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000530// Handle -mfpu=.
531//
532// FIXME: Centralize feature selection, defaulting shouldn't be also in the
533// frontend target.
534static void getARMFPUFeatures(const Driver &D, const Arg *A,
535 const ArgList &Args,
536 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000537 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000538
539 // Set the target features based on the FPU.
540 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
541 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000542 Features.push_back("-vfp2");
543 Features.push_back("-vfp3");
544 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000545 } else if (FPU == "vfp") {
546 Features.push_back("+vfp2");
547 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000548 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000549 Features.push_back("+vfp3");
550 Features.push_back("+d16");
551 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000552 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000553 Features.push_back("+vfp3");
554 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000555 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
556 Features.push_back("+vfp4");
557 Features.push_back("+d16");
558 Features.push_back("-neon");
559 } else if (FPU == "vfp4" || FPU == "vfpv4") {
560 Features.push_back("+vfp4");
561 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000562 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
563 Features.push_back("+vfp4");
564 Features.push_back("+d16");
565 Features.push_back("+fp-only-sp");
566 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000567 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
568 Features.push_back("+fp-armv8");
569 Features.push_back("+fp-only-sp");
570 Features.push_back("+d16");
571 Features.push_back("-neon");
572 Features.push_back("-crypto");
573 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
574 FPU == "fp5-d16" || FPU == "fpv5-d16") {
575 Features.push_back("+fp-armv8");
576 Features.push_back("+d16");
577 Features.push_back("-neon");
578 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000579 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000580 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000581 Features.push_back("-neon");
582 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000583 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000584 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000585 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000586 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000587 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000588 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000589 Features.push_back("+neon");
590 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000591 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000592 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000593 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000594 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000595 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000596 } else if (FPU == "neon-vfpv4") {
597 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000598 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000599 } else if (FPU == "none") {
600 Features.push_back("-vfp2");
601 Features.push_back("-vfp3");
602 Features.push_back("-vfp4");
603 Features.push_back("-fp-armv8");
604 Features.push_back("-crypto");
605 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000606 } else
607 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
608}
609
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000610// Select the float ABI as determined by -msoft-float, -mhard-float, and
611// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000612StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000613 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000614 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000615 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
616 options::OPT_mhard_float,
617 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000618 if (A->getOption().matches(options::OPT_msoft_float))
619 FloatABI = "soft";
620 else if (A->getOption().matches(options::OPT_mhard_float))
621 FloatABI = "hard";
622 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000623 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000624 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000625 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000626 << A->getAsString(Args);
627 FloatABI = "soft";
628 }
629 }
630 }
631
632 // If unspecified, choose the default based on the platform.
633 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000634 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000635 case llvm::Triple::Darwin:
636 case llvm::Triple::MacOSX:
637 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000638 // Darwin defaults to "softfp" for v6 and v7.
639 //
640 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000641 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000642 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000643 if (StringRef(ArchName).startswith("v6") ||
644 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000645 FloatABI = "softfp";
646 else
647 FloatABI = "soft";
648 break;
649 }
650
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000651 // FIXME: this is invalid for WindowsCE
652 case llvm::Triple::Win32:
653 FloatABI = "hard";
654 break;
655
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000656 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000657 switch(Triple.getEnvironment()) {
658 case llvm::Triple::GNUEABIHF:
659 FloatABI = "hard";
660 break;
661 default:
662 // FreeBSD defaults to soft float
663 FloatABI = "soft";
664 break;
665 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000666 break;
667
Daniel Dunbar78485922009-09-10 23:00:09 +0000668 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000669 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000670 case llvm::Triple::GNUEABIHF:
671 FloatABI = "hard";
672 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000673 case llvm::Triple::GNUEABI:
674 FloatABI = "softfp";
675 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000676 case llvm::Triple::EABIHF:
677 FloatABI = "hard";
678 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000679 case llvm::Triple::EABI:
680 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
681 FloatABI = "softfp";
682 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000683 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000684 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000685 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000686 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000687 FloatABI = "softfp";
688 else
689 FloatABI = "soft";
690 break;
691 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000692 default:
693 // Assume "soft", but warn the user we are guessing.
694 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000695 if (Triple.getOS() != llvm::Triple::UnknownOS ||
696 !Triple.isOSBinFormatMachO())
697 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000698 break;
699 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000700 }
701 }
702
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000703 return FloatABI;
704}
705
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000706static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
707 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000708 std::vector<const char *> &Features,
709 bool ForAS) {
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000710 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000711 if (!ForAS) {
712 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
713 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
714 // stripped out by the ARM target. We should probably pass this a new
715 // -target-option, which is handled by the -cc1/-cc1as invocation.
716 //
717 // FIXME2: For consistency, it would be ideal if we set up the target
718 // machine state the same when using the frontend or the assembler. We don't
719 // currently do that for the assembler, we pass the options directly to the
720 // backend and never even instantiate the frontend TargetInfo. If we did,
721 // and used its handleTargetFeatures hook, then we could ensure the
722 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000723
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000724 // Use software floating point operations?
725 if (FloatABI == "soft")
726 Features.push_back("+soft-float");
727
728 // Use software floating point argument passing?
729 if (FloatABI != "hard")
730 Features.push_back("+soft-float-abi");
731 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000732
733 // Honor -mfpu=.
734 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000735 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000736 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
737 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000738
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000739 // Setting -msoft-float effectively disables NEON because of the GCC
740 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000741 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000742 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000743 // Also need to explicitly disable features which imply NEON.
744 Features.push_back("-crypto");
745 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000746
747 // En/disable crc
748 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
749 options::OPT_mnocrc)) {
750 if (A->getOption().matches(options::OPT_mcrc))
751 Features.push_back("+crc");
752 else
753 Features.push_back("-crc");
754 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000756
757void Clang::AddARMTargetArgs(const ArgList &Args,
758 ArgStringList &CmdArgs,
759 bool KernelOrKext) const {
760 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000761 // Get the effective triple, which takes into account the deployment target.
762 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
763 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000764 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000765
766 // Select the ABI to use.
767 //
768 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000769 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000770 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000771 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000772 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000773 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000774 // The backend is hardwired to assume AAPCS for M-class processors, ensure
775 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000776 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000777 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000778 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000779 ABIName = "aapcs";
780 } else {
781 ABIName = "apcs-gnu";
782 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000783 } else if (Triple.isOSWindows()) {
784 // FIXME: this is invalid for WindowsCE
785 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000786 } else {
787 // Select the default based on the platform.
788 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000789 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000790 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000791 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000792 ABIName = "aapcs-linux";
793 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000794 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000795 case llvm::Triple::EABI:
796 ABIName = "aapcs";
797 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000798 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000799 if (Triple.getOS() == llvm::Triple::NetBSD)
800 ABIName = "apcs-gnu";
801 else
802 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000803 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000804 }
805 }
806 CmdArgs.push_back("-target-abi");
807 CmdArgs.push_back(ABIName);
808
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000809 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000810 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000811 if (FloatABI == "soft") {
812 // Floating point operations and argument passing are soft.
813 //
814 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000815 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000816 CmdArgs.push_back("-mfloat-abi");
817 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000818 } else if (FloatABI == "softfp") {
819 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000820 CmdArgs.push_back("-mfloat-abi");
821 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000822 } else {
823 // Floating point operations and argument passing are hard.
824 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000825 CmdArgs.push_back("-mfloat-abi");
826 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000827 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000828
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000829 // Kernel code has more strict alignment requirements.
830 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000831 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000832 CmdArgs.push_back("-backend-option");
833 CmdArgs.push_back("-arm-long-calls");
834 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000835
Daniel Dunbar12100e22011-03-22 16:48:17 +0000836 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000837 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000838
839 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000840 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000841 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000842 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000843
Bob Wilson0874e532014-07-29 00:23:18 +0000844 // -mkernel implies -mstrict-align; don't add the redundant option.
845 if (!KernelOrKext) {
846 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
847 options::OPT_munaligned_access)) {
848 CmdArgs.push_back("-backend-option");
849 if (A->getOption().matches(options::OPT_mno_unaligned_access))
850 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000851 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000852 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000853 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000854 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000855 }
Bob Wilson0874e532014-07-29 00:23:18 +0000856 }
857 }
858
Chad Rosierba3df1d2011-08-26 00:26:29 +0000859 // Setting -mno-global-merge disables the codegen global merge pass. Setting
860 // -mglobal-merge has no effect as the pass is enabled by default.
861 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
862 options::OPT_mno_global_merge)) {
863 if (A->getOption().matches(options::OPT_mno_global_merge))
864 CmdArgs.push_back("-mno-global-merge");
865 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000866
Bob Wilson9c8af452013-04-11 18:53:25 +0000867 if (!Args.hasFlag(options::OPT_mimplicit_float,
868 options::OPT_mno_implicit_float,
869 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000870 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000871
Logan Chien749763e2014-04-03 13:12:44 +0000872 // llvm does not support reserving registers in general. There is support
873 // for reserving r9 on ARM though (defined as a platform-specific register
874 // in ARM EABI).
875 if (Args.hasArg(options::OPT_ffixed_r9)) {
876 CmdArgs.push_back("-backend-option");
877 CmdArgs.push_back("-arm-reserve-r9");
878 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000879}
880
Tim Northover573cbee2014-05-24 12:52:07 +0000881/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
882/// targeting.
883static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000884 Arg *A;
885 std::string CPU;
886 // If we have -mtune or -mcpu, use that.
887 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
888 CPU = A->getValue();
889 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
890 StringRef Mcpu = A->getValue();
891 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000892 }
893
Kevin Qin110db6f2014-07-18 07:03:22 +0000894 // Handle CPU name is 'native'.
895 if (CPU == "native")
896 return llvm::sys::getHostCPUName();
897 else if (CPU.size())
898 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000899
James Molloy9b1586b2014-04-17 12:51:17 +0000900 // Make sure we pick "cyclone" if -arch is used.
901 // FIXME: Should this be picked by checking the target triple instead?
902 if (Args.getLastArg(options::OPT_arch))
903 return "cyclone";
904
905 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000906}
907
Tim Northover573cbee2014-05-24 12:52:07 +0000908void Clang::AddAArch64TargetArgs(const ArgList &Args,
909 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000910 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
911 llvm::Triple Triple(TripleStr);
912
913 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
914 Args.hasArg(options::OPT_mkernel) ||
915 Args.hasArg(options::OPT_fapple_kext))
916 CmdArgs.push_back("-disable-red-zone");
917
918 if (!Args.hasFlag(options::OPT_mimplicit_float,
919 options::OPT_mno_implicit_float, true))
920 CmdArgs.push_back("-no-implicit-float");
921
Craig Topper92fc2df2014-05-17 16:56:41 +0000922 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000923 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
924 ABIName = A->getValue();
925 else if (Triple.isOSDarwin())
926 ABIName = "darwinpcs";
927 else
928 ABIName = "aapcs";
929
930 CmdArgs.push_back("-target-abi");
931 CmdArgs.push_back(ABIName);
932
Bob Wilson0874e532014-07-29 00:23:18 +0000933 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
934 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000935 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000936 if (A->getOption().matches(options::OPT_mno_unaligned_access))
937 CmdArgs.push_back("-aarch64-strict-align");
938 else
939 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000940 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000941
Bradley Smith9ff64332014-10-13 10:16:06 +0000942 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
943 options::OPT_mno_fix_cortex_a53_835769)) {
944 CmdArgs.push_back("-backend-option");
945 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
946 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
947 else
948 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000949 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
950 // Enabled A53 errata (835769) workaround by default on android
951 CmdArgs.push_back("-backend-option");
952 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000953 }
954
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000955 // Setting -mno-global-merge disables the codegen global merge pass. Setting
956 // -mglobal-merge has no effect as the pass is enabled by default.
957 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
958 options::OPT_mno_global_merge)) {
959 if (A->getOption().matches(options::OPT_mno_global_merge))
960 CmdArgs.push_back("-mno-global-merge");
961 }
Renato Golinb625f482015-01-25 23:17:48 +0000962
963 if (Args.hasArg(options::OPT_ffixed_x18)) {
964 CmdArgs.push_back("-backend-option");
965 CmdArgs.push_back("-aarch64-reserve-x18");
966 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000967}
968
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000969// Get CPU and ABI names. They are not independent
970// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000971void mips::getMipsCPUAndABI(const ArgList &Args,
972 const llvm::Triple &Triple,
973 StringRef &CPUName,
974 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000975 const char *DefMips32CPU = "mips32r2";
976 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000977
Daniel Sanders2bf13662014-07-10 14:40:57 +0000978 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
979 // default for mips64(el)?-img-linux-gnu.
980 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
981 Triple.getEnvironment() == llvm::Triple::GNU) {
982 DefMips32CPU = "mips32r6";
983 DefMips64CPU = "mips64r6";
984 }
985
Brad Smithba26f582015-01-06 02:53:17 +0000986 // MIPS3 is the default for mips64*-unknown-openbsd.
987 if (Triple.getOS() == llvm::Triple::OpenBSD)
988 DefMips64CPU = "mips3";
989
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000990 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000991 options::OPT_mcpu_EQ))
992 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000993
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000994 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000995 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000996 // Convert a GNU style Mips ABI name to the name
997 // accepted by LLVM Mips backend.
998 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
999 .Case("32", "o32")
1000 .Case("64", "n64")
1001 .Default(ABIName);
1002 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001003
1004 // Setup default CPU and ABI names.
1005 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001006 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001007 default:
1008 llvm_unreachable("Unexpected triple arch name");
1009 case llvm::Triple::mips:
1010 case llvm::Triple::mipsel:
1011 CPUName = DefMips32CPU;
1012 break;
1013 case llvm::Triple::mips64:
1014 case llvm::Triple::mips64el:
1015 CPUName = DefMips64CPU;
1016 break;
1017 }
1018 }
1019
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001020 if (ABIName.empty()) {
1021 // Deduce ABI name from the target triple.
1022 if (Triple.getArch() == llvm::Triple::mips ||
1023 Triple.getArch() == llvm::Triple::mipsel)
1024 ABIName = "o32";
1025 else
1026 ABIName = "n64";
1027 }
1028
1029 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001030 // Deduce CPU name from ABI name.
1031 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001032 .Cases("o32", "eabi", DefMips32CPU)
1033 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001034 .Default("");
1035 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001036
1037 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001038}
1039
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001040// Convert ABI name to the GNU tools acceptable variant.
1041static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1042 return llvm::StringSwitch<llvm::StringRef>(ABI)
1043 .Case("o32", "32")
1044 .Case("n64", "64")
1045 .Default(ABI);
1046}
1047
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001048// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1049// and -mfloat-abi=.
1050static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001051 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001052 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001053 options::OPT_mhard_float,
1054 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001055 if (A->getOption().matches(options::OPT_msoft_float))
1056 FloatABI = "soft";
1057 else if (A->getOption().matches(options::OPT_mhard_float))
1058 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001059 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001060 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001061 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001062 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001063 FloatABI = "hard";
1064 }
1065 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001066 }
1067
1068 // If unspecified, choose the default based on the platform.
1069 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001070 // Assume "hard", because it's a default value used by gcc.
1071 // When we start to recognize specific target MIPS processors,
1072 // we will be able to select the default more correctly.
1073 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001074 }
1075
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001076 return FloatABI;
1077}
1078
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001079static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001080 std::vector<const char *> &Features,
1081 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001082 StringRef FeatureName) {
1083 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001084 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001085 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001086 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001087 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001088 }
1089}
1090
Daniel Sanders379d44b2014-07-16 11:52:23 +00001091static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1092 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001093 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001094 StringRef CPUName;
1095 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001096 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001097 ABIName = getGnuCompatibleMipsABIName(ABIName);
1098
Daniel Sandersfeb61302014-08-08 15:47:17 +00001099 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1100 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001101
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001102 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001103 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001104 // FIXME: Note, this is a hack. We need to pass the selected float
1105 // mode to the MipsTargetInfoBase to define appropriate macros there.
1106 // Now it is the only method.
1107 Features.push_back("+soft-float");
1108 }
1109
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001110 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001111 StringRef Val = StringRef(A->getValue());
1112 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001113 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001114 else if (Val == "legacy")
1115 Features.push_back("-nan2008");
1116 else
1117 D.Diag(diag::err_drv_unsupported_option_argument)
1118 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001119 }
1120
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001121 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1122 options::OPT_mdouble_float, "single-float");
1123 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1124 "mips16");
1125 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1126 options::OPT_mno_micromips, "micromips");
1127 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1128 "dsp");
1129 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1130 "dspr2");
1131 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1132 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001133
1134 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1135 // pass -mfpxx
1136 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1137 options::OPT_mfp64)) {
1138 if (A->getOption().matches(options::OPT_mfp32))
1139 Features.push_back(Args.MakeArgString("-fp64"));
1140 else if (A->getOption().matches(options::OPT_mfpxx)) {
1141 Features.push_back(Args.MakeArgString("+fpxx"));
1142 Features.push_back(Args.MakeArgString("+nooddspreg"));
1143 } else
1144 Features.push_back(Args.MakeArgString("+fp64"));
1145 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001146 Features.push_back(Args.MakeArgString("+fpxx"));
1147 Features.push_back(Args.MakeArgString("+nooddspreg"));
1148 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001149
Daniel Sanders28e5d392014-07-10 10:39:51 +00001150 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1151 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001152}
1153
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001154void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001155 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001156 const Driver &D = getToolChain().getDriver();
1157 StringRef CPUName;
1158 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001159 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001160 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001161
1162 CmdArgs.push_back("-target-abi");
1163 CmdArgs.push_back(ABIName.data());
1164
1165 StringRef FloatABI = getMipsFloatABI(D, Args);
1166
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001167 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001168 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001169 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001170 CmdArgs.push_back("-mfloat-abi");
1171 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001172 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001173 else {
1174 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001175 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001176 CmdArgs.push_back("-mfloat-abi");
1177 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001178 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001179
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001180 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1181 if (A->getOption().matches(options::OPT_mxgot)) {
1182 CmdArgs.push_back("-mllvm");
1183 CmdArgs.push_back("-mxgot");
1184 }
1185 }
1186
Simon Atanasyanc580b322013-05-11 06:33:44 +00001187 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1188 options::OPT_mno_ldc1_sdc1)) {
1189 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1190 CmdArgs.push_back("-mllvm");
1191 CmdArgs.push_back("-mno-ldc1-sdc1");
1192 }
1193 }
1194
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001195 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1196 options::OPT_mno_check_zero_division)) {
1197 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1198 CmdArgs.push_back("-mllvm");
1199 CmdArgs.push_back("-mno-check-zero-division");
1200 }
1201 }
1202
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001203 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001204 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001205 CmdArgs.push_back("-mllvm");
1206 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1207 A->claim();
1208 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001209}
1210
Hal Finkel8eb59282012-06-11 22:35:19 +00001211/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1212static std::string getPPCTargetCPU(const ArgList &Args) {
1213 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001214 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001215
1216 if (CPUName == "native") {
1217 std::string CPU = llvm::sys::getHostCPUName();
1218 if (!CPU.empty() && CPU != "generic")
1219 return CPU;
1220 else
1221 return "";
1222 }
1223
1224 return llvm::StringSwitch<const char *>(CPUName)
1225 .Case("common", "generic")
1226 .Case("440", "440")
1227 .Case("440fp", "440")
1228 .Case("450", "450")
1229 .Case("601", "601")
1230 .Case("602", "602")
1231 .Case("603", "603")
1232 .Case("603e", "603e")
1233 .Case("603ev", "603ev")
1234 .Case("604", "604")
1235 .Case("604e", "604e")
1236 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001237 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001238 .Case("G3", "g3")
1239 .Case("7400", "7400")
1240 .Case("G4", "g4")
1241 .Case("7450", "7450")
1242 .Case("G4+", "g4+")
1243 .Case("750", "750")
1244 .Case("970", "970")
1245 .Case("G5", "g5")
1246 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001247 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001248 .Case("e500mc", "e500mc")
1249 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001250 .Case("power3", "pwr3")
1251 .Case("power4", "pwr4")
1252 .Case("power5", "pwr5")
1253 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001254 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001255 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001256 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001257 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001258 .Case("pwr3", "pwr3")
1259 .Case("pwr4", "pwr4")
1260 .Case("pwr5", "pwr5")
1261 .Case("pwr5x", "pwr5x")
1262 .Case("pwr6", "pwr6")
1263 .Case("pwr6x", "pwr6x")
1264 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001265 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001266 .Case("powerpc", "ppc")
1267 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001268 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001269 .Default("");
1270 }
1271
1272 return "";
1273}
1274
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001275static void getPPCTargetFeatures(const ArgList &Args,
1276 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001277 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1278 ie = Args.filtered_end();
1279 it != ie; ++it) {
1280 StringRef Name = (*it)->getOption().getName();
1281 (*it)->claim();
1282
1283 // Skip over "-m".
1284 assert(Name.startswith("m") && "Invalid feature name.");
1285 Name = Name.substr(1);
1286
1287 bool IsNegative = Name.startswith("no-");
1288 if (IsNegative)
1289 Name = Name.substr(3);
1290
1291 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1292 // pass the correct option to the backend while calling the frontend
1293 // option the same.
1294 // TODO: Change the LLVM backend option maybe?
1295 if (Name == "mfcrf")
1296 Name = "mfocrf";
1297
1298 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1299 }
1300
1301 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001302 AddTargetFeature(Args, Features, options::OPT_faltivec,
1303 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001304}
1305
Ulrich Weigand8afad612014-07-28 13:17:52 +00001306void Clang::AddPPCTargetArgs(const ArgList &Args,
1307 ArgStringList &CmdArgs) const {
1308 // Select the ABI to use.
1309 const char *ABIName = nullptr;
1310 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1311 ABIName = A->getValue();
1312 } else if (getToolChain().getTriple().isOSLinux())
1313 switch(getToolChain().getArch()) {
1314 case llvm::Triple::ppc64:
1315 ABIName = "elfv1";
1316 break;
1317 case llvm::Triple::ppc64le:
1318 ABIName = "elfv2";
1319 break;
1320 default:
1321 break;
1322 }
1323
1324 if (ABIName) {
1325 CmdArgs.push_back("-target-abi");
1326 CmdArgs.push_back(ABIName);
1327 }
1328}
1329
1330bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1331 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1332 return A && (A->getValue() == StringRef(Value));
1333}
1334
Tom Stellard6674c702013-04-01 20:56:53 +00001335/// Get the (LLVM) name of the R600 gpu we are targeting.
1336static std::string getR600TargetGPU(const ArgList &Args) {
1337 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001338 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001339 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001340 .Cases("rv630", "rv635", "r600")
1341 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001342 .Case("rv740", "rv770")
1343 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001344 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001345 .Case("hemlock", "cypress")
1346 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001347 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001348 }
1349 return "";
1350}
1351
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001352static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001353 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001354 bool SoftFloatABI = true;
1355 if (Arg *A =
1356 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1357 if (A->getOption().matches(options::OPT_mhard_float))
1358 SoftFloatABI = false;
1359 }
1360 if (SoftFloatABI)
1361 Features.push_back("+soft-float");
1362}
1363
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001364void Clang::AddSparcTargetArgs(const ArgList &Args,
1365 ArgStringList &CmdArgs) const {
1366 const Driver &D = getToolChain().getDriver();
1367
Brad Smith10cd0f42014-07-11 20:12:08 +00001368 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001369 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001370 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1371 options::OPT_mhard_float)) {
1372 if (A->getOption().matches(options::OPT_msoft_float))
1373 FloatABI = "soft";
1374 else if (A->getOption().matches(options::OPT_mhard_float))
1375 FloatABI = "hard";
1376 }
1377
1378 // If unspecified, choose the default based on the platform.
1379 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001380 // Assume "soft", but warn the user we are guessing.
1381 FloatABI = "soft";
1382 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001383 }
1384
1385 if (FloatABI == "soft") {
1386 // Floating point operations and argument passing are soft.
1387 //
1388 // FIXME: This changes CPP defines, we need -target-soft-float.
1389 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001390 } else {
1391 assert(FloatABI == "hard" && "Invalid float abi!");
1392 CmdArgs.push_back("-mhard-float");
1393 }
1394}
1395
Richard Sandiford4652d892013-07-19 16:51:51 +00001396static const char *getSystemZTargetCPU(const ArgList &Args) {
1397 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1398 return A->getValue();
1399 return "z10";
1400}
1401
Chandler Carruth953fb082013-01-13 11:46:33 +00001402static const char *getX86TargetCPU(const ArgList &Args,
1403 const llvm::Triple &Triple) {
1404 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001405 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001406 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001407 return "core-avx2";
1408
Chandler Carruth953fb082013-01-13 11:46:33 +00001409 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001410 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001411
1412 // FIXME: Reject attempts to use -march=native unless the target matches
1413 // the host.
1414 //
1415 // FIXME: We should also incorporate the detected target features for use
1416 // with -native.
1417 std::string CPU = llvm::sys::getHostCPUName();
1418 if (!CPU.empty() && CPU != "generic")
1419 return Args.MakeArgString(CPU);
1420 }
1421
1422 // Select the default CPU if none was given (or detection failed).
1423
1424 if (Triple.getArch() != llvm::Triple::x86_64 &&
1425 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001426 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001427
1428 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1429
1430 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001431 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001432 if (Triple.getArchName() == "x86_64h")
1433 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001434 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001435 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001436
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001437 // Set up default CPU name for PS4 compilers.
1438 if (Triple.isPS4CPU())
1439 return "btver2";
1440
Alexey Bataev286d1b92014-01-31 04:07:13 +00001441 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001442 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001443 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001444
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001445 // Everything else goes to x86-64 in 64-bit mode.
1446 if (Is64Bit)
1447 return "x86-64";
1448
1449 switch (Triple.getOS()) {
1450 case llvm::Triple::FreeBSD:
1451 case llvm::Triple::NetBSD:
1452 case llvm::Triple::OpenBSD:
1453 return "i486";
1454 case llvm::Triple::Haiku:
1455 return "i586";
1456 case llvm::Triple::Bitrig:
1457 return "i686";
1458 default:
1459 // Fallback to p4.
1460 return "pentium4";
1461 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001462}
1463
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001464static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1465 switch(T.getArch()) {
1466 default:
1467 return "";
1468
Amara Emerson703da2e2013-10-31 09:32:33 +00001469 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001470 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001471 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001472
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001473 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001474 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001475 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001476 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001477 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001478
1479 case llvm::Triple::mips:
1480 case llvm::Triple::mipsel:
1481 case llvm::Triple::mips64:
1482 case llvm::Triple::mips64el: {
1483 StringRef CPUName;
1484 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001485 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001486 return CPUName;
1487 }
1488
1489 case llvm::Triple::ppc:
1490 case llvm::Triple::ppc64:
1491 case llvm::Triple::ppc64le: {
1492 std::string TargetCPUName = getPPCTargetCPU(Args);
1493 // LLVM may default to generating code for the native CPU,
1494 // but, like gcc, we default to a more generic option for
1495 // each architecture. (except on Darwin)
1496 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1497 if (T.getArch() == llvm::Triple::ppc64)
1498 TargetCPUName = "ppc64";
1499 else if (T.getArch() == llvm::Triple::ppc64le)
1500 TargetCPUName = "ppc64le";
1501 else
1502 TargetCPUName = "ppc";
1503 }
1504 return TargetCPUName;
1505 }
1506
1507 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001508 case llvm::Triple::sparcv9:
1509 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001510 return A->getValue();
1511 return "";
1512
1513 case llvm::Triple::x86:
1514 case llvm::Triple::x86_64:
1515 return getX86TargetCPU(Args, T);
1516
1517 case llvm::Triple::hexagon:
1518 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1519
1520 case llvm::Triple::systemz:
1521 return getSystemZTargetCPU(Args);
1522
1523 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001524 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001525 return getR600TargetGPU(Args);
1526 }
1527}
1528
Alp Tokerce365ca2013-12-02 12:43:03 +00001529static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1530 ArgStringList &CmdArgs) {
1531 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1532 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1533 // forward.
1534 CmdArgs.push_back("-plugin");
Rafael Espindola3e34e652015-02-03 16:33:53 +00001535 std::string Plugin = ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001536 CmdArgs.push_back(Args.MakeArgString(Plugin));
1537
1538 // Try to pass driver level flags relevant to LTO code generation down to
1539 // the plugin.
1540
1541 // Handle flags for selecting CPU variants.
1542 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1543 if (!CPU.empty())
1544 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1545}
1546
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001547static void getX86TargetFeatures(const Driver & D,
1548 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001549 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001550 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001551 if (Triple.getArchName() == "x86_64h") {
1552 // x86_64h implies quite a few of the more modern subtarget features
1553 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1554 Features.push_back("-rdrnd");
1555 Features.push_back("-aes");
1556 Features.push_back("-pclmul");
1557 Features.push_back("-rtm");
1558 Features.push_back("-hle");
1559 Features.push_back("-fsgsbase");
1560 }
1561
Alexey Volkov54ff0802014-06-25 12:15:36 +00001562 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001563 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001564 if (Triple.getArch() == llvm::Triple::x86_64) {
1565 Features.push_back("+sse4.2");
1566 Features.push_back("+popcnt");
1567 } else
1568 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001569 }
1570
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001571 // Set features according to the -arch flag on MSVC
1572 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1573 StringRef Arch = A->getValue();
1574 bool ArchUsed = false;
1575 // First, look for flags that are shared in x86 and x86-64.
1576 if (Triple.getArch() == llvm::Triple::x86_64 ||
1577 Triple.getArch() == llvm::Triple::x86) {
1578 if (Arch == "AVX" || Arch == "AVX2") {
1579 ArchUsed = true;
1580 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1581 }
1582 }
1583 // Then, look for x86-specific flags.
1584 if (Triple.getArch() == llvm::Triple::x86) {
1585 if (Arch == "IA32") {
1586 ArchUsed = true;
1587 } else if (Arch == "SSE" || Arch == "SSE2") {
1588 ArchUsed = true;
1589 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1590 }
1591 }
1592 if (!ArchUsed)
1593 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1594 }
1595
Jim Grosbach82eee262013-11-16 00:53:35 +00001596 // Now add any that the user explicitly requested on the command line,
1597 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001598 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1599 ie = Args.filtered_end();
1600 it != ie; ++it) {
1601 StringRef Name = (*it)->getOption().getName();
1602 (*it)->claim();
1603
1604 // Skip over "-m".
1605 assert(Name.startswith("m") && "Invalid feature name.");
1606 Name = Name.substr(1);
1607
1608 bool IsNegative = Name.startswith("no-");
1609 if (IsNegative)
1610 Name = Name.substr(3);
1611
1612 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1613 }
1614}
1615
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001616void Clang::AddX86TargetArgs(const ArgList &Args,
1617 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001618 if (!Args.hasFlag(options::OPT_mred_zone,
1619 options::OPT_mno_red_zone,
1620 true) ||
1621 Args.hasArg(options::OPT_mkernel) ||
1622 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001623 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001624
Bob Wilson2616e2e2013-02-10 16:01:41 +00001625 // Default to avoid implicit floating-point for kernel/kext code, but allow
1626 // that to be overridden with -mno-soft-float.
1627 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1628 Args.hasArg(options::OPT_fapple_kext));
1629 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1630 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001631 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001632 options::OPT_mno_implicit_float)) {
1633 const Option &O = A->getOption();
1634 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1635 O.matches(options::OPT_msoft_float));
1636 }
1637 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001638 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001639
1640 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1641 StringRef Value = A->getValue();
1642 if (Value == "intel" || Value == "att") {
1643 CmdArgs.push_back("-mllvm");
1644 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1645 } else {
1646 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1647 << A->getOption().getName() << Value;
1648 }
1649 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001650}
1651
Matthew Curtise8f80a12012-12-06 17:49:03 +00001652static inline bool HasPICArg(const ArgList &Args) {
1653 return Args.hasArg(options::OPT_fPIC)
1654 || Args.hasArg(options::OPT_fpic);
1655}
1656
1657static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1658 return Args.getLastArg(options::OPT_G,
1659 options::OPT_G_EQ,
1660 options::OPT_msmall_data_threshold_EQ);
1661}
1662
1663static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1664 std::string value;
1665 if (HasPICArg(Args))
1666 value = "0";
1667 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1668 value = A->getValue();
1669 A->claim();
1670 }
1671 return value;
1672}
1673
Tony Linthicum76329bf2011-12-12 21:14:55 +00001674void Clang::AddHexagonTargetArgs(const ArgList &Args,
1675 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001676 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001677 CmdArgs.push_back("-mqdsp6-compat");
1678 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001679
Matthew Curtise8f80a12012-12-06 17:49:03 +00001680 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1681 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001682 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001683 CmdArgs.push_back(Args.MakeArgString(
1684 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001685 }
1686
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001687 if (!Args.hasArg(options::OPT_fno_short_enums))
1688 CmdArgs.push_back("-fshort-enums");
1689 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1690 CmdArgs.push_back ("-mllvm");
1691 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1692 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001693 CmdArgs.push_back ("-mllvm");
1694 CmdArgs.push_back ("-machine-sink-split=0");
1695}
1696
Kevin Qin110db6f2014-07-18 07:03:22 +00001697// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001698static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001699 std::vector<const char *> &Features) {
1700 SmallVector<StringRef, 8> Split;
1701 text.split(Split, StringRef("+"), -1, false);
1702
1703 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1704 const char *result = llvm::StringSwitch<const char *>(Split[I])
1705 .Case("fp", "+fp-armv8")
1706 .Case("simd", "+neon")
1707 .Case("crc", "+crc")
1708 .Case("crypto", "+crypto")
1709 .Case("nofp", "-fp-armv8")
1710 .Case("nosimd", "-neon")
1711 .Case("nocrc", "-crc")
1712 .Case("nocrypto", "-crypto")
1713 .Default(nullptr);
1714 if (result)
1715 Features.push_back(result);
1716 else if (Split[I] == "neon" || Split[I] == "noneon")
1717 D.Diag(diag::err_drv_no_neon_modifier);
1718 else
1719 return false;
1720 }
1721 return true;
1722}
1723
1724// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1725// decode CPU and feature.
1726static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1727 std::vector<const char *> &Features) {
1728 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1729 CPU = Split.first;
1730 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1731 Features.push_back("+neon");
1732 Features.push_back("+crc");
1733 Features.push_back("+crypto");
1734 } else if (CPU == "generic") {
1735 Features.push_back("+neon");
1736 } else {
1737 return false;
1738 }
1739
1740 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1741 return false;
1742
1743 return true;
1744}
1745
1746static bool
1747getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1748 const ArgList &Args,
1749 std::vector<const char *> &Features) {
1750 std::pair<StringRef, StringRef> Split = March.split("+");
1751 if (Split.first != "armv8-a")
1752 return false;
1753
1754 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1755 return false;
1756
1757 return true;
1758}
1759
1760static bool
1761getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1762 const ArgList &Args,
1763 std::vector<const char *> &Features) {
1764 StringRef CPU;
1765 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1766 return false;
1767
1768 return true;
1769}
1770
1771static bool
1772getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1773 const ArgList &Args,
1774 std::vector<const char *> &Features) {
1775 // Handle CPU name is 'native'.
1776 if (Mtune == "native")
1777 Mtune = llvm::sys::getHostCPUName();
1778 if (Mtune == "cyclone") {
1779 Features.push_back("+zcm");
1780 Features.push_back("+zcz");
1781 }
1782 return true;
1783}
1784
1785static bool
1786getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1787 const ArgList &Args,
1788 std::vector<const char *> &Features) {
1789 StringRef CPU;
1790 std::vector<const char *> DecodedFeature;
1791 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1792 return false;
1793
1794 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1795}
1796
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001797static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1798 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001799 Arg *A;
1800 bool success = true;
1801 // Enable NEON by default.
1802 Features.push_back("+neon");
1803 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1804 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1805 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1806 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001807 else if (Args.hasArg(options::OPT_arch))
1808 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1809 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001810
1811 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1812 success =
1813 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1814 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1815 success =
1816 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001817 else if (Args.hasArg(options::OPT_arch))
1818 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1819 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001820
1821 if (!success)
1822 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001823
1824 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1825 Features.push_back("-fp-armv8");
1826 Features.push_back("-crypto");
1827 Features.push_back("-neon");
1828 }
Bradley Smith418c5932014-05-02 15:17:51 +00001829
1830 // En/disable crc
1831 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1832 options::OPT_mnocrc)) {
1833 if (A->getOption().matches(options::OPT_mcrc))
1834 Features.push_back("+crc");
1835 else
1836 Features.push_back("-crc");
1837 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001838}
1839
1840static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001841 const ArgList &Args, ArgStringList &CmdArgs,
1842 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001843 std::vector<const char *> Features;
1844 switch (Triple.getArch()) {
1845 default:
1846 break;
1847 case llvm::Triple::mips:
1848 case llvm::Triple::mipsel:
1849 case llvm::Triple::mips64:
1850 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001851 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001852 break;
1853
1854 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001855 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001856 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001857 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001858 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001859 break;
1860
1861 case llvm::Triple::ppc:
1862 case llvm::Triple::ppc64:
1863 case llvm::Triple::ppc64le:
1864 getPPCTargetFeatures(Args, Features);
1865 break;
1866 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001867 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001868 getSparcTargetFeatures(Args, Features);
1869 break;
1870 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001871 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001872 getAArch64TargetFeatures(D, Args, Features);
1873 break;
1874 case llvm::Triple::x86:
1875 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001876 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001877 break;
1878 }
Rafael Espindola43964802013-08-21 17:34:32 +00001879
1880 // Find the last of each feature.
1881 llvm::StringMap<unsigned> LastOpt;
1882 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1883 const char *Name = Features[I];
1884 assert(Name[0] == '-' || Name[0] == '+');
1885 LastOpt[Name + 1] = I;
1886 }
1887
1888 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1889 // If this feature was overridden, ignore it.
1890 const char *Name = Features[I];
1891 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1892 assert(LastI != LastOpt.end());
1893 unsigned Last = LastI->second;
1894 if (Last != I)
1895 continue;
1896
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001897 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001898 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001899 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001900}
1901
David Majnemerae394812014-12-09 00:12:30 +00001902static bool
1903shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1904 const llvm::Triple &Triple) {
1905 // We use the zero-cost exception tables for Objective-C if the non-fragile
1906 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1907 // later.
1908 if (runtime.isNonFragile())
1909 return true;
1910
1911 if (!Triple.isMacOSX())
1912 return false;
1913
1914 return (!Triple.isMacOSXVersionLT(10,5) &&
1915 (Triple.getArch() == llvm::Triple::x86_64 ||
1916 Triple.getArch() == llvm::Triple::arm));
1917}
1918
Nico Webere8e53112014-05-11 01:04:02 +00001919// exceptionSettings() exists to share the logic between -cc1 and linker
1920// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001921static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001922 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001923 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001924 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001925 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001926
David Majnemer8de68642014-12-05 08:11:58 +00001927 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001928}
1929
Anders Carlssone96ab552011-02-28 02:27:16 +00001930/// addExceptionArgs - Adds exception related arguments to the driver command
1931/// arguments. There's a master flag, -fexceptions and also language specific
1932/// flags to enable/disable C++ and Objective-C exceptions.
1933/// This makes it possible to for example disable C++ exceptions but enable
1934/// Objective-C exceptions.
1935static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1936 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001937 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001938 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001939 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001940 if (KernelOrKext) {
1941 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1942 // arguments now to avoid warnings about unused arguments.
1943 Args.ClaimAllArgs(options::OPT_fexceptions);
1944 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1945 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1946 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1947 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1948 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001949 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001950 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001951
David Majnemer8de68642014-12-05 08:11:58 +00001952 // Gather the exception settings from the command line arguments.
1953 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001954
David Majnemerae394812014-12-09 00:12:30 +00001955 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1956 // is not necessarily sensible, but follows GCC.
1957 if (types::isObjC(InputType) &&
1958 Args.hasFlag(options::OPT_fobjc_exceptions,
1959 options::OPT_fno_objc_exceptions,
1960 true)) {
1961 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001962
David Majnemerae394812014-12-09 00:12:30 +00001963 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001964 }
1965
1966 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001967 bool CXXExceptionsEnabled =
1968 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Eric Christopher84fbdb42011-08-19 00:30:14 +00001969 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1970 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001971 options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001972 options::OPT_fno_exceptions))
1973 CXXExceptionsEnabled =
1974 A->getOption().matches(options::OPT_fcxx_exceptions) ||
1975 A->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001976
1977 if (CXXExceptionsEnabled) {
1978 CmdArgs.push_back("-fcxx-exceptions");
1979
David Majnemer8de68642014-12-05 08:11:58 +00001980 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001981 }
1982 }
1983
David Majnemer8de68642014-12-05 08:11:58 +00001984 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00001985 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001986}
1987
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001988static bool ShouldDisableAutolink(const ArgList &Args,
1989 const ToolChain &TC) {
1990 bool Default = true;
1991 if (TC.getTriple().isOSDarwin()) {
1992 // The native darwin assembler doesn't support the linker_option directives,
1993 // so we disable them if we think the .s file will be passed to it.
1994 Default = TC.useIntegratedAs();
1995 }
1996 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1997 Default);
1998}
1999
Ted Kremenek62093662013-03-12 17:02:12 +00002000static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2001 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002002 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2003 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002004 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002005 return !UseDwarfDirectory;
2006}
2007
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002008/// \brief Check whether the given input tree contains any compilation actions.
2009static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002010 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002011 return true;
2012
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002013 for (const auto &Act : *A)
2014 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002015 return true;
2016
2017 return false;
2018}
2019
2020/// \brief Check if -relax-all should be passed to the internal assembler.
2021/// This is done by default when compiling non-assembler source with -O0.
2022static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2023 bool RelaxDefault = true;
2024
2025 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2026 RelaxDefault = A->getOption().matches(options::OPT_O0);
2027
2028 if (RelaxDefault) {
2029 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002030 for (const auto &Act : C.getActions()) {
2031 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002032 RelaxDefault = true;
2033 break;
2034 }
2035 }
2036 }
2037
2038 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2039 RelaxDefault);
2040}
2041
David Blaikie9260ed62013-07-25 21:19:01 +00002042static void CollectArgsForIntegratedAssembler(Compilation &C,
2043 const ArgList &Args,
2044 ArgStringList &CmdArgs,
2045 const Driver &D) {
2046 if (UseRelaxAll(C, Args))
2047 CmdArgs.push_back("-mrelax-all");
2048
David Peixottodfb66142013-11-14 22:52:58 +00002049 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002050 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002051 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2052 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2053 // arg after parsing the '-I' arg.
2054 bool TakeNextArg = false;
2055
David Blaikie9260ed62013-07-25 21:19:01 +00002056 // When using an integrated assembler, translate -Wa, and -Xassembler
2057 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002058 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002059 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2060 options::OPT_Xassembler),
2061 ie = Args.filtered_end(); it != ie; ++it) {
2062 const Arg *A = *it;
2063 A->claim();
2064
2065 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2066 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002067 if (TakeNextArg) {
2068 CmdArgs.push_back(Value.data());
2069 TakeNextArg = false;
2070 continue;
2071 }
David Blaikie9260ed62013-07-25 21:19:01 +00002072
2073 if (Value == "-force_cpusubtype_ALL") {
2074 // Do nothing, this is the default and we don't support anything else.
2075 } else if (Value == "-L") {
2076 CmdArgs.push_back("-msave-temp-labels");
2077 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002078 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002079 } else if (Value == "--noexecstack") {
2080 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002081 } else if (Value == "-compress-debug-sections" ||
2082 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002083 CompressDebugSections = true;
2084 } else if (Value == "-nocompress-debug-sections" ||
2085 Value == "--nocompress-debug-sections") {
2086 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002087 } else if (Value.startswith("-I")) {
2088 CmdArgs.push_back(Value.data());
2089 // We need to consume the next argument if the current arg is a plain
2090 // -I. The next arg will be the include directory.
2091 if (Value == "-I")
2092 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002093 } else if (Value.startswith("-gdwarf-")) {
2094 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002095 } else {
2096 D.Diag(diag::err_drv_unsupported_option_argument)
2097 << A->getOption().getName() << Value;
2098 }
2099 }
2100 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002101 if (CompressDebugSections) {
2102 if (llvm::zlib::isAvailable())
2103 CmdArgs.push_back("-compress-debug-sections");
2104 else
2105 D.Diag(diag::warn_debug_compression_unavailable);
2106 }
David Blaikie9260ed62013-07-25 21:19:01 +00002107}
2108
Renato Goline807c122014-01-31 11:47:28 +00002109// Until ARM libraries are build separately, we have them all in one library
2110static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002111 // FIXME: handle 64-bit
2112 if (TC.getTriple().isOSWindows() &&
2113 !TC.getTriple().isWindowsItaniumEnvironment())
2114 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002115 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002116 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002117 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002118}
2119
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002120static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2121 // The runtimes are located in the OS-specific resource directory.
2122 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002123 const llvm::Triple &Triple = TC.getTriple();
2124 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002125 StringRef OSLibName =
2126 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002127 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002128 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002129}
2130
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002131static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002132 bool Shared = false) {
2133 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2134 ? "-android"
2135 : "";
2136
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002137 bool IsOSWindows = TC.getTriple().isOSWindows();
2138 StringRef Arch = getArchNameForCompilerRTLib(TC);
2139 const char *Prefix = IsOSWindows ? "" : "lib";
2140 const char *Suffix =
2141 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2142
2143 SmallString<128> Path = getCompilerRTLibDir(TC);
2144 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2145 Arch + Env + Suffix);
2146
2147 return Path;
2148}
2149
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002150// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002151// FIXME: Make sure we can also emit shared objects if they're requested
2152// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002153static void addClangRT(const ToolChain &TC, const ArgList &Args,
2154 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002155 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002156
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002157 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002158 // FIXME: why do we link against gcc when we are using compiler-rt?
2159 CmdArgs.push_back("-lgcc_s");
2160 if (TC.getDriver().CCCIsCXX())
2161 CmdArgs.push_back("-lgcc_eh");
2162 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002163}
2164
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002165static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2166 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002167 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2168 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002169 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002170 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002171 Args.hasArg(options::OPT_fcreate_profile) ||
2172 Args.hasArg(options::OPT_coverage)))
2173 return;
2174
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002175 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002176}
2177
Alexey Samsonov52550342014-09-15 19:58:40 +00002178static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2179 ArgStringList &CmdArgs, StringRef Sanitizer,
2180 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002181 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002182 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002183 if (!IsShared)
2184 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002185 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002186 if (!IsShared)
2187 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002188}
2189
Alexey Samsonov52550342014-09-15 19:58:40 +00002190// Tries to use a file with the list of dynamic symbols that need to be exported
2191// from the runtime library. Returns true if the file was found.
2192static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2193 ArgStringList &CmdArgs,
2194 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002195 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2196 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2197 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002198 return true;
2199 }
2200 return false;
2201}
2202
2203static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2204 ArgStringList &CmdArgs) {
2205 // Force linking against the system libraries sanitizers depends on
2206 // (see PR15823 why this is necessary).
2207 CmdArgs.push_back("--no-as-needed");
2208 CmdArgs.push_back("-lpthread");
2209 CmdArgs.push_back("-lrt");
2210 CmdArgs.push_back("-lm");
2211 // There's no libdl on FreeBSD.
2212 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2213 CmdArgs.push_back("-ldl");
2214}
2215
2216static void
2217collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2218 SmallVectorImpl<StringRef> &SharedRuntimes,
2219 SmallVectorImpl<StringRef> &StaticRuntimes,
2220 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2221 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2222 // Collect shared runtimes.
2223 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2224 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002225 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002226
Alexey Samsonov52550342014-09-15 19:58:40 +00002227 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002228 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002229 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2230 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002231 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002232 }
2233 if (SanArgs.needsAsanRt()) {
2234 if (SanArgs.needsSharedAsanRt()) {
2235 HelperStaticRuntimes.push_back("asan-preinit");
2236 } else {
2237 StaticRuntimes.push_back("asan");
2238 if (SanArgs.linkCXXRuntimes())
2239 StaticRuntimes.push_back("asan_cxx");
2240 }
2241 }
2242 if (SanArgs.needsDfsanRt())
2243 StaticRuntimes.push_back("dfsan");
2244 if (SanArgs.needsLsanRt())
2245 StaticRuntimes.push_back("lsan");
2246 if (SanArgs.needsMsanRt())
2247 StaticRuntimes.push_back("msan");
2248 if (SanArgs.needsTsanRt())
2249 StaticRuntimes.push_back("tsan");
2250 // WARNING: UBSan should always go last.
2251 if (SanArgs.needsUbsanRt()) {
2252 // If UBSan is not combined with another sanitizer, we need to pull in
2253 // sanitizer_common explicitly.
2254 if (StaticRuntimes.empty())
2255 HelperStaticRuntimes.push_back("san");
2256 StaticRuntimes.push_back("ubsan");
2257 if (SanArgs.linkCXXRuntimes())
2258 StaticRuntimes.push_back("ubsan_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002259 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002260}
2261
Alexey Samsonov52550342014-09-15 19:58:40 +00002262// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2263// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2264static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002265 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002266 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2267 HelperStaticRuntimes;
2268 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2269 HelperStaticRuntimes);
2270 for (auto RT : SharedRuntimes)
2271 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2272 for (auto RT : HelperStaticRuntimes)
2273 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2274 bool AddExportDynamic = false;
2275 for (auto RT : StaticRuntimes) {
2276 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2277 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2278 }
2279 // If there is a static runtime with no dynamic list, force all the symbols
2280 // to be dynamic to be sure we export sanitizer interface functions.
2281 if (AddExportDynamic)
2282 CmdArgs.push_back("-export-dynamic");
2283 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002284}
2285
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002286static bool shouldUseFramePointerForTarget(const ArgList &Args,
2287 const llvm::Triple &Triple) {
2288 switch (Triple.getArch()) {
2289 // Don't use a frame pointer on linux if optimizing for certain targets.
2290 case llvm::Triple::mips64:
2291 case llvm::Triple::mips64el:
2292 case llvm::Triple::mips:
2293 case llvm::Triple::mipsel:
2294 case llvm::Triple::systemz:
2295 case llvm::Triple::x86:
2296 case llvm::Triple::x86_64:
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002297 if (Triple.isOSLinux())
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002298 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2299 if (!A->getOption().matches(options::OPT_O0))
2300 return false;
2301 return true;
2302 case llvm::Triple::xcore:
2303 return false;
2304 default:
2305 return true;
2306 }
2307}
2308
Rafael Espindola224dd632011-12-14 21:02:23 +00002309static bool shouldUseFramePointer(const ArgList &Args,
2310 const llvm::Triple &Triple) {
2311 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2312 options::OPT_fomit_frame_pointer))
2313 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2314
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002315 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002316}
2317
Eric Christopherb7d97e92013-04-03 01:58:53 +00002318static bool shouldUseLeafFramePointer(const ArgList &Args,
2319 const llvm::Triple &Triple) {
2320 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2321 options::OPT_momit_leaf_frame_pointer))
2322 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2323
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002324 if (Triple.isPS4CPU())
2325 return false;
2326
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002327 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002328}
2329
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002330/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002331static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002332 SmallString<128> cwd;
2333 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002334 CmdArgs.push_back("-fdebug-compilation-dir");
2335 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002336 }
2337}
2338
Eric Christopherd3804002013-02-22 20:12:52 +00002339static const char *SplitDebugName(const ArgList &Args,
2340 const InputInfoList &Inputs) {
2341 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2342 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2343 SmallString<128> T(FinalOutput->getValue());
2344 llvm::sys::path::replace_extension(T, "dwo");
2345 return Args.MakeArgString(T);
2346 } else {
2347 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002348 SmallString<128> T(
2349 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002350 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2351 llvm::sys::path::replace_extension(F, "dwo");
2352 T += F;
2353 return Args.MakeArgString(F);
2354 }
2355}
2356
2357static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2358 const Tool &T, const JobAction &JA,
2359 const ArgList &Args, const InputInfo &Output,
2360 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002361 ArgStringList ExtractArgs;
2362 ExtractArgs.push_back("--extract-dwo");
2363
2364 ArgStringList StripArgs;
2365 StripArgs.push_back("--strip-dwo");
2366
2367 // Grabbing the output of the earlier compile step.
2368 StripArgs.push_back(Output.getFilename());
2369 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002370 ExtractArgs.push_back(OutFile);
2371
2372 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002373 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002374
2375 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002376 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002377
2378 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002379 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002380}
2381
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002382/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002383/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2384static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002385 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002386 if (A->getOption().matches(options::OPT_O4) ||
2387 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002388 return true;
2389
2390 if (A->getOption().matches(options::OPT_O0))
2391 return false;
2392
2393 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2394
Rafael Espindola91780de2013-08-26 14:05:41 +00002395 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002396 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002397 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002398 return true;
2399
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002400 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002401 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002402 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002403
2404 unsigned OptLevel = 0;
2405 if (S.getAsInteger(10, OptLevel))
2406 return false;
2407
2408 return OptLevel > 1;
2409 }
2410
2411 return false;
2412}
2413
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002414/// Add -x lang to \p CmdArgs for \p Input.
2415static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2416 ArgStringList &CmdArgs) {
2417 // When using -verify-pch, we don't want to provide the type
2418 // 'precompiled-header' if it was inferred from the file extension
2419 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2420 return;
2421
2422 CmdArgs.push_back("-x");
2423 if (Args.hasArg(options::OPT_rewrite_objc))
2424 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2425 else
2426 CmdArgs.push_back(types::getTypeName(Input.getType()));
2427}
2428
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002429static std::string getMSCompatibilityVersion(const char *VersionStr) {
2430 unsigned Version;
2431 if (StringRef(VersionStr).getAsInteger(10, Version))
2432 return "0";
2433
2434 if (Version < 100)
2435 return llvm::utostr_32(Version) + ".0";
2436
2437 if (Version < 10000)
2438 return llvm::utostr_32(Version / 100) + "." +
2439 llvm::utostr_32(Version % 100);
2440
2441 unsigned Build = 0, Factor = 1;
2442 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2443 Build = Build + (Version % 10) * Factor;
2444 return llvm::utostr_32(Version / 100) + "." +
2445 llvm::utostr_32(Version % 100) + "." +
2446 llvm::utostr_32(Build);
2447}
2448
Rafael Espindola577637a2015-01-03 00:06:04 +00002449// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002450// options that build systems might add but are unused when assembling or only
2451// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002452static void claimNoWarnArgs(const ArgList &Args) {
2453 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002454 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002455 Args.ClaimAllArgs(options::OPT_flto);
2456 Args.ClaimAllArgs(options::OPT_fno_lto);
2457}
2458
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002459void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002460 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002461 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002462 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002463 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002464 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2465 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002466 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002467 ArgStringList CmdArgs;
2468
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002469 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002470 bool IsWindowsCygnus =
2471 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002472 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2473
Daniel Dunbare521a892009-03-31 20:53:55 +00002474 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2475
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002476 // Invoke ourselves in -cc1 mode.
2477 //
2478 // FIXME: Implement custom jobs for internal actions.
2479 CmdArgs.push_back("-cc1");
2480
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002481 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002482 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002483 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002484 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002485
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002486 const llvm::Triple TT(TripleStr);
2487 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2488 TT.getArch() == llvm::Triple::thumb)) {
2489 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2490 unsigned Version;
2491 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2492 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002493 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2494 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002495 }
2496
Tim Northover336f1892014-03-29 13:16:12 +00002497 // Push all default warning arguments that are specific to
2498 // the given target. These come before user provided warning options
2499 // are provided.
2500 getToolChain().addClangWarningOptions(CmdArgs);
2501
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002502 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002503 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002504
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002505 if (isa<AnalyzeJobAction>(JA)) {
2506 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2507 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002508 } else if (isa<MigrateJobAction>(JA)) {
2509 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002510 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002511 if (Output.getType() == types::TY_Dependencies)
2512 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002513 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002514 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002515 if (Args.hasArg(options::OPT_rewrite_objc) &&
2516 !Args.hasArg(options::OPT_g_Group))
2517 CmdArgs.push_back("-P");
2518 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002519 } else if (isa<AssembleJobAction>(JA)) {
2520 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002521
David Blaikie9260ed62013-07-25 21:19:01 +00002522 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002523
2524 // Also ignore explicit -force_cpusubtype_ALL option.
2525 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002526 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002527 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002528 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002529
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002530 if (JA.getType() == types::TY_Nothing)
2531 CmdArgs.push_back("-fsyntax-only");
2532 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002533 CmdArgs.push_back("-emit-pch");
2534 else
2535 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002536 } else if (isa<VerifyPCHJobAction>(JA)) {
2537 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002538 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002539 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2540 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002541
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002542 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002543 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002544 } else if (JA.getType() == types::TY_LLVM_IR ||
2545 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002546 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002547 } else if (JA.getType() == types::TY_LLVM_BC ||
2548 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002549 CmdArgs.push_back("-emit-llvm-bc");
2550 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002551 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002552 } else if (JA.getType() == types::TY_AST) {
2553 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002554 } else if (JA.getType() == types::TY_ModuleFile) {
2555 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002556 } else if (JA.getType() == types::TY_RewrittenObjC) {
2557 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002558 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002559 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2560 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002561 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002562 } else {
2563 assert(JA.getType() == types::TY_PP_Asm &&
2564 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002565 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002566 }
2567
Justin Bognera88f0122014-06-20 22:59:50 +00002568 // We normally speed up the clang process a bit by skipping destructors at
2569 // exit, but when we're generating diagnostics we can rely on some of the
2570 // cleanup.
2571 if (!C.isForDiagnostics())
2572 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002573
John McCallbb79b5f2010-02-13 03:50:24 +00002574 // Disable the verification pass in -asserts builds.
2575#ifdef NDEBUG
2576 CmdArgs.push_back("-disable-llvm-verifier");
2577#endif
2578
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002579 // Set the main file name, so that debug info works even with
2580 // -save-temps.
2581 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002582 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002583
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002584 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002585 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002586 if (Args.hasArg(options::OPT_static))
2587 CmdArgs.push_back("-static-define");
2588
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002589 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002590 // Enable region store model by default.
2591 CmdArgs.push_back("-analyzer-store=region");
2592
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002593 // Treat blocks as analysis entry points.
2594 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2595
Ted Kremenek49c79792011-03-24 00:28:47 +00002596 CmdArgs.push_back("-analyzer-eagerly-assume");
2597
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002598 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002599 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002600 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002601
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002602 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002603 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002604
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002605 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002606 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002607
2608 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002609
Jordan Rose10ad0812013-04-05 17:55:07 +00002610 if (types::isCXX(Inputs[0].getType()))
2611 CmdArgs.push_back("-analyzer-checker=cplusplus");
2612
Nico Webere8e53112014-05-11 01:04:02 +00002613 // Enable the following experimental checkers for testing.
2614 CmdArgs.push_back(
2615 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002616 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2617 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2618 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2619 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2620 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002621 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002622
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002623 // Set the output format. The default is plist, for (lame) historical
2624 // reasons.
2625 CmdArgs.push_back("-analyzer-output");
2626 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002627 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002628 else
2629 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002630
Ted Kremenekfe449a22010-03-22 22:32:05 +00002631 // Disable the presentation of standard compiler warnings when
2632 // using --analyze. We only want to show static analyzer diagnostics
2633 // or frontend errors.
2634 CmdArgs.push_back("-w");
2635
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002636 // Add -Xanalyzer arguments when running as analyzer.
2637 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002638 }
2639
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002640 CheckCodeGenerationOptions(D, Args);
2641
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002642 bool PIE = getToolChain().isPIEDefault();
2643 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002644 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002645
Alexey Bataev40e75222014-01-28 06:30:35 +00002646 // Android-specific defaults for PIC/PIE
2647 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2648 switch (getToolChain().getTriple().getArch()) {
2649 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002650 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002651 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002652 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002653 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002654 case llvm::Triple::mips:
2655 case llvm::Triple::mipsel:
2656 case llvm::Triple::mips64:
2657 case llvm::Triple::mips64el:
2658 PIC = true; // "-fpic"
2659 break;
2660
2661 case llvm::Triple::x86:
2662 case llvm::Triple::x86_64:
2663 PIC = true; // "-fPIC"
2664 IsPICLevelTwo = true;
2665 break;
2666
2667 default:
2668 break;
2669 }
2670 }
2671
Brad Smith5b05db82014-06-24 19:51:29 +00002672 // OpenBSD-specific defaults for PIE
2673 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2674 switch (getToolChain().getTriple().getArch()) {
2675 case llvm::Triple::mips64:
2676 case llvm::Triple::mips64el:
2677 case llvm::Triple::sparc:
2678 case llvm::Triple::x86:
2679 case llvm::Triple::x86_64:
2680 IsPICLevelTwo = false; // "-fpie"
2681 break;
2682
2683 case llvm::Triple::ppc:
2684 case llvm::Triple::sparcv9:
2685 IsPICLevelTwo = true; // "-fPIE"
2686 break;
2687
2688 default:
2689 break;
2690 }
2691 }
2692
Alexey Samsonov090301e2013-04-09 12:28:19 +00002693 // For the PIC and PIE flag options, this logic is different from the
2694 // legacy logic in very old versions of GCC, as that logic was just
2695 // a bug no one had ever fixed. This logic is both more rational and
2696 // consistent with GCC's new logic now that the bugs are fixed. The last
2697 // argument relating to either PIC or PIE wins, and no other argument is
2698 // used. If the last argument is any flavor of the '-fno-...' arguments,
2699 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2700 // at the same level.
2701 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2702 options::OPT_fpic, options::OPT_fno_pic,
2703 options::OPT_fPIE, options::OPT_fno_PIE,
2704 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002705 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2706 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002707 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002708 if (LastPICArg) {
2709 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002710 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2711 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2712 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2713 PIC = PIE || O.matches(options::OPT_fPIC) ||
2714 O.matches(options::OPT_fpic);
2715 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2716 O.matches(options::OPT_fPIC);
2717 } else {
2718 PIE = PIC = false;
2719 }
2720 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002721 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002722
Nick Lewycky609dd662013-10-11 03:33:53 +00002723 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002724 // specified while enabling PIC enabled level 1 PIC, just force it back to
2725 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2726 // informal testing).
2727 if (PIC && getToolChain().getTriple().isOSDarwin())
2728 IsPICLevelTwo |= getToolChain().isPICDefault();
2729
Chandler Carruthc0c04552012-04-08 16:40:35 +00002730 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2731 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002732 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002733 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002734 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002735 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002736 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002737
Chandler Carruth76a943b2012-11-19 03:52:03 +00002738 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2739 // This is a very special mode. It trumps the other modes, almost no one
2740 // uses it, and it isn't even valid on any OS but Darwin.
2741 if (!getToolChain().getTriple().isOSDarwin())
2742 D.Diag(diag::err_drv_unsupported_opt_for_target)
2743 << A->getSpelling() << getToolChain().getTriple().str();
2744
2745 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2746
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002747 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002748 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002749
Chandler Carruth76a943b2012-11-19 03:52:03 +00002750 // Only a forced PIC mode can cause the actual compile to have PIC defines
2751 // etc., no flags are sufficient. This behavior was selected to closely
2752 // match that of llvm-gcc and Apple GCC before that.
2753 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2754 CmdArgs.push_back("-pic-level");
2755 CmdArgs.push_back("2");
2756 }
2757 } else {
2758 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2759 // handled in Clang's IRGen by the -pie-level flag.
2760 CmdArgs.push_back("-mrelocation-model");
2761 CmdArgs.push_back(PIC ? "pic" : "static");
2762
2763 if (PIC) {
2764 CmdArgs.push_back("-pic-level");
2765 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2766 if (PIE) {
2767 CmdArgs.push_back("-pie-level");
2768 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2769 }
2770 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002771 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002772
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002773 CmdArgs.push_back("-mthread-model");
2774 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2775 CmdArgs.push_back(A->getValue());
2776 else
2777 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2778
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002779 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2780 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002781 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002782
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002783 // LLVM Code Generator Options.
2784
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002785 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2786 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2787 for (arg_iterator
2788 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2789 options::OPT_frewrite_map_file_EQ),
2790 MFE = Args.filtered_end();
2791 MFI != MFE; ++MFI) {
2792 CmdArgs.push_back("-frewrite-map-file");
2793 CmdArgs.push_back((*MFI)->getValue());
2794 (*MFI)->claim();
2795 }
2796 }
2797
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002798 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2799 StringRef v = A->getValue();
2800 CmdArgs.push_back("-mllvm");
2801 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2802 A->claim();
2803 }
2804
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002805 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2806 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002807 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002808 }
2809
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002810 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2811 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002812 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002813 D.Diag(diag::err_drv_unsupported_opt_for_target)
2814 << A->getSpelling() << getToolChain().getTriple().str();
2815 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2816 CmdArgs.push_back("-fpcc-struct-return");
2817 } else {
2818 assert(A->getOption().matches(options::OPT_freg_struct_return));
2819 CmdArgs.push_back("-freg-struct-return");
2820 }
2821 }
2822
Roman Divacky65b88cd2011-03-01 17:40:53 +00002823 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2824 CmdArgs.push_back("-mrtd");
2825
Rafael Espindola224dd632011-12-14 21:02:23 +00002826 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002827 CmdArgs.push_back("-mdisable-fp-elim");
2828 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2829 options::OPT_fno_zero_initialized_in_bss))
2830 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002831
2832 bool OFastEnabled = isOptimizationLevelFast(Args);
2833 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2834 // enabled. This alias option is being used to simplify the hasFlag logic.
2835 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2836 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002837 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2838 // doesn't do any TBAA.
2839 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002840 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002841 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002842 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002843 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2844 options::OPT_fno_struct_path_tbaa))
2845 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002846 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2847 false))
2848 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002849 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2850 options::OPT_fno_optimize_sibling_calls))
2851 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002852
Eric Christopher006208c2013-04-04 06:29:47 +00002853 // Handle segmented stacks.
2854 if (Args.hasArg(options::OPT_fsplit_stack))
2855 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002856
2857 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2858 // This alias option is being used to simplify the getLastArg logic.
2859 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2860 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002861
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002862 // Handle various floating point optimization flags, mapping them to the
2863 // appropriate LLVM code generation flags. The pattern for all of these is to
2864 // default off the codegen optimizations, and if any flag enables them and no
2865 // flag disables them after the flag enabling them, enable the codegen
2866 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002867 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002868 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002869 options::OPT_ffinite_math_only,
2870 options::OPT_fno_finite_math_only,
2871 options::OPT_fhonor_infinities,
2872 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002873 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2874 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002875 A->getOption().getID() != options::OPT_fhonor_infinities)
2876 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002877 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002878 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002879 options::OPT_ffinite_math_only,
2880 options::OPT_fno_finite_math_only,
2881 options::OPT_fhonor_nans,
2882 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002883 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2884 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002885 A->getOption().getID() != options::OPT_fhonor_nans)
2886 CmdArgs.push_back("-menable-no-nans");
2887
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002888 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2889 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002890 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002891 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002892 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002893 options::OPT_fno_math_errno)) {
2894 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2895 // However, turning *off* -ffast_math merely restores the toolchain default
2896 // (which may be false).
2897 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2898 A->getOption().getID() == options::OPT_ffast_math ||
2899 A->getOption().getID() == options::OPT_Ofast)
2900 MathErrno = false;
2901 else if (A->getOption().getID() == options::OPT_fmath_errno)
2902 MathErrno = true;
2903 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002904 if (MathErrno)
2905 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002906
2907 // There are several flags which require disabling very specific
2908 // optimizations. Any of these being disabled forces us to turn off the
2909 // entire set of LLVM optimizations, so collect them through all the flag
2910 // madness.
2911 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002912 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002913 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002914 options::OPT_funsafe_math_optimizations,
2915 options::OPT_fno_unsafe_math_optimizations,
2916 options::OPT_fassociative_math,
2917 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002918 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2919 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002920 A->getOption().getID() != options::OPT_fno_associative_math)
2921 AssociativeMath = true;
2922 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002923 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002924 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002925 options::OPT_funsafe_math_optimizations,
2926 options::OPT_fno_unsafe_math_optimizations,
2927 options::OPT_freciprocal_math,
2928 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002929 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2930 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002931 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2932 ReciprocalMath = true;
2933 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002934 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002935 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002936 options::OPT_funsafe_math_optimizations,
2937 options::OPT_fno_unsafe_math_optimizations,
2938 options::OPT_fsigned_zeros,
2939 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002940 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2941 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002942 A->getOption().getID() != options::OPT_fsigned_zeros)
2943 SignedZeros = false;
2944 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002945 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002946 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002947 options::OPT_funsafe_math_optimizations,
2948 options::OPT_fno_unsafe_math_optimizations,
2949 options::OPT_ftrapping_math,
2950 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002951 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2952 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002953 A->getOption().getID() != options::OPT_ftrapping_math)
2954 TrappingMath = false;
2955 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2956 !TrappingMath)
2957 CmdArgs.push_back("-menable-unsafe-fp-math");
2958
Sanjay Patel76c9e092015-01-23 16:40:50 +00002959 if (!SignedZeros)
2960 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00002961
2962 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002963 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002964 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002965 options::OPT_ffp_contract)) {
2966 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002967 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002968 if (Val == "fast" || Val == "on" || Val == "off") {
2969 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2970 } else {
2971 D.Diag(diag::err_drv_unsupported_option_argument)
2972 << A->getOption().getName() << Val;
2973 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002974 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2975 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002976 // If fast-math is set then set the fp-contract mode to fast.
2977 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2978 }
2979 }
2980
Bob Wilson6a039162012-07-19 03:52:53 +00002981 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2982 // and if we find them, tell the frontend to provide the appropriate
2983 // preprocessor macros. This is distinct from enabling any optimizations as
2984 // these options induce language changes which must survive serialization
2985 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002986 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2987 options::OPT_fno_fast_math))
2988 if (!A->getOption().matches(options::OPT_fno_fast_math))
2989 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002990 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2991 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002992 if (A->getOption().matches(options::OPT_ffinite_math_only))
2993 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002994
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002995 // Decide whether to use verbose asm. Verbose assembly is the default on
2996 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002997 bool IsIntegratedAssemblerDefault =
2998 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002999 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003000 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003001 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003002 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003003
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00003004 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003005 IsIntegratedAssemblerDefault))
3006 CmdArgs.push_back("-no-integrated-as");
3007
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003008 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3009 CmdArgs.push_back("-mdebug-pass");
3010 CmdArgs.push_back("Structure");
3011 }
3012 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3013 CmdArgs.push_back("-mdebug-pass");
3014 CmdArgs.push_back("Arguments");
3015 }
3016
John McCall8517abc2010-02-19 02:45:38 +00003017 // Enable -mconstructor-aliases except on darwin, where we have to
3018 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003019 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003020 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003021
John McCall7ef5cb32011-03-18 02:56:14 +00003022 // Darwin's kernel doesn't support guard variables; just die if we
3023 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003024 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003025 CmdArgs.push_back("-fforbid-guard-variables");
3026
Douglas Gregordbe39272011-02-01 15:15:22 +00003027 if (Args.hasArg(options::OPT_mms_bitfields)) {
3028 CmdArgs.push_back("-mms-bitfields");
3029 }
John McCall8517abc2010-02-19 02:45:38 +00003030
Daniel Dunbar306945d2009-09-16 06:17:29 +00003031 // This is a coarse approximation of what llvm-gcc actually does, both
3032 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3033 // complicated ways.
3034 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003035 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3036 options::OPT_fno_asynchronous_unwind_tables,
3037 (getToolChain().IsUnwindTablesDefault() ||
3038 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3039 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003040 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3041 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003042 CmdArgs.push_back("-munwind-tables");
3043
Chandler Carruth05fb5852012-11-21 23:40:23 +00003044 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003045
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003046 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3047 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003048 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003049 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003050
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003051 // FIXME: Handle -mtune=.
3052 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003053
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003054 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003055 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003056 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003057 }
3058
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003059 // Add the target cpu
3060 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3061 llvm::Triple ETriple(ETripleStr);
3062 std::string CPU = getCPUName(Args, ETriple);
3063 if (!CPU.empty()) {
3064 CmdArgs.push_back("-target-cpu");
3065 CmdArgs.push_back(Args.MakeArgString(CPU));
3066 }
3067
Rafael Espindolaeb265472013-08-21 21:59:03 +00003068 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3069 CmdArgs.push_back("-mfpmath");
3070 CmdArgs.push_back(A->getValue());
3071 }
3072
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003073 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003074 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003075
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003076 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003077 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003078 default:
3079 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003080
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003081 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003082 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003083 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003084 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003085 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003086 break;
3087
Tim Northover573cbee2014-05-24 12:52:07 +00003088 case llvm::Triple::aarch64:
3089 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003090 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003091 break;
3092
Eric Christopher0b26a612010-03-02 02:41:08 +00003093 case llvm::Triple::mips:
3094 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003095 case llvm::Triple::mips64:
3096 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003097 AddMIPSTargetArgs(Args, CmdArgs);
3098 break;
3099
Ulrich Weigand8afad612014-07-28 13:17:52 +00003100 case llvm::Triple::ppc:
3101 case llvm::Triple::ppc64:
3102 case llvm::Triple::ppc64le:
3103 AddPPCTargetArgs(Args, CmdArgs);
3104 break;
3105
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003106 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003107 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003108 AddSparcTargetArgs(Args, CmdArgs);
3109 break;
3110
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003111 case llvm::Triple::x86:
3112 case llvm::Triple::x86_64:
3113 AddX86TargetArgs(Args, CmdArgs);
3114 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003115
3116 case llvm::Triple::hexagon:
3117 AddHexagonTargetArgs(Args, CmdArgs);
3118 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003119 }
3120
Hans Wennborg75958c42013-08-08 00:17:41 +00003121 // Add clang-cl arguments.
3122 if (getToolChain().getDriver().IsCLMode())
3123 AddClangCLArgs(Args, CmdArgs);
3124
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003125 // Pass the linker version in use.
3126 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3127 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003128 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003129 }
3130
Eric Christopherb7d97e92013-04-03 01:58:53 +00003131 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003132 CmdArgs.push_back("-momit-leaf-frame-pointer");
3133
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003134 // Explicitly error on some things we know we don't support and can't just
3135 // ignore.
3136 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003137 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3138 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003139 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003140 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003141 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003142 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3143 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003144 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003145 << Unsupported->getOption().getName();
3146 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003147 }
3148
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003149 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003150 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003151 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003152 CmdArgs.push_back("-header-include-file");
3153 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3154 D.CCPrintHeadersFilename : "-");
3155 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003156 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003157 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003158
Chad Rosierbe10f982011-08-02 17:58:04 +00003159 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003160 CmdArgs.push_back("-diagnostic-log-file");
3161 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3162 D.CCLogDiagnosticsFilename : "-");
3163 }
3164
Manman Ren17bdb0f2013-11-20 20:22:14 +00003165 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3166 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003167 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003168 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003169 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3170 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003171 // FIXME: we should support specifying dwarf version with
3172 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003173 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003174 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003175 const llvm::Triple &Triple = getToolChain().getTriple();
3176 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003177 Triple.getOS() == llvm::Triple::FreeBSD ||
3178 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003179 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003180 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003181 CmdArgs.push_back("-gdwarf-2");
3182 else if (A->getOption().matches(options::OPT_gdwarf_3))
3183 CmdArgs.push_back("-gdwarf-3");
3184 else if (A->getOption().matches(options::OPT_gdwarf_4))
3185 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003186 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003187 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003188 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003189 const llvm::Triple &Triple = getToolChain().getTriple();
3190 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003191 Triple.getOS() == llvm::Triple::FreeBSD ||
3192 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003193 CmdArgs.push_back("-gdwarf-2");
3194 else
3195 CmdArgs.push_back("-g");
3196 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003197 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003198
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003199 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3200 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003201 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3202 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003203 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003204
Eric Christopher138c32b2013-09-13 22:37:55 +00003205 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003206 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3207 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003208 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003209 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003210 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003211 CmdArgs.push_back("-g");
3212 CmdArgs.push_back("-backend-option");
3213 CmdArgs.push_back("-split-dwarf=Enable");
3214 }
3215
Eric Christopher138c32b2013-09-13 22:37:55 +00003216 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3217 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3218 CmdArgs.push_back("-backend-option");
3219 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3220 }
Eric Christophereec89c22013-06-18 00:03:50 +00003221
Eric Christopher0d403d22014-02-14 01:27:03 +00003222 // -gdwarf-aranges turns on the emission of the aranges section in the
3223 // backend.
3224 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3225 CmdArgs.push_back("-backend-option");
3226 CmdArgs.push_back("-generate-arange-section");
3227 }
3228
David Blaikief36d9ba2014-01-27 18:52:43 +00003229 if (Args.hasFlag(options::OPT_fdebug_types_section,
3230 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003231 CmdArgs.push_back("-backend-option");
3232 CmdArgs.push_back("-generate-type-units");
3233 }
Eric Christophereec89c22013-06-18 00:03:50 +00003234
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003235 if (Args.hasFlag(options::OPT_ffunction_sections,
3236 options::OPT_fno_function_sections, false)) {
3237 CmdArgs.push_back("-ffunction-sections");
3238 }
3239
3240 if (Args.hasFlag(options::OPT_fdata_sections,
3241 options::OPT_fno_data_sections, false)) {
3242 CmdArgs.push_back("-fdata-sections");
3243 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003244
Chris Lattner3c77a352010-06-22 00:03:40 +00003245 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3246
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003247 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3248 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3249 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3250 D.Diag(diag::err_drv_argument_not_allowed_with)
3251 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3252
3253 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3254
3255 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3256 A->render(Args, CmdArgs);
3257 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3258 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3259
Nick Lewycky207bce32011-04-21 23:44:07 +00003260 if (Args.hasArg(options::OPT_ftest_coverage) ||
3261 Args.hasArg(options::OPT_coverage))
3262 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003263 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3264 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003265 Args.hasArg(options::OPT_coverage))
3266 CmdArgs.push_back("-femit-coverage-data");
3267
Alex Lorenzee024992014-08-04 18:41:51 +00003268 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3269 !Args.hasArg(options::OPT_fprofile_instr_generate))
3270 D.Diag(diag::err_drv_argument_only_allowed_with)
3271 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3272
3273 if (Args.hasArg(options::OPT_fcoverage_mapping))
3274 CmdArgs.push_back("-fcoverage-mapping");
3275
Nick Lewycky480cb992011-05-04 20:46:58 +00003276 if (C.getArgs().hasArg(options::OPT_c) ||
3277 C.getArgs().hasArg(options::OPT_S)) {
3278 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003279 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003280 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003281 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003282 CoverageFilename = FinalOutput->getValue();
3283 } else {
3284 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3285 }
Nick Lewycky737a4522013-03-07 08:28:53 +00003286 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003287 SmallString<128> Pwd;
3288 if (!llvm::sys::fs::current_path(Pwd)) {
3289 llvm::sys::path::append(Pwd, CoverageFilename.str());
3290 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003291 }
3292 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003293 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003294 }
3295 }
3296
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003297 // Pass options for controlling the default header search paths.
3298 if (Args.hasArg(options::OPT_nostdinc)) {
3299 CmdArgs.push_back("-nostdsysteminc");
3300 CmdArgs.push_back("-nobuiltininc");
3301 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003302 if (Args.hasArg(options::OPT_nostdlibinc))
3303 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003304 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3305 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3306 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003307
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003308 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003309 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003310 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003311
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003312 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3313
Ted Kremenekf7639e12012-03-06 20:06:33 +00003314 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003315 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003316 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003317 options::OPT_ccc_arcmt_modify,
3318 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003319 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003320 switch (A->getOption().getID()) {
3321 default:
3322 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003323 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003324 CmdArgs.push_back("-arcmt-check");
3325 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003326 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003327 CmdArgs.push_back("-arcmt-modify");
3328 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003329 case options::OPT_ccc_arcmt_migrate:
3330 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003331 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003332 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003333
3334 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3335 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003336 break;
John McCalld70fb982011-06-15 23:25:17 +00003337 }
3338 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003339 } else {
3340 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3341 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3342 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003343 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003344
Ted Kremenekf7639e12012-03-06 20:06:33 +00003345 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3346 if (ARCMTEnabled) {
3347 D.Diag(diag::err_drv_argument_not_allowed_with)
3348 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3349 }
3350 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003351 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003352
3353 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003354 options::OPT_objcmt_migrate_subscripting,
3355 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003356 // None specified, means enable them all.
3357 CmdArgs.push_back("-objcmt-migrate-literals");
3358 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003359 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003360 } else {
3361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003363 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003364 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003365 } else {
3366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3373 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3374 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3375 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3376 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3377 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3378 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003379 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003380 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003381 }
3382
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003383 // Add preprocessing options like -I, -D, etc. if we are using the
3384 // preprocessor.
3385 //
3386 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003387 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003388 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003389
Rafael Espindolaa7431922011-07-21 23:40:37 +00003390 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3391 // that "The compiler can only warn and ignore the option if not recognized".
3392 // When building with ccache, it will pass -D options to clang even on
3393 // preprocessed inputs and configure concludes that -fPIC is not supported.
3394 Args.ClaimAllArgs(options::OPT_D);
3395
Alp Toker7874bdc2013-11-15 20:40:58 +00003396 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003397 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3398 if (A->getOption().matches(options::OPT_O4)) {
3399 CmdArgs.push_back("-O3");
3400 D.Diag(diag::warn_O4_is_O3);
3401 } else {
3402 A->render(Args, CmdArgs);
3403 }
3404 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003405
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003406 // Warn about ignored options to clang.
3407 for (arg_iterator it = Args.filtered_begin(
3408 options::OPT_clang_ignored_gcc_optimization_f_Group),
3409 ie = Args.filtered_end(); it != ie; ++it) {
3410 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3411 }
3412
Rafael Espindola577637a2015-01-03 00:06:04 +00003413 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003414
Richard Smith3be1cb22014-08-07 00:24:21 +00003415 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003416 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003417 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3418 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003419 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003420 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003421
3422 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003423 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003424 //
3425 // If a std is supplied, only add -trigraphs if it follows the
3426 // option.
3427 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3428 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003429 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003430 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003431 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003432 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003433 else
3434 Std->render(Args, CmdArgs);
3435
Nico Weber00721502014-12-23 22:32:37 +00003436 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003437 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003438 options::OPT_ftrigraphs,
3439 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003440 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003441 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003442 } else {
3443 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003444 //
3445 // FIXME: Clang doesn't correctly handle -std= when the input language
3446 // doesn't match. For the time being just ignore this for C++ inputs;
3447 // eventually we want to do all the standard defaulting here instead of
3448 // splitting it between the driver and clang -cc1.
3449 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003450 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3451 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003452 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003453 CmdArgs.push_back("-std=c++11");
3454
Nico Weber00721502014-12-23 22:32:37 +00003455 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3456 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003457 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003458
Richard Smith282b4492013-09-04 22:50:31 +00003459 // GCC's behavior for -Wwrite-strings is a bit strange:
3460 // * In C, this "warning flag" changes the types of string literals from
3461 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3462 // for the discarded qualifier.
3463 // * In C++, this is just a normal warning flag.
3464 //
3465 // Implementing this warning correctly in C is hard, so we follow GCC's
3466 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3467 // a non-const char* in C, rather than using this crude hack.
3468 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003469 // FIXME: This should behave just like a warning flag, and thus should also
3470 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3471 Arg *WriteStrings =
3472 Args.getLastArg(options::OPT_Wwrite_strings,
3473 options::OPT_Wno_write_strings, options::OPT_w);
3474 if (WriteStrings &&
3475 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003476 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003477 }
3478
Chandler Carruth61fbf622011-04-23 09:27:53 +00003479 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003480 // during C++ compilation, which it is by default. GCC keeps this define even
3481 // in the presence of '-w', match this behavior bug-for-bug.
3482 if (types::isCXX(InputType) &&
3483 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3484 true)) {
3485 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003486 }
3487
Chandler Carruthe0391482010-05-22 02:21:53 +00003488 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3489 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3490 if (Asm->getOption().matches(options::OPT_fasm))
3491 CmdArgs.push_back("-fgnu-keywords");
3492 else
3493 CmdArgs.push_back("-fno-gnu-keywords");
3494 }
3495
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003496 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3497 CmdArgs.push_back("-fno-dwarf-directory-asm");
3498
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003499 if (ShouldDisableAutolink(Args, getToolChain()))
3500 CmdArgs.push_back("-fno-autolink");
3501
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003502 // Add in -fdebug-compilation-dir if necessary.
3503 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003504
Richard Smith9a568822011-11-21 19:36:32 +00003505 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3506 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003507 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003508 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003509 }
3510
Richard Smith79c927b2013-11-06 19:31:51 +00003511 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3512 CmdArgs.push_back("-foperator-arrow-depth");
3513 CmdArgs.push_back(A->getValue());
3514 }
3515
Richard Smith9a568822011-11-21 19:36:32 +00003516 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3517 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003518 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003519 }
3520
Richard Smitha3d3bd22013-05-08 02:12:03 +00003521 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3522 CmdArgs.push_back("-fconstexpr-steps");
3523 CmdArgs.push_back(A->getValue());
3524 }
3525
Richard Smithb3a14522013-02-22 01:59:51 +00003526 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3527 CmdArgs.push_back("-fbracket-depth");
3528 CmdArgs.push_back(A->getValue());
3529 }
3530
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003531 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3532 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003533 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003534 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003535 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3536 } else
3537 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003538 }
3539
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003540
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003541 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003542 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003543
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003544 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3545 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003546 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003547 }
David Chisnall5778fce2009-08-31 16:41:57 +00003548
Chris Lattnere23003d2010-01-09 21:54:33 +00003549 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3550 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003551 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003552 }
3553
Chris Lattnerb35583d2010-04-07 20:49:23 +00003554 CmdArgs.push_back("-ferror-limit");
3555 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003556 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003557 else
3558 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003559
Chandler Carrutha77a7272010-05-06 04:55:18 +00003560 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3561 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003562 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003563 }
3564
3565 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3566 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003567 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003568 }
3569
Richard Smithf6f003a2011-12-16 19:06:07 +00003570 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3571 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003572 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003573 }
3574
Nick Lewycky24653262014-12-16 21:39:02 +00003575 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3576 CmdArgs.push_back("-fspell-checking-limit");
3577 CmdArgs.push_back(A->getValue());
3578 }
3579
Daniel Dunbar2c978472009-11-04 06:24:47 +00003580 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003581 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003582 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003583 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003584 } else {
3585 // If -fmessage-length=N was not specified, determine whether this is a
3586 // terminal and, if so, implicitly define -fmessage-length appropriately.
3587 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003588 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003589 }
3590
John McCallb4a99d32013-02-19 01:57:35 +00003591 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3592 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3593 options::OPT_fvisibility_ms_compat)) {
3594 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3595 CmdArgs.push_back("-fvisibility");
3596 CmdArgs.push_back(A->getValue());
3597 } else {
3598 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3599 CmdArgs.push_back("-fvisibility");
3600 CmdArgs.push_back("hidden");
3601 CmdArgs.push_back("-ftype-visibility");
3602 CmdArgs.push_back("default");
3603 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003604 }
3605
Douglas Gregor08329632010-06-15 17:05:35 +00003606 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003607
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003608 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3609
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003610 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003611 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3612 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003613 CmdArgs.push_back("-ffreestanding");
3614
Daniel Dunbare357d562009-12-03 18:42:11 +00003615 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003616 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003617 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003618 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3619 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003620 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003621 // AltiVec language extensions aren't relevant for assembling.
3622 if (!isa<PreprocessJobAction>(JA) ||
3623 Output.getType() != types::TY_PP_Asm)
3624 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003625 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3626 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003627
Peter Collingbourne32701642013-11-01 18:16:25 +00003628 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3629 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003630
Eric Christopher459d2712013-02-19 06:16:53 +00003631 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003632 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003633 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003634 getToolChain().getArch() == llvm::Triple::ppc64 ||
3635 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003636 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003637 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003638
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003639 if (getToolChain().SupportsProfiling())
3640 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003641
3642 // -flax-vector-conversions is default.
3643 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3644 options::OPT_fno_lax_vector_conversions))
3645 CmdArgs.push_back("-fno-lax-vector-conversions");
3646
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003647 if (Args.getLastArg(options::OPT_fapple_kext))
3648 CmdArgs.push_back("-fapple-kext");
3649
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003650 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003651 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003652 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003653 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3654 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003655
3656 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3657 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003658 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003659 }
3660
Bob Wilson14adb362012-02-03 06:27:22 +00003661 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003662
Chandler Carruth6e501032011-03-27 00:04:55 +00003663 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3664 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3665 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3666 options::OPT_fno_wrapv)) {
3667 if (A->getOption().matches(options::OPT_fwrapv))
3668 CmdArgs.push_back("-fwrapv");
3669 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3670 options::OPT_fno_strict_overflow)) {
3671 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3672 CmdArgs.push_back("-fwrapv");
3673 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003674
3675 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3676 options::OPT_fno_reroll_loops))
3677 if (A->getOption().matches(options::OPT_freroll_loops))
3678 CmdArgs.push_back("-freroll-loops");
3679
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003680 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003681 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3682 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003683
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003684 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3685
Mahesha S6a682be42012-10-27 07:47:56 +00003686
Daniel Dunbar4930e332009-11-17 08:07:36 +00003687 // -stack-protector=0 is default.
3688 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003689 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3690 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003691 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003692 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003693 if (A->getOption().matches(options::OPT_fstack_protector)) {
3694 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3695 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3696 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003697 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003698 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003699 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003700 } else {
3701 StackProtectorLevel =
3702 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3703 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003704 if (StackProtectorLevel) {
3705 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003706 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003707 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003708
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003709 // --param ssp-buffer-size=
3710 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3711 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003712 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003713 if (Str.startswith("ssp-buffer-size=")) {
3714 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003715 CmdArgs.push_back("-stack-protector-buffer-size");
3716 // FIXME: Verify the argument is a valid integer.
3717 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003718 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003719 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003720 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003721 }
3722
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003723 // Translate -mstackrealign
3724 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3725 false)) {
3726 CmdArgs.push_back("-backend-option");
3727 CmdArgs.push_back("-force-align-stack");
3728 }
3729 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3730 false)) {
3731 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3732 }
3733
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003734 if (Args.hasArg(options::OPT_mstack_alignment)) {
3735 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3736 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003737 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003738
Hans Wennborg77dc2362015-01-20 19:45:50 +00003739 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3740 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3741
3742 if (!Size.empty())
3743 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3744 else
3745 CmdArgs.push_back("-mstack-probe-size=0");
3746 }
3747
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003748 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3749 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3750 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3751
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003752 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3753 options::OPT_mno_restrict_it)) {
3754 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3755 CmdArgs.push_back("-backend-option");
3756 CmdArgs.push_back("-arm-restrict-it");
3757 } else {
3758 CmdArgs.push_back("-backend-option");
3759 CmdArgs.push_back("-arm-no-restrict-it");
3760 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003761 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3762 TT.getArch() == llvm::Triple::thumb)) {
3763 // Windows on ARM expects restricted IT blocks
3764 CmdArgs.push_back("-backend-option");
3765 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003766 }
3767
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003768 if (TT.getArch() == llvm::Triple::arm ||
3769 TT.getArch() == llvm::Triple::thumb) {
3770 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3771 options::OPT_mno_long_calls)) {
3772 if (A->getOption().matches(options::OPT_mlong_calls)) {
3773 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003774 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003775 }
3776 }
3777 }
3778
Daniel Dunbard18049a2009-04-07 21:16:11 +00003779 // Forward -f options with positive and negative forms; we translate
3780 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003781 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3782 StringRef fname = A->getValue();
3783 if (!llvm::sys::fs::exists(fname))
3784 D.Diag(diag::err_drv_no_such_file) << fname;
3785 else
3786 A->render(Args, CmdArgs);
3787 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003788
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003789 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003790 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003791 CmdArgs.push_back("-fapple-kext");
3792 if (!Args.hasArg(options::OPT_fbuiltin))
3793 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003794 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003795 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003796 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003797 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003798 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003799
Nuno Lopes13c88c72009-12-16 16:59:22 +00003800 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3801 options::OPT_fno_assume_sane_operator_new))
3802 CmdArgs.push_back("-fno-assume-sane-operator-new");
3803
Daniel Dunbar4930e332009-11-17 08:07:36 +00003804 // -fblocks=0 is default.
3805 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003806 getToolChain().IsBlocksDefault()) ||
3807 (Args.hasArg(options::OPT_fgnu_runtime) &&
3808 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3809 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003810 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003811
3812 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3813 !getToolChain().hasBlocksRuntime())
3814 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003815 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003816
Richard Smithffb65082014-09-30 23:10:19 +00003817 // -fmodules enables modules (off by default).
3818 // Users can pass -fno-cxx-modules to turn off modules support for
3819 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003820 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003821 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3822 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3823 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003824 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003825 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003826 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003827 HaveModules = true;
3828 }
3829 }
3830
Daniel Jasper07e6c402013-08-05 20:26:17 +00003831 // -fmodule-maps enables module map processing (off by default) for header
3832 // checking. It is implied by -fmodules.
3833 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3834 false)) {
3835 CmdArgs.push_back("-fmodule-maps");
3836 }
3837
Daniel Jasperac42b752013-10-21 06:34:34 +00003838 // -fmodules-decluse checks that modules used are declared so (off by
3839 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003840 if (Args.hasFlag(options::OPT_fmodules_decluse,
3841 options::OPT_fno_modules_decluse,
3842 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003843 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003844 }
3845
Daniel Jasper962b38e2014-04-11 11:47:45 +00003846 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3847 // all #included headers are part of modules.
3848 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3849 options::OPT_fno_modules_strict_decluse,
3850 false)) {
3851 CmdArgs.push_back("-fmodules-strict-decluse");
3852 }
3853
Daniel Jasperac42b752013-10-21 06:34:34 +00003854 // -fmodule-name specifies the module that is currently being built (or
3855 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00003856 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00003857
Richard Smith9887d792014-10-17 01:42:53 +00003858 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00003859 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00003860 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00003861
Richard Smithe842a472014-10-22 02:05:46 +00003862 // -fmodule-file can be used to specify files containing precompiled modules.
3863 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
3864
3865 // -fmodule-cache-path specifies where our implicitly-built module files
3866 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00003867 SmallString<128> ModuleCachePath;
3868 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3869 ModuleCachePath = A->getValue();
3870 if (HaveModules) {
3871 if (C.isForDiagnostics()) {
3872 // When generating crash reports, we want to emit the modules along with
3873 // the reproduction sources, so we ignore any provided module path.
3874 ModuleCachePath = Output.getFilename();
3875 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3876 llvm::sys::path::append(ModuleCachePath, "modules");
3877 } else if (ModuleCachePath.empty()) {
3878 // No module path was provided: use the default.
3879 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3880 ModuleCachePath);
3881 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3882 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3883 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003884 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003885 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3886 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3887 }
3888
3889 // When building modules and generating crashdumps, we need to dump a module
3890 // dependency VFS alongside the output.
3891 if (HaveModules && C.isForDiagnostics()) {
3892 SmallString<128> VFSDir(Output.getFilename());
3893 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00003894 // Add the cache directory as a temp so the crash diagnostics pick it up.
3895 C.addTempFile(Args.MakeArgString(VFSDir));
3896
Justin Bognera88f0122014-06-20 22:59:50 +00003897 llvm::sys::path::append(VFSDir, "vfs");
3898 CmdArgs.push_back("-module-dependency-dir");
3899 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003900 }
3901
Richard Smith9887d792014-10-17 01:42:53 +00003902 if (HaveModules)
3903 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003904
Douglas Gregor35b04d62013-02-07 19:01:24 +00003905 // Pass through all -fmodules-ignore-macro arguments.
3906 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003907 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3908 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003909
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003910 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3911
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003912 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3913 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3914 D.Diag(diag::err_drv_argument_not_allowed_with)
3915 << A->getAsString(Args) << "-fbuild-session-timestamp";
3916
3917 llvm::sys::fs::file_status Status;
3918 if (llvm::sys::fs::status(A->getValue(), Status))
3919 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003920 char TimeStamp[48];
3921 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3922 (uint64_t)Status.getLastModificationTime().toEpochTime());
3923 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003924 }
3925
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003926 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003927 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3928 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003929 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3930
3931 Args.AddLastArg(CmdArgs,
3932 options::OPT_fmodules_validate_once_per_build_session);
3933 }
3934
Ben Langmuirdcf73862014-03-12 00:06:17 +00003935 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3936
John McCalldfea9982010-04-09 19:12:06 +00003937 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003938 if (Args.hasFlag(options::OPT_fno_access_control,
3939 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003940 false))
John McCall3155f572010-04-09 19:03:51 +00003941 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003942
Anders Carlssond470fef2010-11-21 00:09:52 +00003943 // -felide-constructors is the default.
3944 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3945 options::OPT_felide_constructors,
3946 false))
3947 CmdArgs.push_back("-fno-elide-constructors");
3948
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003949 // -frtti is default, except for the PS4 CPU.
3950 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti,
3951 !Triple.isPS4CPU()) ||
Richard Smith52be6192012-11-05 22:04:41 +00003952 KernelOrKext) {
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00003953 bool IsCXX = types::isCXX(InputType);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003954 bool RTTIEnabled = false;
3955 Arg *NoRTTIArg = Args.getLastArg(
3956 options::OPT_mkernel, options::OPT_fapple_kext, options::OPT_fno_rtti);
3957
3958 // PS4 requires rtti when exceptions are enabled. If -fno-rtti was
3959 // explicitly passed, error out. Otherwise enable rtti and emit a
3960 // warning.
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00003961 Arg *Exceptions = Args.getLastArg(
3962 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
3963 options::OPT_fexceptions, options::OPT_fno_exceptions);
3964 if (Triple.isPS4CPU() && Exceptions) {
3965 bool CXXExceptions =
3966 (IsCXX &&
3967 Exceptions->getOption().matches(options::OPT_fexceptions)) ||
3968 Exceptions->getOption().matches(options::OPT_fcxx_exceptions);
3969 if (CXXExceptions) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003970 if (NoRTTIArg)
3971 D.Diag(diag::err_drv_argument_not_allowed_with)
Filipe Cabecinhasf2a3aec2015-01-31 23:05:51 +00003972 << NoRTTIArg->getAsString(Args) << Exceptions->getAsString(Args);
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003973 else {
3974 RTTIEnabled = true;
3975 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
3976 }
3977 }
3978 }
Mike Stump183c3d22009-07-31 23:15:31 +00003979
Richard Smith52be6192012-11-05 22:04:41 +00003980 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003981 if (Sanitize.sanitizesVptr()) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003982 // If rtti was explicitly disabled and the vptr sanitizer is on, error
3983 // out. Otherwise, warn that vptr will be disabled unless -frtti is
3984 // passed.
3985 if (NoRTTIArg) {
3986 D.Diag(diag::err_drv_argument_not_allowed_with)
3987 << "-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
3988 } else {
3989 D.Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
3990 // All sanitizer switches have been pushed. This -fno-sanitize
3991 // will override any -fsanitize={vptr,undefined} passed before it.
3992 CmdArgs.push_back("-fno-sanitize=vptr");
3993 }
Richard Smith52be6192012-11-05 22:04:41 +00003994 }
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003995
3996 if (!RTTIEnabled)
3997 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00003998 }
3999
Tony Linthicum76329bf2011-12-12 21:14:55 +00004000 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004001 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00004002 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004003 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00004004 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004005 CmdArgs.push_back("-fshort-enums");
4006
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004007 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004008 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004009 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004010 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004011
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004012 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004013 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004014 options::OPT_fno_threadsafe_statics))
4015 CmdArgs.push_back("-fno-threadsafe-statics");
4016
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004017 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004018 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4019 options::OPT_fno_use_cxa_atexit,
4020 !IsWindowsCygnus && !IsWindowsGNU &&
4021 getToolChain().getArch() != llvm::Triple::hexagon &&
4022 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004023 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004024 CmdArgs.push_back("-fno-use-cxa-atexit");
4025
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004026 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004027 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004028 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004029 CmdArgs.push_back("-fms-extensions");
4030
Francois Pichet1b4f1632011-09-17 04:32:15 +00004031 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004032 if (Args.hasFlag(options::OPT_fms_compatibility,
4033 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004034 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4035 options::OPT_fno_ms_extensions,
4036 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004037 CmdArgs.push_back("-fms-compatibility");
4038
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004039 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004040 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004041 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
4042 Args.hasArg(options::OPT_fms_compatibility_version)) {
4043 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4044 const Arg *MSCompatibilityVersion =
4045 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004046
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004047 if (MSCVersion && MSCompatibilityVersion)
4048 D.Diag(diag::err_drv_argument_not_allowed_with)
4049 << MSCVersion->getAsString(Args)
4050 << MSCompatibilityVersion->getAsString(Args);
4051
4052 std::string Ver;
4053 if (MSCompatibilityVersion)
4054 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4055 else if (MSCVersion)
4056 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4057
4058 if (Ver.empty())
4059 CmdArgs.push_back("-fms-compatibility-version=17.00");
4060 else
4061 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4062 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004063
Eric Christopher5ecce122013-02-18 00:38:31 +00004064 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004065 if (Args.hasFlag(options::OPT_fborland_extensions,
4066 options::OPT_fno_borland_extensions, false))
4067 CmdArgs.push_back("-fborland-extensions");
4068
Francois Pichet02744872011-09-01 16:38:08 +00004069 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4070 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004071 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004072 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004073 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004074
Chandler Carruthe03aa552010-04-17 20:17:31 +00004075 // -fgnu-keywords default varies depending on language; only pass if
4076 // specified.
4077 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004078 options::OPT_fno_gnu_keywords))
4079 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004080
Rafael Espindola922a6242011-06-02 17:30:53 +00004081 if (Args.hasFlag(options::OPT_fgnu89_inline,
4082 options::OPT_fno_gnu89_inline,
4083 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004084 CmdArgs.push_back("-fgnu89-inline");
4085
Chad Rosier9c76d242012-03-15 22:31:42 +00004086 if (Args.hasArg(options::OPT_fno_inline))
4087 CmdArgs.push_back("-fno-inline");
4088
Chad Rosier64d6be92012-03-06 21:17:19 +00004089 if (Args.hasArg(options::OPT_fno_inline_functions))
4090 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004091
John McCall5fb5df92012-06-20 06:18:46 +00004092 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004093
John McCall5fb5df92012-06-20 06:18:46 +00004094 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004095 // legacy is the default. Except for deployment taget of 10.5,
4096 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4097 // gets ignored silently.
4098 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004099 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4100 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004101 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004102 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004103 if (getToolChain().UseObjCMixedDispatch())
4104 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4105 else
4106 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4107 }
4108 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004109
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004110 // When ObjectiveC legacy runtime is in effect on MacOSX,
4111 // turn on the option to do Array/Dictionary subscripting
4112 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004113 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4114 getToolChain().getTriple().isMacOSX() &&
4115 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4116 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004117 objcRuntime.isNeXTFamily())
4118 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4119
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004120 // -fencode-extended-block-signature=1 is default.
4121 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4122 CmdArgs.push_back("-fencode-extended-block-signature");
4123 }
4124
John McCall24fc0de2011-07-06 00:26:06 +00004125 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4126 // NOTE: This logic is duplicated in ToolChains.cpp.
4127 bool ARC = isObjCAutoRefCount(Args);
4128 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004129 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004130
John McCall24fc0de2011-07-06 00:26:06 +00004131 CmdArgs.push_back("-fobjc-arc");
4132
Chandler Carruth491db322011-11-04 07:34:47 +00004133 // FIXME: It seems like this entire block, and several around it should be
4134 // wrapped in isObjC, but for now we just use it here as this is where it
4135 // was being used previously.
4136 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4137 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4138 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4139 else
4140 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4141 }
4142
John McCall24fc0de2011-07-06 00:26:06 +00004143 // Allow the user to enable full exceptions code emission.
4144 // We define off for Objective-CC, on for Objective-C++.
4145 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4146 options::OPT_fno_objc_arc_exceptions,
4147 /*default*/ types::isCXX(InputType)))
4148 CmdArgs.push_back("-fobjc-arc-exceptions");
4149 }
4150
4151 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4152 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004153 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004154 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004155
John McCall24fc0de2011-07-06 00:26:06 +00004156 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4157 // takes precedence.
4158 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4159 if (!GCArg)
4160 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4161 if (GCArg) {
4162 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004163 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004164 << GCArg->getAsString(Args);
4165 } else if (getToolChain().SupportsObjCGC()) {
4166 GCArg->render(Args, CmdArgs);
4167 } else {
4168 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004169 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004170 << GCArg->getAsString(Args);
4171 }
4172 }
4173
Reid Klecknerc542d372014-06-27 17:02:02 +00004174 // Handle GCC-style exception args.
4175 if (!C.getDriver().IsCLMode())
4176 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4177 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004178
4179 if (getToolChain().UseSjLjExceptions())
4180 CmdArgs.push_back("-fsjlj-exceptions");
4181
4182 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004183 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4184 options::OPT_fno_assume_sane_operator_new))
4185 CmdArgs.push_back("-fno-assume-sane-operator-new");
4186
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004187 // -fconstant-cfstrings is default, and may be subject to argument translation
4188 // on Darwin.
4189 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4190 options::OPT_fno_constant_cfstrings) ||
4191 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4192 options::OPT_mno_constant_cfstrings))
4193 CmdArgs.push_back("-fno-constant-cfstrings");
4194
John Thompsoned4e2952009-11-05 20:14:16 +00004195 // -fshort-wchar default varies depending on platform; only
4196 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004197 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4198 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004199 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004200
Hans Wennborg28c96312013-07-31 23:39:13 +00004201 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004202 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004203 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004204 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004205 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004206
Daniel Dunbar096ed292011-10-05 21:04:55 +00004207 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4208 // -fno-pack-struct doesn't apply to -fpack-struct=.
4209 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004210 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004211 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004212 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004213 } else if (Args.hasFlag(options::OPT_fpack_struct,
4214 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004215 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004216 }
4217
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004218 // Handle -fmax-type-align=N and -fno-type-align
4219 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4220 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4221 if (!SkipMaxTypeAlign) {
4222 std::string MaxTypeAlignStr = "-fmax-type-align=";
4223 MaxTypeAlignStr += A->getValue();
4224 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4225 }
4226 } else if (getToolChain().getTriple().isOSDarwin()) {
4227 if (!SkipMaxTypeAlign) {
4228 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4229 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4230 }
4231 }
4232
Robert Lytton0e076492013-08-13 09:43:10 +00004233 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004234 if (!Args.hasArg(options::OPT_fcommon))
4235 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004236 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004237 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004238
Daniel Dunbard18049a2009-04-07 21:16:11 +00004239 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004240 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004241 CmdArgs.push_back("-fno-common");
4242
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004243 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004244 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004245 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004246 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004247 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004248 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4249
Daniel Dunbar6358d682010-10-15 22:30:42 +00004250 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4251 if (!Args.hasFlag(options::OPT_ffor_scope,
4252 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004253 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004254 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4255
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004256 // -finput_charset=UTF-8 is default. Reject others
4257 if (Arg *inputCharset = Args.getLastArg(
4258 options::OPT_finput_charset_EQ)) {
4259 StringRef value = inputCharset->getValue();
4260 if (value != "UTF-8")
4261 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4262 }
4263
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004264 // -fexec_charset=UTF-8 is default. Reject others
4265 if (Arg *execCharset = Args.getLastArg(
4266 options::OPT_fexec_charset_EQ)) {
4267 StringRef value = execCharset->getValue();
4268 if (value != "UTF-8")
4269 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4270 }
4271
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004272 // -fcaret-diagnostics is default.
4273 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4274 options::OPT_fno_caret_diagnostics, true))
4275 CmdArgs.push_back("-fno-caret-diagnostics");
4276
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004277 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004278 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004279 options::OPT_fno_diagnostics_fixit_info))
4280 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004281
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004282 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004283 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004284 options::OPT_fno_diagnostics_show_option))
4285 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004286
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004287 if (const Arg *A =
4288 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4289 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004290 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004291 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004292
Douglas Gregor643c9222011-05-21 17:07:29 +00004293 if (const Arg *A =
4294 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4295 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004296 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004297 }
4298
Chandler Carruthb6766f02011-03-27 01:50:55 +00004299 if (Arg *A = Args.getLastArg(
4300 options::OPT_fdiagnostics_show_note_include_stack,
4301 options::OPT_fno_diagnostics_show_note_include_stack)) {
4302 if (A->getOption().matches(
4303 options::OPT_fdiagnostics_show_note_include_stack))
4304 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4305 else
4306 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4307 }
4308
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004309 // Color diagnostics are the default, unless the terminal doesn't support
4310 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004311 // Support both clang's -f[no-]color-diagnostics and gcc's
4312 // -f[no-]diagnostics-colors[=never|always|auto].
4313 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004314 for (const auto &Arg : Args) {
4315 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004316 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4317 !O.matches(options::OPT_fdiagnostics_color) &&
4318 !O.matches(options::OPT_fno_color_diagnostics) &&
4319 !O.matches(options::OPT_fno_diagnostics_color) &&
4320 !O.matches(options::OPT_fdiagnostics_color_EQ))
4321 continue;
4322
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004323 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004324 if (O.matches(options::OPT_fcolor_diagnostics) ||
4325 O.matches(options::OPT_fdiagnostics_color)) {
4326 ShowColors = Colors_On;
4327 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4328 O.matches(options::OPT_fno_diagnostics_color)) {
4329 ShowColors = Colors_Off;
4330 } else {
4331 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004332 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004333 if (value == "always")
4334 ShowColors = Colors_On;
4335 else if (value == "never")
4336 ShowColors = Colors_Off;
4337 else if (value == "auto")
4338 ShowColors = Colors_Auto;
4339 else
4340 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4341 << ("-fdiagnostics-color=" + value).str();
4342 }
4343 }
4344 if (ShowColors == Colors_On ||
4345 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004346 CmdArgs.push_back("-fcolor-diagnostics");
4347
Nico Rieck7857d462013-09-11 00:38:02 +00004348 if (Args.hasArg(options::OPT_fansi_escape_codes))
4349 CmdArgs.push_back("-fansi-escape-codes");
4350
Daniel Dunbardb097022009-06-08 21:13:54 +00004351 if (!Args.hasFlag(options::OPT_fshow_source_location,
4352 options::OPT_fno_show_source_location))
4353 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004354
Douglas Gregor643c9222011-05-21 17:07:29 +00004355 if (!Args.hasFlag(options::OPT_fshow_column,
4356 options::OPT_fno_show_column,
4357 true))
4358 CmdArgs.push_back("-fno-show-column");
4359
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004360 if (!Args.hasFlag(options::OPT_fspell_checking,
4361 options::OPT_fno_spell_checking))
4362 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004363
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004364
Chad Rosierc8e56e82012-12-05 21:08:21 +00004365 // -fno-asm-blocks is default.
4366 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4367 false))
4368 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004369
Steven Wucb0d13f2015-01-16 23:05:28 +00004370 // -fgnu-inline-asm is default.
4371 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4372 options::OPT_fno_gnu_inline_asm, true))
4373 CmdArgs.push_back("-fno-gnu-inline-asm");
4374
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004375 // Enable vectorization per default according to the optimization level
4376 // selected. For optimization levels that want vectorization we use the alias
4377 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004378 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004379 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004380 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004381 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004382 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004383 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004384
Chad Rosier136d67d2014-04-28 19:30:57 +00004385 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004386 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4387 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004388 options::OPT_fslp_vectorize;
4389 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004390 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004391 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004392
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004393 // -fno-slp-vectorize-aggressive is default.
4394 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004395 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004396 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004397
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004398 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4399 A->render(Args, CmdArgs);
4400
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004401 // -fdollars-in-identifiers default varies depending on platform and
4402 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004403 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004404 options::OPT_fno_dollars_in_identifiers)) {
4405 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004406 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004407 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004408 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004409 }
4410
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004411 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4412 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004413 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004414 options::OPT_fno_unit_at_a_time)) {
4415 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004416 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004417 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004418
Eli Friedman055c9702011-11-02 01:53:16 +00004419 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4420 options::OPT_fno_apple_pragma_pack, false))
4421 CmdArgs.push_back("-fapple-pragma-pack");
4422
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004423 // le32-specific flags:
4424 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4425 // by default.
4426 if (getToolChain().getArch() == llvm::Triple::le32) {
4427 CmdArgs.push_back("-fno-math-builtin");
4428 }
4429
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004430 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004431 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004432 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004433#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004434 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004435 (getToolChain().getArch() == llvm::Triple::arm ||
4436 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004437 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4438 CmdArgs.push_back("-fno-builtin-strcat");
4439 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4440 CmdArgs.push_back("-fno-builtin-strcpy");
4441 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004442#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004443
Justin Bognera88f0122014-06-20 22:59:50 +00004444 // Enable rewrite includes if the user's asked for it or if we're generating
4445 // diagnostics.
4446 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4447 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004448 if (Args.hasFlag(options::OPT_frewrite_includes,
4449 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004450 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004451 CmdArgs.push_back("-frewrite-includes");
4452
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004453 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004454 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004455 options::OPT_traditional_cpp)) {
4456 if (isa<PreprocessJobAction>(JA))
4457 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004458 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004459 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004460 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004461
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004462 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004463 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004464
4465 // Handle serialized diagnostics.
4466 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4467 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004468 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004469 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004470
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004471 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4472 CmdArgs.push_back("-fretain-comments-from-system-headers");
4473
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004474 // Forward -fcomment-block-commands to -cc1.
4475 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004476 // Forward -fparse-all-comments to -cc1.
4477 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004478
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004479 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4480 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004481 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004482 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004483 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4484 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004485 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004486
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004487 // We translate this by hand to the -cc1 argument, since nightly test uses
4488 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004489 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004490 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004491 OptDisabled = true;
4492 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004493 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004494 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004495
Bob Wilson23a55f12014-12-21 07:00:00 +00004496 // With -save-temps, we want to save the unoptimized bitcode output from the
4497 // CompileJobAction, so disable optimizations if they are not already
4498 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004499 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004500 isa<CompileJobAction>(JA))
4501 CmdArgs.push_back("-disable-llvm-optzns");
4502
Daniel Dunbard67a3222009-03-30 06:36:42 +00004503 if (Output.getType() == types::TY_Dependencies) {
4504 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004505 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004506 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004507 CmdArgs.push_back(Output.getFilename());
4508 } else {
4509 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004510 }
4511
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004512 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004513 addDashXForInput(Args, II, CmdArgs);
4514
Daniel Dunbarb440f562010-08-02 02:38:21 +00004515 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004516 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004517 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004518 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004519 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004520
Chris Lattnere9d7d782009-11-03 19:50:27 +00004521 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4522
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004523 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004524
4525 // Optionally embed the -cc1 level arguments into the debug info, for build
4526 // analysis.
4527 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004528 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004529 for (const auto &Arg : Args)
4530 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004531
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004532 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004533 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004534 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004535 SmallString<128> EscapedArg;
4536 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004537 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004538 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004539 }
4540 CmdArgs.push_back("-dwarf-debug-flags");
4541 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4542 }
4543
Eric Christopherd3804002013-02-22 20:12:52 +00004544 // Add the split debug info name to the command lines here so we
4545 // can propagate it to the backend.
4546 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004547 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004548 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4549 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004550 const char *SplitDwarfOut;
4551 if (SplitDwarf) {
4552 CmdArgs.push_back("-split-dwarf-file");
4553 SplitDwarfOut = SplitDebugName(Args, Inputs);
4554 CmdArgs.push_back(SplitDwarfOut);
4555 }
4556
4557 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004558 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004559 Output.getType() == types::TY_Object &&
4560 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004561 auto CLCommand =
4562 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4563 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4564 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004565 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004566 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004567 }
4568
Daniel Dunbar17731772009-03-23 19:03:36 +00004569
Eric Christopherf1545832013-02-22 23:50:16 +00004570 // Handle the debug info splitting at object creation time if we're
4571 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004572 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004573 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004574 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004575
Roman Divacky178e01602011-02-10 16:52:03 +00004576 if (Arg *A = Args.getLastArg(options::OPT_pg))
4577 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004578 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004579 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004580
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004581 // Claim some arguments which clang supports automatically.
4582
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004583 // -fpch-preprocess is used with gcc to add a special marker in the output to
4584 // include the PCH file. Clang's PTH solution is completely transparent, so we
4585 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004586 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004587
Daniel Dunbar17731772009-03-23 19:03:36 +00004588 // Claim some arguments which clang doesn't support, but we don't
4589 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004590 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4591 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004592
Rafael Espindolab0092d72013-09-04 19:37:35 +00004593 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004594 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004595}
4596
John McCall5fb5df92012-06-20 06:18:46 +00004597/// Add options related to the Objective-C runtime/ABI.
4598///
4599/// Returns true if the runtime is non-fragile.
4600ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4601 ArgStringList &cmdArgs,
4602 RewriteKind rewriteKind) const {
4603 // Look for the controlling runtime option.
4604 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4605 options::OPT_fgnu_runtime,
4606 options::OPT_fobjc_runtime_EQ);
4607
4608 // Just forward -fobjc-runtime= to the frontend. This supercedes
4609 // options about fragility.
4610 if (runtimeArg &&
4611 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4612 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004613 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004614 if (runtime.tryParse(value)) {
4615 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4616 << value;
4617 }
4618
4619 runtimeArg->render(args, cmdArgs);
4620 return runtime;
4621 }
4622
4623 // Otherwise, we'll need the ABI "version". Version numbers are
4624 // slightly confusing for historical reasons:
4625 // 1 - Traditional "fragile" ABI
4626 // 2 - Non-fragile ABI, version 1
4627 // 3 - Non-fragile ABI, version 2
4628 unsigned objcABIVersion = 1;
4629 // If -fobjc-abi-version= is present, use that to set the version.
4630 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004631 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004632 if (value == "1")
4633 objcABIVersion = 1;
4634 else if (value == "2")
4635 objcABIVersion = 2;
4636 else if (value == "3")
4637 objcABIVersion = 3;
4638 else
4639 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4640 << value;
4641 } else {
4642 // Otherwise, determine if we are using the non-fragile ABI.
4643 bool nonFragileABIIsDefault =
4644 (rewriteKind == RK_NonFragile ||
4645 (rewriteKind == RK_None &&
4646 getToolChain().IsObjCNonFragileABIDefault()));
4647 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4648 options::OPT_fno_objc_nonfragile_abi,
4649 nonFragileABIIsDefault)) {
4650 // Determine the non-fragile ABI version to use.
4651#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4652 unsigned nonFragileABIVersion = 1;
4653#else
4654 unsigned nonFragileABIVersion = 2;
4655#endif
4656
4657 if (Arg *abiArg = args.getLastArg(
4658 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004659 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004660 if (value == "1")
4661 nonFragileABIVersion = 1;
4662 else if (value == "2")
4663 nonFragileABIVersion = 2;
4664 else
4665 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4666 << value;
4667 }
4668
4669 objcABIVersion = 1 + nonFragileABIVersion;
4670 } else {
4671 objcABIVersion = 1;
4672 }
4673 }
4674
4675 // We don't actually care about the ABI version other than whether
4676 // it's non-fragile.
4677 bool isNonFragile = objcABIVersion != 1;
4678
4679 // If we have no runtime argument, ask the toolchain for its default runtime.
4680 // However, the rewriter only really supports the Mac runtime, so assume that.
4681 ObjCRuntime runtime;
4682 if (!runtimeArg) {
4683 switch (rewriteKind) {
4684 case RK_None:
4685 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4686 break;
4687 case RK_Fragile:
4688 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4689 break;
4690 case RK_NonFragile:
4691 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4692 break;
4693 }
4694
4695 // -fnext-runtime
4696 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4697 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004698 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004699 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4700
4701 // Otherwise, build for a generic macosx port.
4702 } else {
4703 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4704 }
4705
4706 // -fgnu-runtime
4707 } else {
4708 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004709 // Legacy behaviour is to target the gnustep runtime if we are i
4710 // non-fragile mode or the GCC runtime in fragile mode.
4711 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004712 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004713 else
4714 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004715 }
4716
4717 cmdArgs.push_back(args.MakeArgString(
4718 "-fobjc-runtime=" + runtime.getAsString()));
4719 return runtime;
4720}
4721
Reid Klecknerc542d372014-06-27 17:02:02 +00004722static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4723 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4724 I += HaveDash;
4725 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004726}
Reid Klecknerc542d372014-06-27 17:02:02 +00004727
4728struct EHFlags {
4729 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4730 bool Synch;
4731 bool Asynch;
4732 bool NoExceptC;
4733};
4734
4735/// /EH controls whether to run destructor cleanups when exceptions are
4736/// thrown. There are three modifiers:
4737/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4738/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4739/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4740/// - c: Assume that extern "C" functions are implicitly noexcept. This
4741/// modifier is an optimization, so we ignore it for now.
4742/// The default is /EHs-c-, meaning cleanups are disabled.
4743static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4744 EHFlags EH;
4745 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4746 for (auto EHVal : EHArgs) {
4747 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4748 switch (EHVal[I]) {
4749 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4750 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4751 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4752 default: break;
4753 }
4754 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4755 break;
4756 }
4757 }
4758 return EH;
4759}
4760
Hans Wennborg75958c42013-08-08 00:17:41 +00004761void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4762 unsigned RTOptionID = options::OPT__SLASH_MT;
4763
Hans Wennborgf1a74252013-09-10 20:18:04 +00004764 if (Args.hasArg(options::OPT__SLASH_LDd))
4765 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4766 // but defining _DEBUG is sticky.
4767 RTOptionID = options::OPT__SLASH_MTd;
4768
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004769 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004770 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004771
Hans Wennborg75958c42013-08-08 00:17:41 +00004772 switch(RTOptionID) {
4773 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004774 if (Args.hasArg(options::OPT__SLASH_LDd))
4775 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004776 CmdArgs.push_back("-D_MT");
4777 CmdArgs.push_back("-D_DLL");
4778 CmdArgs.push_back("--dependent-lib=msvcrt");
4779 break;
4780 case options::OPT__SLASH_MDd:
4781 CmdArgs.push_back("-D_DEBUG");
4782 CmdArgs.push_back("-D_MT");
4783 CmdArgs.push_back("-D_DLL");
4784 CmdArgs.push_back("--dependent-lib=msvcrtd");
4785 break;
4786 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004787 if (Args.hasArg(options::OPT__SLASH_LDd))
4788 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004789 CmdArgs.push_back("-D_MT");
4790 CmdArgs.push_back("--dependent-lib=libcmt");
4791 break;
4792 case options::OPT__SLASH_MTd:
4793 CmdArgs.push_back("-D_DEBUG");
4794 CmdArgs.push_back("-D_MT");
4795 CmdArgs.push_back("--dependent-lib=libcmtd");
4796 break;
4797 default:
4798 llvm_unreachable("Unexpected option ID.");
4799 }
4800
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004801 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4802 // users want. The /Za flag to cl.exe turns this off, but it's not
4803 // implemented in clang.
4804 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004805
Hans Wennborg8858a032014-07-21 23:42:07 +00004806 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4807 // would produce interleaved output, so ignore /showIncludes in such cases.
4808 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4809 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4810 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004811
David Majnemerf6072342014-07-01 22:24:56 +00004812 // This controls whether or not we emit RTTI data for polymorphic types.
4813 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4814 /*default=*/false))
4815 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004816
Reid Klecknerc542d372014-06-27 17:02:02 +00004817 const Driver &D = getToolChain().getDriver();
4818 EHFlags EH = parseClangCLEHFlags(D, Args);
4819 // FIXME: Do something with NoExceptC.
Reid Klecknerab80f182015-01-30 01:04:16 +00004820 if (EH.Synch || EH.Asynch)
Reid Klecknerc542d372014-06-27 17:02:02 +00004821 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerab80f182015-01-30 01:04:16 +00004822 // Always add -fexceptions to allow SEH __try.
4823 CmdArgs.push_back("-fexceptions");
Reid Klecknerc542d372014-06-27 17:02:02 +00004824
Hans Wennborge50cec32014-06-13 20:59:54 +00004825 // /EP should expand to -E -P.
4826 if (Args.hasArg(options::OPT__SLASH_EP)) {
4827 CmdArgs.push_back("-E");
4828 CmdArgs.push_back("-P");
4829 }
4830
David Majnemer86c318f2014-02-11 21:05:00 +00004831 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4832 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4833 if (MostGeneralArg && BestCaseArg)
4834 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4835 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4836
4837 if (MostGeneralArg) {
4838 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4839 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4840 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4841
4842 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4843 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4844 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4845 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4846 << FirstConflict->getAsString(Args)
4847 << SecondConflict->getAsString(Args);
4848
4849 if (SingleArg)
4850 CmdArgs.push_back("-fms-memptr-rep=single");
4851 else if (MultipleArg)
4852 CmdArgs.push_back("-fms-memptr-rep=multiple");
4853 else
4854 CmdArgs.push_back("-fms-memptr-rep=virtual");
4855 }
4856
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004857 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4858 A->render(Args, CmdArgs);
4859
Hans Wennborg81f74482013-09-10 01:07:07 +00004860 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4861 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004862 if (Args.hasArg(options::OPT__SLASH_fallback))
4863 CmdArgs.push_back("msvc-fallback");
4864 else
4865 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004866 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004867}
4868
Hans Wennborg1da044a2014-06-26 19:59:02 +00004869visualstudio::Compile *Clang::getCLFallback() const {
4870 if (!CLFallback)
4871 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4872 return CLFallback.get();
4873}
4874
Daniel Sanders7f933f42015-01-30 17:35:23 +00004875void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
4876 ArgStringList &CmdArgs) const {
4877 StringRef CPUName;
4878 StringRef ABIName;
4879 const llvm::Triple &Triple = getToolChain().getTriple();
4880 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4881
4882 CmdArgs.push_back("-target-abi");
4883 CmdArgs.push_back(ABIName.data());
4884}
4885
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004886void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004887 const InputInfo &Output,
4888 const InputInfoList &Inputs,
4889 const ArgList &Args,
4890 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004891 ArgStringList CmdArgs;
4892
4893 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4894 const InputInfo &Input = Inputs[0];
4895
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004896 // Don't warn about "clang -w -c foo.s"
4897 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004898 // and "clang -emit-llvm -c foo.s"
4899 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004900
Rafael Espindola577637a2015-01-03 00:06:04 +00004901 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00004902
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004903 // Invoke ourselves in -cc1as mode.
4904 //
4905 // FIXME: Implement custom jobs for internal actions.
4906 CmdArgs.push_back("-cc1as");
4907
4908 // Add the "effective" target triple.
4909 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004910 std::string TripleStr =
4911 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004912 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4913
4914 // Set the output mode, we currently only expect to be used as a real
4915 // assembler.
4916 CmdArgs.push_back("-filetype");
4917 CmdArgs.push_back("obj");
4918
Eric Christopher45f2e712012-12-18 00:31:10 +00004919 // Set the main file name, so that debug info works even with
4920 // -save-temps or preprocessed assembly.
4921 CmdArgs.push_back("-main-file-name");
4922 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4923
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004924 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004925 const llvm::Triple &Triple = getToolChain().getTriple();
4926 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004927 if (!CPU.empty()) {
4928 CmdArgs.push_back("-target-cpu");
4929 CmdArgs.push_back(Args.MakeArgString(CPU));
4930 }
4931
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004932 // Add the target features
4933 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004934 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004935
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004936 // Ignore explicit -force_cpusubtype_ALL option.
4937 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004938
Eric Christopherfc3ee562012-01-10 00:38:01 +00004939 // Determine the original source input.
4940 const Action *SourceAction = &JA;
4941 while (SourceAction->getKind() != Action::InputClass) {
4942 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4943 SourceAction = SourceAction->getInputs()[0];
4944 }
4945
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004946 // Forward -g and handle debug info related flags, assuming we are dealing
4947 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004948 if (SourceAction->getType() == types::TY_Asm ||
4949 SourceAction->getType() == types::TY_PP_Asm) {
4950 Args.ClaimAllArgs(options::OPT_g_Group);
4951 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4952 if (!A->getOption().matches(options::OPT_g0))
4953 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004954
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004955 if (Args.hasArg(options::OPT_gdwarf_2))
4956 CmdArgs.push_back("-gdwarf-2");
4957 if (Args.hasArg(options::OPT_gdwarf_3))
4958 CmdArgs.push_back("-gdwarf-3");
4959 if (Args.hasArg(options::OPT_gdwarf_4))
4960 CmdArgs.push_back("-gdwarf-4");
4961
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004962 // Add the -fdebug-compilation-dir flag if needed.
4963 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004964
4965 // Set the AT_producer to the clang version when using the integrated
4966 // assembler on assembly source files.
4967 CmdArgs.push_back("-dwarf-debug-producer");
4968 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004969 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004970
4971 // Optionally embed the -cc1as level arguments into the debug info, for build
4972 // analysis.
4973 if (getToolChain().UseDwarfDebugFlags()) {
4974 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004975 for (const auto &Arg : Args)
4976 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004977
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004978 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004979 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4980 Flags += Exec;
4981 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004982 SmallString<128> EscapedArg;
4983 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00004984 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004985 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00004986 }
4987 CmdArgs.push_back("-dwarf-debug-flags");
4988 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4989 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004990
4991 // FIXME: Add -static support, once we have it.
4992
Daniel Sanders7f933f42015-01-30 17:35:23 +00004993 // Add target specific flags.
4994 switch(getToolChain().getArch()) {
4995 default:
4996 break;
4997
4998 case llvm::Triple::mips:
4999 case llvm::Triple::mipsel:
5000 case llvm::Triple::mips64:
5001 case llvm::Triple::mips64el:
5002 AddMIPSTargetArgs(Args, CmdArgs);
5003 break;
5004 }
5005
David Blaikie372d9502014-01-17 03:17:40 +00005006 // Consume all the warning flags. Usually this would be handled more
5007 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5008 // doesn't handle that so rather than warning about unused flags that are
5009 // actually used, we'll lie by omission instead.
5010 // FIXME: Stop lying and consume only the appropriate driver flags
5011 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5012 ie = Args.filtered_end();
5013 it != ie; ++it)
5014 (*it)->claim();
5015
David Blaikie9260ed62013-07-25 21:19:01 +00005016 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5017 getToolChain().getDriver());
5018
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005019 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005020
5021 assert(Output.isFilename() && "Unexpected lipo output.");
5022 CmdArgs.push_back("-o");
5023 CmdArgs.push_back(Output.getFilename());
5024
Daniel Dunbarb440f562010-08-02 02:38:21 +00005025 assert(Input.isFilename() && "Invalid input.");
5026 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005027
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005028 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005029 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005030
5031 // Handle the debug info splitting at object creation time if we're
5032 // creating an object.
5033 // TODO: Currently only works on linux with newer objcopy.
5034 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005035 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005036 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5037 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005038}
5039
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005040void GnuTool::anchor() {}
5041
Daniel Dunbara3246a02009-03-18 08:07:30 +00005042void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005043 const InputInfo &Output,
5044 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005045 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005046 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005047 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005048 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005049
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005050 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005051 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005052 // Don't forward any -g arguments to assembly steps.
5053 if (isa<AssembleJobAction>(JA) &&
5054 A->getOption().matches(options::OPT_g_Group))
5055 continue;
5056
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005057 // Don't forward any -W arguments to assembly and link steps.
5058 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5059 A->getOption().matches(options::OPT_W_Group))
5060 continue;
5061
Daniel Dunbar2da02722009-03-19 07:55:12 +00005062 // It is unfortunate that we have to claim here, as this means
5063 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005064 // platforms using a generic gcc, even if we are just using gcc
5065 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005066 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005067 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005068 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005069 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005070
Daniel Dunbar4e295052010-01-25 22:35:08 +00005071 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005072
5073 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005074 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005075 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005076 CmdArgs.push_back(
5077 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005078 }
5079
Daniel Dunbar5716d872009-05-02 21:41:52 +00005080 // Try to force gcc to match the tool chain we want, if we recognize
5081 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005082 //
5083 // FIXME: The triple class should directly provide the information we want
5084 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005085 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005086 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005087 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005088 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5089 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005090 CmdArgs.push_back("-m64");
5091
Daniel Dunbarb440f562010-08-02 02:38:21 +00005092 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005093 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005094 CmdArgs.push_back(Output.getFilename());
5095 } else {
5096 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005097 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005098 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005099
Tony Linthicum76329bf2011-12-12 21:14:55 +00005100 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5101 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005102
5103 // Only pass -x if gcc will understand it; otherwise hope gcc
5104 // understands the suffix correctly. The main use case this would go
5105 // wrong in is for linker inputs if they happened to have an odd
5106 // suffix; really the only way to get this to happen is a command
5107 // like '-x foobar a.c' which will treat a.c like a linker input.
5108 //
5109 // FIXME: For the linker case specifically, can we safely convert
5110 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005111 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005112 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005113 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5114 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005115 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005116 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005117 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005118 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005119 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005120 else if (II.getType() == types::TY_ModuleFile)
5121 D.Diag(diag::err_drv_no_module_support)
5122 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005123
Daniel Dunbara3246a02009-03-18 08:07:30 +00005124 if (types::canTypeBeUserSpecified(II.getType())) {
5125 CmdArgs.push_back("-x");
5126 CmdArgs.push_back(types::getTypeName(II.getType()));
5127 }
5128
Daniel Dunbarb440f562010-08-02 02:38:21 +00005129 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005130 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005131 else {
5132 const Arg &A = II.getInputArg();
5133
5134 // Reverse translate some rewritten options.
5135 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5136 CmdArgs.push_back("-lstdc++");
5137 continue;
5138 }
5139
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005140 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005141 A.render(Args, CmdArgs);
5142 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005143 }
5144
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005145 const std::string customGCCName = D.getCCCGenericGCCName();
5146 const char *GCCName;
5147 if (!customGCCName.empty())
5148 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005149 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005150 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005151 } else
5152 GCCName = "gcc";
5153
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005154 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005155 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005156 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005157}
5158
Daniel Dunbar4e295052010-01-25 22:35:08 +00005159void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5160 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005161 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005162}
5163
Daniel Dunbar4e295052010-01-25 22:35:08 +00005164void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5165 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005166 const Driver &D = getToolChain().getDriver();
5167
Eric Christophercc7ff502015-01-29 00:56:17 +00005168 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005169 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005170 case types::TY_LLVM_IR:
5171 case types::TY_LTO_IR:
5172 case types::TY_LLVM_BC:
5173 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005174 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005175 break;
5176 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005177 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005178 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005179 case types::TY_Nothing:
5180 CmdArgs.push_back("-fsyntax-only");
5181 break;
5182 default:
5183 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005184 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005185}
5186
Daniel Dunbar4e295052010-01-25 22:35:08 +00005187void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5188 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005189 // The types are (hopefully) good enough.
5190}
5191
Tony Linthicum76329bf2011-12-12 21:14:55 +00005192// Hexagon tools start.
5193void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5194 ArgStringList &CmdArgs) const {
5195
5196}
5197void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5198 const InputInfo &Output,
5199 const InputInfoList &Inputs,
5200 const ArgList &Args,
5201 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005202 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005203
5204 const Driver &D = getToolChain().getDriver();
5205 ArgStringList CmdArgs;
5206
5207 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005208 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005209 CmdArgs.push_back(Args.MakeArgString(MarchString));
5210
5211 RenderExtraToolArgs(JA, CmdArgs);
5212
5213 if (Output.isFilename()) {
5214 CmdArgs.push_back("-o");
5215 CmdArgs.push_back(Output.getFilename());
5216 } else {
5217 assert(Output.isNothing() && "Unexpected output");
5218 CmdArgs.push_back("-fsyntax-only");
5219 }
5220
Matthew Curtise8f80a12012-12-06 17:49:03 +00005221 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5222 if (!SmallDataThreshold.empty())
5223 CmdArgs.push_back(
5224 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005225
Matthew Curtise5df3812012-12-07 17:23:04 +00005226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5227 options::OPT_Xassembler);
5228
Tony Linthicum76329bf2011-12-12 21:14:55 +00005229 // Only pass -x if gcc will understand it; otherwise hope gcc
5230 // understands the suffix correctly. The main use case this would go
5231 // wrong in is for linker inputs if they happened to have an odd
5232 // suffix; really the only way to get this to happen is a command
5233 // like '-x foobar a.c' which will treat a.c like a linker input.
5234 //
5235 // FIXME: For the linker case specifically, can we safely convert
5236 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005237 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005238 // Don't try to pass LLVM or AST inputs to a generic gcc.
5239 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5240 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5241 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5242 << getToolChain().getTripleString();
5243 else if (II.getType() == types::TY_AST)
5244 D.Diag(clang::diag::err_drv_no_ast_support)
5245 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005246 else if (II.getType() == types::TY_ModuleFile)
5247 D.Diag(diag::err_drv_no_module_support)
5248 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005249
5250 if (II.isFilename())
5251 CmdArgs.push_back(II.getFilename());
5252 else
5253 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5254 II.getInputArg().render(Args, CmdArgs);
5255 }
5256
5257 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005258 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005259 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005260}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005261
Tony Linthicum76329bf2011-12-12 21:14:55 +00005262void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5263 ArgStringList &CmdArgs) const {
5264 // The types are (hopefully) good enough.
5265}
5266
5267void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5268 const InputInfo &Output,
5269 const InputInfoList &Inputs,
5270 const ArgList &Args,
5271 const char *LinkingOutput) const {
5272
Matthew Curtise689b052012-12-06 15:46:07 +00005273 const toolchains::Hexagon_TC& ToolChain =
5274 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5275 const Driver &D = ToolChain.getDriver();
5276
Tony Linthicum76329bf2011-12-12 21:14:55 +00005277 ArgStringList CmdArgs;
5278
Matthew Curtise689b052012-12-06 15:46:07 +00005279 //----------------------------------------------------------------------------
5280 //
5281 //----------------------------------------------------------------------------
5282 bool hasStaticArg = Args.hasArg(options::OPT_static);
5283 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005284 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005285 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5286 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5287 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5288 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005289
Matthew Curtise689b052012-12-06 15:46:07 +00005290 //----------------------------------------------------------------------------
5291 // Silence warnings for various options
5292 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005293
Matthew Curtise689b052012-12-06 15:46:07 +00005294 Args.ClaimAllArgs(options::OPT_g_Group);
5295 Args.ClaimAllArgs(options::OPT_emit_llvm);
5296 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5297 // handled somewhere else.
5298 Args.ClaimAllArgs(options::OPT_static_libgcc);
5299
5300 //----------------------------------------------------------------------------
5301 //
5302 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005303 for (const auto &Opt : ToolChain.ExtraOpts)
5304 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005305
Matthew Curtisf10a5952012-12-06 14:16:43 +00005306 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5307 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005308
Matthew Curtise689b052012-12-06 15:46:07 +00005309 if (buildingLib) {
5310 CmdArgs.push_back("-shared");
5311 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5312 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005313 }
5314
Matthew Curtise689b052012-12-06 15:46:07 +00005315 if (hasStaticArg)
5316 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005317
Matthew Curtise8f80a12012-12-06 17:49:03 +00005318 if (buildPIE && !buildingLib)
5319 CmdArgs.push_back("-pie");
5320
5321 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5322 if (!SmallDataThreshold.empty()) {
5323 CmdArgs.push_back(
5324 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5325 }
5326
Matthew Curtise689b052012-12-06 15:46:07 +00005327 //----------------------------------------------------------------------------
5328 //
5329 //----------------------------------------------------------------------------
5330 CmdArgs.push_back("-o");
5331 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005332
Matthew Curtise689b052012-12-06 15:46:07 +00005333 const std::string MarchSuffix = "/" + MarchString;
5334 const std::string G0Suffix = "/G0";
5335 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005336 const std::string RootDir =
5337 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005338 const std::string StartFilesDir = RootDir
5339 + "hexagon/lib"
5340 + (buildingLib
5341 ? MarchG0Suffix : MarchSuffix);
5342
5343 //----------------------------------------------------------------------------
5344 // moslib
5345 //----------------------------------------------------------------------------
5346 std::vector<std::string> oslibs;
5347 bool hasStandalone= false;
5348
5349 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5350 ie = Args.filtered_end(); it != ie; ++it) {
5351 (*it)->claim();
5352 oslibs.push_back((*it)->getValue());
5353 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005354 }
Matthew Curtise689b052012-12-06 15:46:07 +00005355 if (oslibs.empty()) {
5356 oslibs.push_back("standalone");
5357 hasStandalone = true;
5358 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005359
Matthew Curtise689b052012-12-06 15:46:07 +00005360 //----------------------------------------------------------------------------
5361 // Start Files
5362 //----------------------------------------------------------------------------
5363 if (incStdLib && incStartFiles) {
5364
5365 if (!buildingLib) {
5366 if (hasStandalone) {
5367 CmdArgs.push_back(
5368 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5369 }
5370 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5371 }
5372 std::string initObj = useShared ? "/initS.o" : "/init.o";
5373 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5374 }
5375
5376 //----------------------------------------------------------------------------
5377 // Library Search Paths
5378 //----------------------------------------------------------------------------
5379 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005380 for (const auto &LibPath : LibPaths)
5381 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005382
5383 //----------------------------------------------------------------------------
5384 //
5385 //----------------------------------------------------------------------------
5386 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5387 Args.AddAllArgs(CmdArgs, options::OPT_e);
5388 Args.AddAllArgs(CmdArgs, options::OPT_s);
5389 Args.AddAllArgs(CmdArgs, options::OPT_t);
5390 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5391
5392 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5393
5394 //----------------------------------------------------------------------------
5395 // Libraries
5396 //----------------------------------------------------------------------------
5397 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005398 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005399 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5400 CmdArgs.push_back("-lm");
5401 }
5402
5403 CmdArgs.push_back("--start-group");
5404
5405 if (!buildingLib) {
5406 for(std::vector<std::string>::iterator i = oslibs.begin(),
5407 e = oslibs.end(); i != e; ++i)
5408 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5409 CmdArgs.push_back("-lc");
5410 }
5411 CmdArgs.push_back("-lgcc");
5412
5413 CmdArgs.push_back("--end-group");
5414 }
5415
5416 //----------------------------------------------------------------------------
5417 // End files
5418 //----------------------------------------------------------------------------
5419 if (incStdLib && incStartFiles) {
5420 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5421 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5422 }
5423
5424 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005425 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5426 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005427}
5428// Hexagon tools end.
5429
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005430/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005431const char *arm::getARMCPUForMArch(const ArgList &Args,
5432 const llvm::Triple &Triple) {
5433 StringRef MArch;
5434 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5435 // Otherwise, if we have -march= choose the base CPU for that arch.
5436 MArch = A->getValue();
5437 } else {
5438 // Otherwise, use the Arch from the triple.
5439 MArch = Triple.getArchName();
5440 }
5441
5442 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005443 if (MArch == "native") {
5444 std::string CPU = llvm::sys::getHostCPUName();
5445 if (CPU != "generic") {
5446 // Translate the native cpu into the architecture. The switch below will
5447 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005448 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005449 }
5450 }
5451
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005452 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005453}
5454
5455/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005456StringRef arm::getARMTargetCPU(const ArgList &Args,
5457 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005458 // FIXME: Warn on inconsistent use of -mcpu and -march.
5459 // If we have -mcpu=, use that.
5460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5461 StringRef MCPU = A->getValue();
5462 // Handle -mcpu=native.
5463 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005464 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005465 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005466 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005467 }
5468
5469 return getARMCPUForMArch(Args, Triple);
5470}
5471
5472/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5473/// CPU.
5474//
5475// FIXME: This is redundant with -mcpu, why does LLVM use this.
5476// FIXME: tblgen this, or kill it!
5477const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5478 return llvm::StringSwitch<const char *>(CPU)
5479 .Case("strongarm", "v4")
5480 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5481 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5482 .Cases("arm920", "arm920t", "arm922t", "v4t")
5483 .Cases("arm940t", "ep9312","v4t")
5484 .Cases("arm10tdmi", "arm1020t", "v5")
5485 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5486 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5487 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5488 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5489 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5490 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005491 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005492 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005493 .Cases("cortex-r4", "cortex-r5", "v7r")
5494 .Case("cortex-m0", "v6m")
5495 .Case("cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005496 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005497 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005498 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005499 .Cases("cortex-a53", "cortex-a57", "v8")
5500 .Default("");
5501}
5502
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005503void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5504 if (Args.hasArg(options::OPT_r))
5505 return;
5506
5507 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5508 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5509 .Cases("v4", "v4t", "v5", "v5e", nullptr)
5510 .Cases("v6", "v6t2", nullptr)
5511 .Default("--be8");
5512
5513 if (LinkFlag)
5514 CmdArgs.push_back(LinkFlag);
5515}
5516
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005517bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5518 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5519 return A && (A->getValue() == StringRef(Value));
5520}
5521
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005522bool mips::isUCLibc(const ArgList &Args) {
5523 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005524 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005525}
5526
Daniel Sanders2bf13662014-07-10 14:40:57 +00005527bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005528 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5529 return llvm::StringSwitch<bool>(NaNArg->getValue())
5530 .Case("2008", true)
5531 .Case("legacy", false)
5532 .Default(false);
5533
5534 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005535 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5536 .Cases("mips32r6", "mips64r6", true)
5537 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005538
5539 return false;
5540}
5541
Daniel Sanders379d44b2014-07-16 11:52:23 +00005542bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5543 StringRef ABIName) {
5544 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005545 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005546 return false;
5547
5548 if (ABIName != "32")
5549 return false;
5550
5551 return llvm::StringSwitch<bool>(CPUName)
5552 .Cases("mips2", "mips3", "mips4", "mips5", true)
5553 .Cases("mips32", "mips32r2", true)
5554 .Cases("mips64", "mips64r2", true)
5555 .Default(false);
5556}
5557
Tim Northover157d9112014-01-16 08:48:16 +00005558llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005559 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5560 // archs which Darwin doesn't use.
5561
5562 // The matching this routine does is fairly pointless, since it is neither the
5563 // complete architecture list, nor a reasonable subset. The problem is that
5564 // historically the driver driver accepts this and also ties its -march=
5565 // handling to the architecture name, so we need to be careful before removing
5566 // support for it.
5567
5568 // This code must be kept in sync with Clang's Darwin specific argument
5569 // translation.
5570
5571 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5572 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5573 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5574 .Case("ppc64", llvm::Triple::ppc64)
5575 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5576 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5577 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005578 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005579 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005580 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005581 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005582 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005583 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005584 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005585 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005586 .Case("nvptx", llvm::Triple::nvptx)
5587 .Case("nvptx64", llvm::Triple::nvptx64)
5588 .Case("amdil", llvm::Triple::amdil)
5589 .Case("spir", llvm::Triple::spir)
5590 .Default(llvm::Triple::UnknownArch);
5591}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005592
Tim Northover157d9112014-01-16 08:48:16 +00005593void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5594 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5595 T.setArch(Arch);
5596
5597 if (Str == "x86_64h")
5598 T.setArchName(Str);
5599 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5600 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005601 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005602 }
5603}
5604
Bob Wilsondecc03e2012-11-23 06:14:39 +00005605const char *Clang::getBaseInputName(const ArgList &Args,
5606 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005607 return Args.MakeArgString(
5608 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005609}
5610
Bob Wilsondecc03e2012-11-23 06:14:39 +00005611const char *Clang::getBaseInputStem(const ArgList &Args,
5612 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005613 const char *Str = getBaseInputName(Args, Inputs);
5614
Chris Lattner906bb902011-01-16 08:14:11 +00005615 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005616 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005617
5618 return Str;
5619}
5620
Bob Wilsondecc03e2012-11-23 06:14:39 +00005621const char *Clang::getDependencyFileName(const ArgList &Args,
5622 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005623 // FIXME: Think about this more.
5624 std::string Res;
5625
5626 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005627 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005628 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005629 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005630 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005631 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005632 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005633}
5634
Daniel Dunbarbe220842009-03-20 16:06:39 +00005635void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005636 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005637 const InputInfoList &Inputs,
5638 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005639 const char *LinkingOutput) const {
5640 ArgStringList CmdArgs;
5641
5642 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5643 const InputInfo &Input = Inputs[0];
5644
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005645 // Determine the original source input.
5646 const Action *SourceAction = &JA;
5647 while (SourceAction->getKind() != Action::InputClass) {
5648 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5649 SourceAction = SourceAction->getInputs()[0];
5650 }
5651
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005652 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005653 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005654 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5655 // FIXME: at run-time detect assembler capabilities or rely on version
5656 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005657 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005658 const llvm::Triple &T(getToolChain().getTriple());
5659 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005660 CmdArgs.push_back("-Q");
5661 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005662
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005663 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005664 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005665 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005666 if (Args.hasArg(options::OPT_gstabs))
5667 CmdArgs.push_back("--gstabs");
5668 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005669 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005670 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005671
Daniel Dunbarbe220842009-03-20 16:06:39 +00005672 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005673 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005674
Daniel Dunbar6d484762010-07-22 01:47:22 +00005675 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005676 if (getToolChain().getArch() == llvm::Triple::x86 ||
5677 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005678 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5679 CmdArgs.push_back("-force_cpusubtype_ALL");
5680
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005681 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005682 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005683 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005684 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005685 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005686 CmdArgs.push_back("-static");
5687
Daniel Dunbarbe220842009-03-20 16:06:39 +00005688 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5689 options::OPT_Xassembler);
5690
5691 assert(Output.isFilename() && "Unexpected lipo output.");
5692 CmdArgs.push_back("-o");
5693 CmdArgs.push_back(Output.getFilename());
5694
Daniel Dunbarb440f562010-08-02 02:38:21 +00005695 assert(Input.isFilename() && "Invalid input.");
5696 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005697
5698 // asm_final spec is empty.
5699
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005700 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005701 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005702 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005703}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005704
Tim Northover157d9112014-01-16 08:48:16 +00005705void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005706
Tim Northover157d9112014-01-16 08:48:16 +00005707void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5708 ArgStringList &CmdArgs) const {
5709 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005710
Daniel Dunbarc1964212009-03-26 16:23:12 +00005711 // Derived from darwin_arch spec.
5712 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005713 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005714
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005715 // FIXME: Is this needed anymore?
5716 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005717 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005718}
5719
Bill Wendling3b2000f2012-10-02 18:02:50 +00005720bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5721 // We only need to generate a temp path for LTO if we aren't compiling object
5722 // files. When compiling source files, we run 'dsymutil' after linking. We
5723 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005724 for (const auto &Input : Inputs)
5725 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005726 return true;
5727
5728 return false;
5729}
5730
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005731void darwin::Link::AddLinkArgs(Compilation &C,
5732 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005733 ArgStringList &CmdArgs,
5734 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005735 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005736 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005737
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005738 unsigned Version[3] = { 0, 0, 0 };
5739 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5740 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005741 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005742 Version[1], Version[2], HadExtra) ||
5743 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005744 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005745 << A->getAsString(Args);
5746 }
5747
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005748 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005749 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005750 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5751 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005752
Bob Wilson3d27dad2013-08-02 22:25:34 +00005753 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5754 CmdArgs.push_back("-export_dynamic");
5755
Bill Wendling313b6bf2012-11-16 23:03:00 +00005756 // If we are using LTO, then automatically create a temporary file path for
5757 // the linker to use, so that it's lifetime will extend past a possible
5758 // dsymutil step.
5759 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5760 const char *TmpPath = C.getArgs().MakeArgString(
5761 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5762 C.addTempFile(TmpPath);
5763 CmdArgs.push_back("-object_path_lto");
5764 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005765 }
5766
Daniel Dunbarc1964212009-03-26 16:23:12 +00005767 // Derived from the "link" spec.
5768 Args.AddAllArgs(CmdArgs, options::OPT_static);
5769 if (!Args.hasArg(options::OPT_static))
5770 CmdArgs.push_back("-dynamic");
5771 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5772 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5773 // here. How do we wish to handle such things?
5774 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005775
Daniel Dunbarc1964212009-03-26 16:23:12 +00005776 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005777 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005778 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005779 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005780
5781 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5782 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5783 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5784
5785 Arg *A;
5786 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5787 (A = Args.getLastArg(options::OPT_current__version)) ||
5788 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005789 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005790 << A->getAsString(Args) << "-dynamiclib";
5791
5792 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5793 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5794 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5795 } else {
5796 CmdArgs.push_back("-dylib");
5797
5798 Arg *A;
5799 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5800 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5801 (A = Args.getLastArg(options::OPT_client__name)) ||
5802 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5803 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5804 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005805 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005806 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005807
Daniel Dunbarc1964212009-03-26 16:23:12 +00005808 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5809 "-dylib_compatibility_version");
5810 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5811 "-dylib_current_version");
5812
Tim Northover157d9112014-01-16 08:48:16 +00005813 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005814
5815 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5816 "-dylib_install_name");
5817 }
5818
5819 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5820 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5821 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005822 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005823 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005824 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5825 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5826 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5827 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5828 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5829 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005830 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005831 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5832 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5833 Args.AddAllArgs(CmdArgs, options::OPT_init);
5834
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005835 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005836 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005837
Daniel Dunbarc1964212009-03-26 16:23:12 +00005838 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5839 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5840 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5841 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5842 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005843
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005844 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5845 options::OPT_fno_pie,
5846 options::OPT_fno_PIE)) {
5847 if (A->getOption().matches(options::OPT_fpie) ||
5848 A->getOption().matches(options::OPT_fPIE))
5849 CmdArgs.push_back("-pie");
5850 else
5851 CmdArgs.push_back("-no_pie");
5852 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005853
5854 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5855 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5856 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5857 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5858 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5859 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5860 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5861 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5862 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5863 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5864 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5865 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5866 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5867 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5868 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5869 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005870
Daniel Dunbar84384642011-05-02 21:03:47 +00005871 // Give --sysroot= preference, over the Apple specific behavior to also use
5872 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005873 StringRef sysroot = C.getSysRoot();
5874 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005875 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005876 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005877 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5878 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005879 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005880 }
5881
Daniel Dunbarc1964212009-03-26 16:23:12 +00005882 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5883 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5884 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5885 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5886 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005887 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005888 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5889 Args.AddAllArgs(CmdArgs, options::OPT_y);
5890 Args.AddLastArg(CmdArgs, options::OPT_w);
5891 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5892 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5893 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5894 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5895 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5896 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5897 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5898 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5899 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5900 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5901 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5902 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5903}
5904
Alexey Bataev186b28a2014-03-06 05:43:53 +00005905enum LibOpenMP {
5906 LibUnknown,
5907 LibGOMP,
5908 LibIOMP5
5909};
5910
Daniel Dunbarc1964212009-03-26 16:23:12 +00005911void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005912 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005913 const InputInfoList &Inputs,
5914 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005915 const char *LinkingOutput) const {
5916 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005917
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005918 // If the number of arguments surpasses the system limits, we will encode the
5919 // input files in a separate file, shortening the command line. To this end,
5920 // build a list of input file names that can be passed via a file with the
5921 // -filelist linker option.
5922 llvm::opt::ArgStringList InputFileList;
5923
Daniel Dunbarc1964212009-03-26 16:23:12 +00005924 // The logic here is derived from gcc's behavior; most of which
5925 // comes from specs (starting with link_command). Consult gcc for
5926 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005927 ArgStringList CmdArgs;
5928
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005929 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5930 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5931 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005932 for (const auto &Arg : Args)
5933 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005934 const char *Exec =
5935 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5936 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005937 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005938 return;
5939 }
5940
Daniel Dunbarc1964212009-03-26 16:23:12 +00005941 // I'm not sure why this particular decomposition exists in gcc, but
5942 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005943 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005944
Daniel Dunbarc1964212009-03-26 16:23:12 +00005945 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5946 Args.AddAllArgs(CmdArgs, options::OPT_s);
5947 Args.AddAllArgs(CmdArgs, options::OPT_t);
5948 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5949 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005950 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005951 Args.AddAllArgs(CmdArgs, options::OPT_r);
5952
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005953 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5954 // members of static archive libraries which implement Objective-C classes or
5955 // categories.
5956 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5957 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005958
Daniel Dunbarc1964212009-03-26 16:23:12 +00005959 CmdArgs.push_back("-o");
5960 CmdArgs.push_back(Output.getFilename());
5961
Chad Rosier06fd3c62012-05-16 23:45:12 +00005962 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005963 !Args.hasArg(options::OPT_nostartfiles))
5964 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005965
5966 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005967
Alexey Bataev186b28a2014-03-06 05:43:53 +00005968 LibOpenMP UsedOpenMPLib = LibUnknown;
5969 if (Args.hasArg(options::OPT_fopenmp)) {
5970 UsedOpenMPLib = LibGOMP;
5971 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5972 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5973 .Case("libgomp", LibGOMP)
5974 .Case("libiomp5", LibIOMP5)
5975 .Default(LibUnknown);
5976 if (UsedOpenMPLib == LibUnknown)
5977 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5978 << A->getOption().getName() << A->getValue();
5979 }
5980 switch (UsedOpenMPLib) {
5981 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005982 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005983 break;
5984 case LibIOMP5:
5985 CmdArgs.push_back("-liomp5");
5986 break;
5987 case LibUnknown:
5988 break;
5989 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005990
Douglas Gregor9295df02012-05-15 21:00:27 +00005991 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005992 // Build the input file for -filelist (list of linker input files) in case we
5993 // need it later
5994 for (const auto &II : Inputs) {
5995 if (!II.isFilename()) {
5996 // This is a linker input argument.
5997 // We cannot mix input arguments and file names in a -filelist input, thus
5998 // we prematurely stop our list (remaining files shall be passed as
5999 // arguments).
6000 if (InputFileList.size() > 0)
6001 break;
6002
6003 continue;
6004 }
6005
6006 InputFileList.push_back(II.getFilename());
6007 }
6008
Bob Wilson16d93952012-05-15 18:57:39 +00006009 if (isObjCRuntimeLinked(Args) &&
6010 !Args.hasArg(options::OPT_nostdlib) &&
6011 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006012 // We use arclite library for both ARC and subscripting support.
6013 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6014
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006015 CmdArgs.push_back("-framework");
6016 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006017 // Link libobj.
6018 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006019 }
John McCall31168b02011-06-15 23:02:42 +00006020
Daniel Dunbarc1964212009-03-26 16:23:12 +00006021 if (LinkingOutput) {
6022 CmdArgs.push_back("-arch_multiple");
6023 CmdArgs.push_back("-final_output");
6024 CmdArgs.push_back(LinkingOutput);
6025 }
6026
Daniel Dunbarc1964212009-03-26 16:23:12 +00006027 if (Args.hasArg(options::OPT_fnested_functions))
6028 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006029
Daniel Dunbarc1964212009-03-26 16:23:12 +00006030 if (!Args.hasArg(options::OPT_nostdlib) &&
6031 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006032 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006033 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006034
Daniel Dunbarc1964212009-03-26 16:23:12 +00006035 // link_ssp spec is empty.
6036
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006037 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006038 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006039 }
6040
Chad Rosier06fd3c62012-05-16 23:45:12 +00006041 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006042 !Args.hasArg(options::OPT_nostartfiles)) {
6043 // endfile_spec is empty.
6044 }
6045
6046 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6047 Args.AddAllArgs(CmdArgs, options::OPT_F);
6048
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006049 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006050 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006051 std::unique_ptr<Command> Cmd =
6052 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6053 Cmd->setInputFileList(std::move(InputFileList));
6054 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006055}
6056
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006057void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006058 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006059 const InputInfoList &Inputs,
6060 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006061 const char *LinkingOutput) const {
6062 ArgStringList CmdArgs;
6063
6064 CmdArgs.push_back("-create");
6065 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006066
6067 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006068 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006069
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006070 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006071 assert(II.isFilename() && "Unexpected lipo input.");
6072 CmdArgs.push_back(II.getFilename());
6073 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006074
6075 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006076 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006077}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006078
Daniel Dunbar88299622010-06-04 18:28:36 +00006079void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006080 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006081 const InputInfoList &Inputs,
6082 const ArgList &Args,
6083 const char *LinkingOutput) const {
6084 ArgStringList CmdArgs;
6085
Daniel Dunbareb86b042011-05-09 17:23:16 +00006086 CmdArgs.push_back("-o");
6087 CmdArgs.push_back(Output.getFilename());
6088
Daniel Dunbar88299622010-06-04 18:28:36 +00006089 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6090 const InputInfo &Input = Inputs[0];
6091 assert(Input.isFilename() && "Unexpected dsymutil input.");
6092 CmdArgs.push_back(Input.getFilename());
6093
Daniel Dunbar88299622010-06-04 18:28:36 +00006094 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006095 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006096 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006097}
6098
Eric Christopher551ef452011-08-23 17:56:55 +00006099void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006100 const InputInfo &Output,
6101 const InputInfoList &Inputs,
6102 const ArgList &Args,
6103 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006104 ArgStringList CmdArgs;
6105 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006106 CmdArgs.push_back("--debug-info");
6107 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006108 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006109
6110 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6111 const InputInfo &Input = Inputs[0];
6112 assert(Input.isFilename() && "Unexpected verify input");
6113
6114 // Grabbing the output of the earlier dsymutil run.
6115 CmdArgs.push_back(Input.getFilename());
6116
6117 const char *Exec =
6118 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006119 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006120}
6121
David Chisnallf571cde2012-02-15 13:39:01 +00006122void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6123 const InputInfo &Output,
6124 const InputInfoList &Inputs,
6125 const ArgList &Args,
6126 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006127 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006128 ArgStringList CmdArgs;
6129
6130 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6131 options::OPT_Xassembler);
6132
6133 CmdArgs.push_back("-o");
6134 CmdArgs.push_back(Output.getFilename());
6135
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006136 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006137 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006138
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006139 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006140 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006141}
6142
David Chisnallf571cde2012-02-15 13:39:01 +00006143void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6144 const InputInfo &Output,
6145 const InputInfoList &Inputs,
6146 const ArgList &Args,
6147 const char *LinkingOutput) const {
6148 // FIXME: Find a real GCC, don't hard-code versions here
6149 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6150 const llvm::Triple &T = getToolChain().getTriple();
6151 std::string LibPath = "/usr/lib/";
6152 llvm::Triple::ArchType Arch = T.getArch();
6153 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006154 case llvm::Triple::x86:
6155 GCCLibPath +=
6156 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6157 break;
6158 case llvm::Triple::x86_64:
6159 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6160 GCCLibPath += "/4.5.2/amd64/";
6161 LibPath += "amd64/";
6162 break;
6163 default:
6164 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006165 }
6166
6167 ArgStringList CmdArgs;
6168
David Chisnall272a0712012-02-29 15:06:12 +00006169 // Demangle C++ names in errors
6170 CmdArgs.push_back("-C");
6171
David Chisnallf571cde2012-02-15 13:39:01 +00006172 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6173 (!Args.hasArg(options::OPT_shared))) {
6174 CmdArgs.push_back("-e");
6175 CmdArgs.push_back("_start");
6176 }
6177
6178 if (Args.hasArg(options::OPT_static)) {
6179 CmdArgs.push_back("-Bstatic");
6180 CmdArgs.push_back("-dn");
6181 } else {
6182 CmdArgs.push_back("-Bdynamic");
6183 if (Args.hasArg(options::OPT_shared)) {
6184 CmdArgs.push_back("-shared");
6185 } else {
6186 CmdArgs.push_back("--dynamic-linker");
6187 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6188 }
6189 }
6190
6191 if (Output.isFilename()) {
6192 CmdArgs.push_back("-o");
6193 CmdArgs.push_back(Output.getFilename());
6194 } else {
6195 assert(Output.isNothing() && "Invalid output.");
6196 }
6197
6198 if (!Args.hasArg(options::OPT_nostdlib) &&
6199 !Args.hasArg(options::OPT_nostartfiles)) {
6200 if (!Args.hasArg(options::OPT_shared)) {
6201 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6202 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006203 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006204 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6205 } else {
6206 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006207 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6208 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006209 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006210 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006211 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006212 }
6213
6214 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6215
6216 Args.AddAllArgs(CmdArgs, options::OPT_L);
6217 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6218 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006219 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006220
6221 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6222
6223 if (!Args.hasArg(options::OPT_nostdlib) &&
6224 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006225 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006226 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006227 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006228 if (!Args.hasArg(options::OPT_shared)) {
6229 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006230 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006231 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006232 }
David Chisnallf571cde2012-02-15 13:39:01 +00006233 }
6234
6235 if (!Args.hasArg(options::OPT_nostdlib) &&
6236 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006237 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006238 }
David Chisnall96de9932012-02-16 16:00:47 +00006239 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006240
Alexey Samsonov7811d192014-02-20 13:57:37 +00006241 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006242
6243 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006244 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006245 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006246}
6247
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006248void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006249 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006250 const InputInfoList &Inputs,
6251 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006252 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006253 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006254 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006255 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006256
Rafael Espindolacc126272014-02-28 01:55:21 +00006257 switch (getToolChain().getArch()) {
6258 case llvm::Triple::x86:
6259 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6260 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006261 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006262 break;
6263
6264 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006265 CmdArgs.push_back("-mppc");
6266 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006267 break;
6268
6269 case llvm::Triple::sparc:
6270 CmdArgs.push_back("-32");
6271 NeedsKPIC = true;
6272 break;
6273
6274 case llvm::Triple::sparcv9:
6275 CmdArgs.push_back("-64");
6276 CmdArgs.push_back("-Av9a");
6277 NeedsKPIC = true;
6278 break;
6279
6280 case llvm::Triple::mips64:
6281 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006282 StringRef CPUName;
6283 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006284 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006285
6286 CmdArgs.push_back("-mabi");
6287 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6288
6289 if (getToolChain().getArch() == llvm::Triple::mips64)
6290 CmdArgs.push_back("-EB");
6291 else
6292 CmdArgs.push_back("-EL");
6293
Rafael Espindolacc126272014-02-28 01:55:21 +00006294 NeedsKPIC = true;
6295 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006296 }
6297
Rafael Espindolacc126272014-02-28 01:55:21 +00006298 default:
6299 break;
6300 }
6301
6302 if (NeedsKPIC)
6303 addAssemblerKPIC(Args, CmdArgs);
6304
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006305 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6306 options::OPT_Xassembler);
6307
6308 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006309 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006310
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006311 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006312 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006313
6314 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006315 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006316 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006317}
6318
6319void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006320 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006321 const InputInfoList &Inputs,
6322 const ArgList &Args,
6323 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006324 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006325 ArgStringList CmdArgs;
6326
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006327 // Silence warning for "clang -g foo.o -o foo"
6328 Args.ClaimAllArgs(options::OPT_g_Group);
6329 // and "clang -emit-llvm foo.o -o foo"
6330 Args.ClaimAllArgs(options::OPT_emit_llvm);
6331 // and for "clang -w foo.o -o foo". Other warning options are already
6332 // handled somewhere else.
6333 Args.ClaimAllArgs(options::OPT_w);
6334
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006335 if (getToolChain().getArch() == llvm::Triple::mips64)
6336 CmdArgs.push_back("-EB");
6337 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6338 CmdArgs.push_back("-EL");
6339
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006340 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006341 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006342 CmdArgs.push_back("-e");
6343 CmdArgs.push_back("__start");
6344 }
6345
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006346 if (Args.hasArg(options::OPT_static)) {
6347 CmdArgs.push_back("-Bstatic");
6348 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006349 if (Args.hasArg(options::OPT_rdynamic))
6350 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006351 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006352 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006353 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006354 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006355 } else {
6356 CmdArgs.push_back("-dynamic-linker");
6357 CmdArgs.push_back("/usr/libexec/ld.so");
6358 }
6359 }
6360
Rafael Espindola044f7832013-06-05 04:28:55 +00006361 if (Args.hasArg(options::OPT_nopie))
6362 CmdArgs.push_back("-nopie");
6363
Daniel Dunbarb440f562010-08-02 02:38:21 +00006364 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006365 CmdArgs.push_back("-o");
6366 CmdArgs.push_back(Output.getFilename());
6367 } else {
6368 assert(Output.isNothing() && "Invalid output.");
6369 }
6370
6371 if (!Args.hasArg(options::OPT_nostdlib) &&
6372 !Args.hasArg(options::OPT_nostartfiles)) {
6373 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006374 if (Args.hasArg(options::OPT_pg))
6375 CmdArgs.push_back(Args.MakeArgString(
6376 getToolChain().GetFilePath("gcrt0.o")));
6377 else
6378 CmdArgs.push_back(Args.MakeArgString(
6379 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006380 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006381 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006382 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006383 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006384 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006385 }
6386 }
6387
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006388 std::string Triple = getToolChain().getTripleString();
6389 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006390 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006391 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006392 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006393
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006394 Args.AddAllArgs(CmdArgs, options::OPT_L);
6395 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6396 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006397 Args.AddAllArgs(CmdArgs, options::OPT_s);
6398 Args.AddAllArgs(CmdArgs, options::OPT_t);
6399 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6400 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006401
Daniel Dunbar54423b22010-09-17 00:24:54 +00006402 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006403
6404 if (!Args.hasArg(options::OPT_nostdlib) &&
6405 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006406 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006407 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006408 if (Args.hasArg(options::OPT_pg))
6409 CmdArgs.push_back("-lm_p");
6410 else
6411 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006412 }
6413
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006414 // FIXME: For some reason GCC passes -lgcc before adding
6415 // the default system libraries. Just mimic this for now.
6416 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006417
Eric Christopher17674ec2012-09-13 06:32:34 +00006418 if (Args.hasArg(options::OPT_pthread)) {
6419 if (!Args.hasArg(options::OPT_shared) &&
6420 Args.hasArg(options::OPT_pg))
6421 CmdArgs.push_back("-lpthread_p");
6422 else
6423 CmdArgs.push_back("-lpthread");
6424 }
6425
Chandler Carruth45661652011-12-17 22:32:42 +00006426 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006427 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006428 CmdArgs.push_back("-lc_p");
6429 else
6430 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006431 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006432
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006433 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006434 }
6435
6436 if (!Args.hasArg(options::OPT_nostdlib) &&
6437 !Args.hasArg(options::OPT_nostartfiles)) {
6438 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006439 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006440 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006441 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006442 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006443 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006444 }
6445
6446 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006447 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006448 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006449}
Ed Schoutene33194b2009-04-02 19:13:12 +00006450
Eli Friedman9fa28852012-08-08 23:57:20 +00006451void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6452 const InputInfo &Output,
6453 const InputInfoList &Inputs,
6454 const ArgList &Args,
6455 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006456 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006457 ArgStringList CmdArgs;
6458
6459 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6460 options::OPT_Xassembler);
6461
6462 CmdArgs.push_back("-o");
6463 CmdArgs.push_back(Output.getFilename());
6464
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006465 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006466 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006467
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006468 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006469 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006470}
6471
6472void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6473 const InputInfo &Output,
6474 const InputInfoList &Inputs,
6475 const ArgList &Args,
6476 const char *LinkingOutput) const {
6477 const Driver &D = getToolChain().getDriver();
6478 ArgStringList CmdArgs;
6479
6480 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6481 (!Args.hasArg(options::OPT_shared))) {
6482 CmdArgs.push_back("-e");
6483 CmdArgs.push_back("__start");
6484 }
6485
6486 if (Args.hasArg(options::OPT_static)) {
6487 CmdArgs.push_back("-Bstatic");
6488 } else {
6489 if (Args.hasArg(options::OPT_rdynamic))
6490 CmdArgs.push_back("-export-dynamic");
6491 CmdArgs.push_back("--eh-frame-hdr");
6492 CmdArgs.push_back("-Bdynamic");
6493 if (Args.hasArg(options::OPT_shared)) {
6494 CmdArgs.push_back("-shared");
6495 } else {
6496 CmdArgs.push_back("-dynamic-linker");
6497 CmdArgs.push_back("/usr/libexec/ld.so");
6498 }
6499 }
6500
6501 if (Output.isFilename()) {
6502 CmdArgs.push_back("-o");
6503 CmdArgs.push_back(Output.getFilename());
6504 } else {
6505 assert(Output.isNothing() && "Invalid output.");
6506 }
6507
6508 if (!Args.hasArg(options::OPT_nostdlib) &&
6509 !Args.hasArg(options::OPT_nostartfiles)) {
6510 if (!Args.hasArg(options::OPT_shared)) {
6511 if (Args.hasArg(options::OPT_pg))
6512 CmdArgs.push_back(Args.MakeArgString(
6513 getToolChain().GetFilePath("gcrt0.o")));
6514 else
6515 CmdArgs.push_back(Args.MakeArgString(
6516 getToolChain().GetFilePath("crt0.o")));
6517 CmdArgs.push_back(Args.MakeArgString(
6518 getToolChain().GetFilePath("crtbegin.o")));
6519 } else {
6520 CmdArgs.push_back(Args.MakeArgString(
6521 getToolChain().GetFilePath("crtbeginS.o")));
6522 }
6523 }
6524
6525 Args.AddAllArgs(CmdArgs, options::OPT_L);
6526 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6527 Args.AddAllArgs(CmdArgs, options::OPT_e);
6528
6529 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6530
6531 if (!Args.hasArg(options::OPT_nostdlib) &&
6532 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006533 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006534 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6535 if (Args.hasArg(options::OPT_pg))
6536 CmdArgs.push_back("-lm_p");
6537 else
6538 CmdArgs.push_back("-lm");
6539 }
6540
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006541 if (Args.hasArg(options::OPT_pthread)) {
6542 if (!Args.hasArg(options::OPT_shared) &&
6543 Args.hasArg(options::OPT_pg))
6544 CmdArgs.push_back("-lpthread_p");
6545 else
6546 CmdArgs.push_back("-lpthread");
6547 }
6548
Eli Friedman9fa28852012-08-08 23:57:20 +00006549 if (!Args.hasArg(options::OPT_shared)) {
6550 if (Args.hasArg(options::OPT_pg))
6551 CmdArgs.push_back("-lc_p");
6552 else
6553 CmdArgs.push_back("-lc");
6554 }
6555
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006556 StringRef MyArch;
6557 switch (getToolChain().getTriple().getArch()) {
6558 case llvm::Triple::arm:
6559 MyArch = "arm";
6560 break;
6561 case llvm::Triple::x86:
6562 MyArch = "i386";
6563 break;
6564 case llvm::Triple::x86_64:
6565 MyArch = "amd64";
6566 break;
6567 default:
6568 llvm_unreachable("Unsupported architecture");
6569 }
6570 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006571 }
6572
6573 if (!Args.hasArg(options::OPT_nostdlib) &&
6574 !Args.hasArg(options::OPT_nostartfiles)) {
6575 if (!Args.hasArg(options::OPT_shared))
6576 CmdArgs.push_back(Args.MakeArgString(
6577 getToolChain().GetFilePath("crtend.o")));
6578 else
6579 CmdArgs.push_back(Args.MakeArgString(
6580 getToolChain().GetFilePath("crtendS.o")));
6581 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006582
6583 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006584 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006585 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006586}
6587
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006588void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006589 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006590 const InputInfoList &Inputs,
6591 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006592 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006593 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006594 ArgStringList CmdArgs;
6595
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006596 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6597 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006598 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006599 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006600 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006601 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006602 else if (getToolChain().getArch() == llvm::Triple::mips ||
6603 getToolChain().getArch() == llvm::Triple::mipsel ||
6604 getToolChain().getArch() == llvm::Triple::mips64 ||
6605 getToolChain().getArch() == llvm::Triple::mips64el) {
6606 StringRef CPUName;
6607 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006608 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006609
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006610 CmdArgs.push_back("-march");
6611 CmdArgs.push_back(CPUName.data());
6612
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006613 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006614 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006615
6616 if (getToolChain().getArch() == llvm::Triple::mips ||
6617 getToolChain().getArch() == llvm::Triple::mips64)
6618 CmdArgs.push_back("-EB");
6619 else
6620 CmdArgs.push_back("-EL");
6621
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006622 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006623 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006624 getToolChain().getArch() == llvm::Triple::armeb ||
6625 getToolChain().getArch() == llvm::Triple::thumb ||
6626 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006627 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006628 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006629 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6630
6631 if (FloatABI == "hard") {
6632 CmdArgs.push_back("-mfpu=vfp");
6633 } else {
6634 CmdArgs.push_back("-mfpu=softvfp");
6635 }
6636
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006637 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006638 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006639 case llvm::Triple::GNUEABI:
6640 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006641 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006642 break;
6643
6644 default:
6645 CmdArgs.push_back("-matpcs");
6646 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006647 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006648 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006649 if (getToolChain().getArch() == llvm::Triple::sparc)
6650 CmdArgs.push_back("-Av8plusa");
6651 else
6652 CmdArgs.push_back("-Av9a");
6653
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006654 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006655 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006656
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006657 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6658 options::OPT_Xassembler);
6659
6660 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006661 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006662
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006663 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006664 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006665
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006666 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006667 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006668}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006669
6670void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006671 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006672 const InputInfoList &Inputs,
6673 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006674 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006675 const toolchains::FreeBSD& ToolChain =
6676 static_cast<const toolchains::FreeBSD&>(getToolChain());
6677 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006678 const bool IsPIE =
6679 !Args.hasArg(options::OPT_shared) &&
6680 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006681 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006682
6683 // Silence warning for "clang -g foo.o -o foo"
6684 Args.ClaimAllArgs(options::OPT_g_Group);
6685 // and "clang -emit-llvm foo.o -o foo"
6686 Args.ClaimAllArgs(options::OPT_emit_llvm);
6687 // and for "clang -w foo.o -o foo". Other warning options are already
6688 // handled somewhere else.
6689 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006690
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006691 if (!D.SysRoot.empty())
6692 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6693
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006694 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006695 CmdArgs.push_back("-pie");
6696
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006697 if (Args.hasArg(options::OPT_static)) {
6698 CmdArgs.push_back("-Bstatic");
6699 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006700 if (Args.hasArg(options::OPT_rdynamic))
6701 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006702 CmdArgs.push_back("--eh-frame-hdr");
6703 if (Args.hasArg(options::OPT_shared)) {
6704 CmdArgs.push_back("-Bshareable");
6705 } else {
6706 CmdArgs.push_back("-dynamic-linker");
6707 CmdArgs.push_back("/libexec/ld-elf.so.1");
6708 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006709 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6710 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006711 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6712 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6713 CmdArgs.push_back("--hash-style=both");
6714 }
6715 }
6716 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006717 }
6718
6719 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6720 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006721 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006722 CmdArgs.push_back("-m");
6723 CmdArgs.push_back("elf_i386_fbsd");
6724 }
6725
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006726 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006727 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006728 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006729 }
6730
Daniel Dunbarb440f562010-08-02 02:38:21 +00006731 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006732 CmdArgs.push_back("-o");
6733 CmdArgs.push_back(Output.getFilename());
6734 } else {
6735 assert(Output.isNothing() && "Invalid output.");
6736 }
6737
6738 if (!Args.hasArg(options::OPT_nostdlib) &&
6739 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006740 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006741 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006742 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006743 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006744 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006745 crt1 = "Scrt1.o";
6746 else
6747 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006748 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006749 if (crt1)
6750 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6751
6752 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6753
Craig Topper92fc2df2014-05-17 16:56:41 +00006754 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006755 if (Args.hasArg(options::OPT_static))
6756 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006757 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006758 crtbegin = "crtbeginS.o";
6759 else
6760 crtbegin = "crtbegin.o";
6761
6762 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006763 }
6764
6765 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006766 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006767 for (const auto &Path : Paths)
6768 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006769 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6770 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006771 Args.AddAllArgs(CmdArgs, options::OPT_s);
6772 Args.AddAllArgs(CmdArgs, options::OPT_t);
6773 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6774 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006775
Alp Tokerce365ca2013-12-02 12:43:03 +00006776 if (D.IsUsingLTO(Args))
6777 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006778
Alexey Samsonov52550342014-09-15 19:58:40 +00006779 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006780 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006781
6782 if (!Args.hasArg(options::OPT_nostdlib) &&
6783 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006784 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006785 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006786 if (Args.hasArg(options::OPT_pg))
6787 CmdArgs.push_back("-lm_p");
6788 else
6789 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006790 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006791 if (NeedsSanitizerDeps)
6792 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006793 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6794 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006795 if (Args.hasArg(options::OPT_pg))
6796 CmdArgs.push_back("-lgcc_p");
6797 else
6798 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006799 if (Args.hasArg(options::OPT_static)) {
6800 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006801 } else if (Args.hasArg(options::OPT_pg)) {
6802 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006803 } else {
6804 CmdArgs.push_back("--as-needed");
6805 CmdArgs.push_back("-lgcc_s");
6806 CmdArgs.push_back("--no-as-needed");
6807 }
6808
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006809 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006810 if (Args.hasArg(options::OPT_pg))
6811 CmdArgs.push_back("-lpthread_p");
6812 else
6813 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006814 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006815
Roman Divacky66f22762011-02-10 16:59:40 +00006816 if (Args.hasArg(options::OPT_pg)) {
6817 if (Args.hasArg(options::OPT_shared))
6818 CmdArgs.push_back("-lc");
6819 else
6820 CmdArgs.push_back("-lc_p");
6821 CmdArgs.push_back("-lgcc_p");
6822 } else {
6823 CmdArgs.push_back("-lc");
6824 CmdArgs.push_back("-lgcc");
6825 }
6826
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006827 if (Args.hasArg(options::OPT_static)) {
6828 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006829 } else if (Args.hasArg(options::OPT_pg)) {
6830 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006831 } else {
6832 CmdArgs.push_back("--as-needed");
6833 CmdArgs.push_back("-lgcc_s");
6834 CmdArgs.push_back("--no-as-needed");
6835 }
6836 }
6837
6838 if (!Args.hasArg(options::OPT_nostdlib) &&
6839 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006840 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006841 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006842 else
6843 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006844 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006845 }
6846
Alexey Samsonov7811d192014-02-20 13:57:37 +00006847 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006848
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006849 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006850 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006851 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006852}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006853
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006854void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6855 const InputInfo &Output,
6856 const InputInfoList &Inputs,
6857 const ArgList &Args,
6858 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006859 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006860 ArgStringList CmdArgs;
6861
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006862 // GNU as needs different flags for creating the correct output format
6863 // on architectures with different ABIs or optional feature sets.
6864 switch (getToolChain().getArch()) {
6865 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006866 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006867 break;
6868 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006869 case llvm::Triple::armeb:
6870 case llvm::Triple::thumb:
6871 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006872 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006873 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006874 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006875 }
6876
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006877 case llvm::Triple::mips:
6878 case llvm::Triple::mipsel:
6879 case llvm::Triple::mips64:
6880 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006881 StringRef CPUName;
6882 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006883 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006884
6885 CmdArgs.push_back("-march");
6886 CmdArgs.push_back(CPUName.data());
6887
6888 CmdArgs.push_back("-mabi");
6889 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6890
6891 if (getToolChain().getArch() == llvm::Triple::mips ||
6892 getToolChain().getArch() == llvm::Triple::mips64)
6893 CmdArgs.push_back("-EB");
6894 else
6895 CmdArgs.push_back("-EL");
6896
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006897 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006898 break;
6899 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006900
6901 case llvm::Triple::sparc:
6902 CmdArgs.push_back("-32");
6903 addAssemblerKPIC(Args, CmdArgs);
6904 break;
6905
6906 case llvm::Triple::sparcv9:
6907 CmdArgs.push_back("-64");
6908 CmdArgs.push_back("-Av9");
6909 addAssemblerKPIC(Args, CmdArgs);
6910 break;
6911
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006912 default:
6913 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006914 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006915
6916 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6917 options::OPT_Xassembler);
6918
6919 CmdArgs.push_back("-o");
6920 CmdArgs.push_back(Output.getFilename());
6921
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006922 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006923 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006924
David Chisnallddbd68f2011-09-27 22:03:18 +00006925 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006926 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006927}
6928
6929void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6930 const InputInfo &Output,
6931 const InputInfoList &Inputs,
6932 const ArgList &Args,
6933 const char *LinkingOutput) const {
6934 const Driver &D = getToolChain().getDriver();
6935 ArgStringList CmdArgs;
6936
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006937 if (!D.SysRoot.empty())
6938 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6939
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006940 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006941 if (Args.hasArg(options::OPT_static)) {
6942 CmdArgs.push_back("-Bstatic");
6943 } else {
6944 if (Args.hasArg(options::OPT_rdynamic))
6945 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006946 if (Args.hasArg(options::OPT_shared)) {
6947 CmdArgs.push_back("-Bshareable");
6948 } else {
6949 CmdArgs.push_back("-dynamic-linker");
6950 CmdArgs.push_back("/libexec/ld.elf_so");
6951 }
6952 }
6953
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006954 // Many NetBSD architectures support more than one ABI.
6955 // Determine the correct emulation for ld.
6956 switch (getToolChain().getArch()) {
6957 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006958 CmdArgs.push_back("-m");
6959 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006960 break;
6961 case llvm::Triple::arm:
6962 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006963 CmdArgs.push_back("-m");
6964 switch (getToolChain().getTriple().getEnvironment()) {
6965 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006966 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006967 CmdArgs.push_back("armelf_nbsd_eabi");
6968 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006969 case llvm::Triple::EABIHF:
6970 case llvm::Triple::GNUEABIHF:
6971 CmdArgs.push_back("armelf_nbsd_eabihf");
6972 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006973 default:
6974 CmdArgs.push_back("armelf_nbsd");
6975 break;
6976 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006977 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006978 case llvm::Triple::armeb:
6979 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006980 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006981 CmdArgs.push_back("-m");
6982 switch (getToolChain().getTriple().getEnvironment()) {
6983 case llvm::Triple::EABI:
6984 case llvm::Triple::GNUEABI:
6985 CmdArgs.push_back("armelfb_nbsd_eabi");
6986 break;
6987 case llvm::Triple::EABIHF:
6988 case llvm::Triple::GNUEABIHF:
6989 CmdArgs.push_back("armelfb_nbsd_eabihf");
6990 break;
6991 default:
6992 CmdArgs.push_back("armelfb_nbsd");
6993 break;
6994 }
6995 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006996 case llvm::Triple::mips64:
6997 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006998 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006999 CmdArgs.push_back("-m");
7000 if (getToolChain().getArch() == llvm::Triple::mips64)
7001 CmdArgs.push_back("elf32btsmip");
7002 else
7003 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007004 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007005 CmdArgs.push_back("-m");
7006 if (getToolChain().getArch() == llvm::Triple::mips64)
7007 CmdArgs.push_back("elf64btsmip");
7008 else
7009 CmdArgs.push_back("elf64ltsmip");
7010 }
7011 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007012 case llvm::Triple::ppc:
7013 CmdArgs.push_back("-m");
7014 CmdArgs.push_back("elf32ppc_nbsd");
7015 break;
7016
7017 case llvm::Triple::ppc64:
7018 case llvm::Triple::ppc64le:
7019 CmdArgs.push_back("-m");
7020 CmdArgs.push_back("elf64ppc");
7021 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007022
7023 case llvm::Triple::sparc:
7024 CmdArgs.push_back("-m");
7025 CmdArgs.push_back("elf32_sparc");
7026 break;
7027
7028 case llvm::Triple::sparcv9:
7029 CmdArgs.push_back("-m");
7030 CmdArgs.push_back("elf64_sparc");
7031 break;
7032
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007033 default:
7034 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007035 }
7036
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007037 if (Output.isFilename()) {
7038 CmdArgs.push_back("-o");
7039 CmdArgs.push_back(Output.getFilename());
7040 } else {
7041 assert(Output.isNothing() && "Invalid output.");
7042 }
7043
7044 if (!Args.hasArg(options::OPT_nostdlib) &&
7045 !Args.hasArg(options::OPT_nostartfiles)) {
7046 if (!Args.hasArg(options::OPT_shared)) {
7047 CmdArgs.push_back(Args.MakeArgString(
7048 getToolChain().GetFilePath("crt0.o")));
7049 CmdArgs.push_back(Args.MakeArgString(
7050 getToolChain().GetFilePath("crti.o")));
7051 CmdArgs.push_back(Args.MakeArgString(
7052 getToolChain().GetFilePath("crtbegin.o")));
7053 } else {
7054 CmdArgs.push_back(Args.MakeArgString(
7055 getToolChain().GetFilePath("crti.o")));
7056 CmdArgs.push_back(Args.MakeArgString(
7057 getToolChain().GetFilePath("crtbeginS.o")));
7058 }
7059 }
7060
7061 Args.AddAllArgs(CmdArgs, options::OPT_L);
7062 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7063 Args.AddAllArgs(CmdArgs, options::OPT_e);
7064 Args.AddAllArgs(CmdArgs, options::OPT_s);
7065 Args.AddAllArgs(CmdArgs, options::OPT_t);
7066 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7067 Args.AddAllArgs(CmdArgs, options::OPT_r);
7068
7069 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7070
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007071 unsigned Major, Minor, Micro;
7072 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7073 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007074 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007075 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007076 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007077 case llvm::Triple::arm:
7078 case llvm::Triple::armeb:
7079 case llvm::Triple::thumb:
7080 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007081 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007082 case llvm::Triple::ppc64:
7083 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007084 case llvm::Triple::x86:
7085 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007086 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007087 break;
7088 default:
7089 break;
7090 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007091 }
7092
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007093 if (!Args.hasArg(options::OPT_nostdlib) &&
7094 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007095 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007096 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7097 CmdArgs.push_back("-lm");
7098 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007099 if (Args.hasArg(options::OPT_pthread))
7100 CmdArgs.push_back("-lpthread");
7101 CmdArgs.push_back("-lc");
7102
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007103 if (useLibgcc) {
7104 if (Args.hasArg(options::OPT_static)) {
7105 // libgcc_eh depends on libc, so resolve as much as possible,
7106 // pull in any new requirements from libc and then get the rest
7107 // of libgcc.
7108 CmdArgs.push_back("-lgcc_eh");
7109 CmdArgs.push_back("-lc");
7110 CmdArgs.push_back("-lgcc");
7111 } else {
7112 CmdArgs.push_back("-lgcc");
7113 CmdArgs.push_back("--as-needed");
7114 CmdArgs.push_back("-lgcc_s");
7115 CmdArgs.push_back("--no-as-needed");
7116 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007117 }
7118 }
7119
7120 if (!Args.hasArg(options::OPT_nostdlib) &&
7121 !Args.hasArg(options::OPT_nostartfiles)) {
7122 if (!Args.hasArg(options::OPT_shared))
7123 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7124 "crtend.o")));
7125 else
7126 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7127 "crtendS.o")));
7128 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7129 "crtn.o")));
7130 }
7131
Alexey Samsonov7811d192014-02-20 13:57:37 +00007132 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007133
Logan Chieneb9162f2014-06-26 14:23:45 +00007134 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007135 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007136}
7137
Thomas Schwinge4e555262013-03-28 19:04:25 +00007138void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7139 const InputInfo &Output,
7140 const InputInfoList &Inputs,
7141 const ArgList &Args,
7142 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007143 claimNoWarnArgs(Args);
7144
Rafael Espindola92b00932010-08-10 00:25:48 +00007145 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007146 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007147
7148 // Add --32/--64 to make sure we get the format we want.
7149 // This is incomplete
7150 if (getToolChain().getArch() == llvm::Triple::x86) {
7151 CmdArgs.push_back("--32");
7152 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007153 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7154 CmdArgs.push_back("--x32");
7155 else
7156 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007157 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7158 CmdArgs.push_back("-a32");
7159 CmdArgs.push_back("-mppc");
7160 CmdArgs.push_back("-many");
7161 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7162 CmdArgs.push_back("-a64");
7163 CmdArgs.push_back("-mppc64");
7164 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007165 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7166 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007167 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007168 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007169 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007170 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7171 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007172 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007173 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007174 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7175 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007176 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007177 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007178 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7179 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007180 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007181 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7182 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007183 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7184 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007185 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007186
Tim Northover9c7e0352013-12-12 11:55:52 +00007187 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7188 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007189 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007190
7191 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007192
7193 // FIXME: remove krait check when GNU tools support krait cpu
7194 // for now replace it with -march=armv7-a to avoid a lower
7195 // march from being picked in the absence of a cpu flag.
7196 Arg *A;
7197 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7198 StringRef(A->getValue()) == "krait")
7199 CmdArgs.push_back("-march=armv7-a");
7200 else
7201 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007202 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007203 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7204 getToolChain().getArch() == llvm::Triple::mipsel ||
7205 getToolChain().getArch() == llvm::Triple::mips64 ||
7206 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007207 StringRef CPUName;
7208 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007209 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007210 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007211
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007212 CmdArgs.push_back("-march");
7213 CmdArgs.push_back(CPUName.data());
7214
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007215 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007216 CmdArgs.push_back(ABIName.data());
7217
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007218 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7219 // or -mshared (not implemented) is in effect.
7220 bool IsPicOrPie = false;
7221 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7222 options::OPT_fpic, options::OPT_fno_pic,
7223 options::OPT_fPIE, options::OPT_fno_PIE,
7224 options::OPT_fpie, options::OPT_fno_pie)) {
7225 if (A->getOption().matches(options::OPT_fPIC) ||
7226 A->getOption().matches(options::OPT_fpic) ||
7227 A->getOption().matches(options::OPT_fPIE) ||
7228 A->getOption().matches(options::OPT_fpie))
7229 IsPicOrPie = true;
7230 }
7231 if (!IsPicOrPie)
7232 CmdArgs.push_back("-mno-shared");
7233
Daniel Sanders379d44b2014-07-16 11:52:23 +00007234 // LLVM doesn't support -mplt yet and acts as if it is always given.
7235 // However, -mplt has no effect with the N64 ABI.
7236 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007237
7238 if (getToolChain().getArch() == llvm::Triple::mips ||
7239 getToolChain().getArch() == llvm::Triple::mips64)
7240 CmdArgs.push_back("-EB");
7241 else
7242 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007243
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007244 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7245 if (StringRef(A->getValue()) == "2008")
7246 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7247 }
7248
Daniel Sanders379d44b2014-07-16 11:52:23 +00007249 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7250 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7251 options::OPT_mfp64)) {
7252 A->claim();
7253 A->render(Args, CmdArgs);
7254 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7255 ABIName))
7256 CmdArgs.push_back("-mfpxx");
7257
7258 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7259 // -mno-mips16 is actually -no-mips16.
7260 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7261 options::OPT_mno_mips16)) {
7262 if (A->getOption().matches(options::OPT_mips16)) {
7263 A->claim();
7264 A->render(Args, CmdArgs);
7265 } else {
7266 A->claim();
7267 CmdArgs.push_back("-no-mips16");
7268 }
7269 }
7270
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007271 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7272 options::OPT_mno_micromips);
7273 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7274 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7275
Simon Atanasyanbd986632013-11-26 11:58:04 +00007276 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7277 // Do not use AddLastArg because not all versions of MIPS assembler
7278 // support -mmsa / -mno-msa options.
7279 if (A->getOption().matches(options::OPT_mmsa))
7280 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7281 }
7282
Daniel Sanders379d44b2014-07-16 11:52:23 +00007283 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7284 options::OPT_msoft_float);
7285
7286 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7287 options::OPT_mno_odd_spreg);
7288
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007289 NeedsKPIC = true;
7290 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7291 // Always pass an -march option, since our default of z10 is later
7292 // than the GNU assembler's default.
7293 StringRef CPUName = getSystemZTargetCPU(Args);
7294 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7295 }
7296
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007297 if (NeedsKPIC)
7298 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007299
7300 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7301 options::OPT_Xassembler);
7302
7303 CmdArgs.push_back("-o");
7304 CmdArgs.push_back(Output.getFilename());
7305
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007306 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007307 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007308
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007309 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007310 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007311
7312 // Handle the debug info splitting at object creation time if we're
7313 // creating an object.
7314 // TODO: Currently only works on linux with newer objcopy.
7315 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007316 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007317 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7318 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007319}
7320
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007321static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007322 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007323 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007324 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7325 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007326 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007327 CmdArgs.push_back("-lgcc");
7328
Logan Chien3d3373c2012-11-19 12:04:11 +00007329 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007330 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007331 CmdArgs.push_back("-lgcc");
7332 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007333 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007334 CmdArgs.push_back("--as-needed");
7335 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007336 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007337 CmdArgs.push_back("--no-as-needed");
7338 }
7339
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007340 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007341 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007342 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007343 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007344
7345 // According to Android ABI, we have to link with libdl if we are
7346 // linking with non-static libgcc.
7347 //
7348 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7349 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7350 if (isAndroid && !StaticLibgcc)
7351 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007352}
7353
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007354static std::string getLinuxDynamicLinker(const ArgList &Args,
7355 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007356 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7357 if (ToolChain.getTriple().isArch64Bit())
7358 return "/system/bin/linker64";
7359 else
7360 return "/system/bin/linker";
7361 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7362 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007363 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007364 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007365 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007366 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007367 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007368 else if (ToolChain.getArch() == llvm::Triple::arm ||
7369 ToolChain.getArch() == llvm::Triple::thumb) {
7370 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7371 return "/lib/ld-linux-armhf.so.3";
7372 else
7373 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007374 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7375 ToolChain.getArch() == llvm::Triple::thumbeb) {
7376 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7377 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7378 else
7379 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007380 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007381 ToolChain.getArch() == llvm::Triple::mipsel ||
7382 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007383 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007384 StringRef CPUName;
7385 StringRef ABIName;
7386 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7387 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7388
7389 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7390 .Case("o32", "/lib")
7391 .Case("n32", "/lib32")
7392 .Case("n64", "/lib64")
7393 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007394 StringRef LibName;
7395 if (mips::isUCLibc(Args))
7396 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7397 else
7398 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007399
7400 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007401 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7402 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007403 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7404 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7405 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007406 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007407 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7408 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7409 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007410 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007411 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7412 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007413 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7414 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007415 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7416 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7417 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007418 else
7419 return "/lib64/ld-linux-x86-64.so.2";
7420}
7421
Renato Golinc4b49242014-02-13 10:01:16 +00007422static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007423 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007424 // Make use of compiler-rt if --rtlib option is used
7425 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7426
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007427 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007428 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007429 switch (TC.getTriple().getOS()) {
7430 default: llvm_unreachable("unsupported OS");
7431 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007432 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007433 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007434 break;
7435 }
Renato Golinc4b49242014-02-13 10:01:16 +00007436 break;
7437 case ToolChain::RLT_Libgcc:
7438 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7439 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007440 }
7441}
7442
Rafael Espindola1e085772014-08-15 17:14:35 +00007443static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7444 switch (T.getArch()) {
7445 case llvm::Triple::x86:
7446 return "elf_i386";
7447 case llvm::Triple::aarch64:
7448 return "aarch64linux";
7449 case llvm::Triple::aarch64_be:
7450 return "aarch64_be_linux";
7451 case llvm::Triple::arm:
7452 case llvm::Triple::thumb:
7453 return "armelf_linux_eabi";
7454 case llvm::Triple::armeb:
7455 case llvm::Triple::thumbeb:
7456 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7457 case llvm::Triple::ppc:
7458 return "elf32ppclinux";
7459 case llvm::Triple::ppc64:
7460 return "elf64ppc";
7461 case llvm::Triple::ppc64le:
7462 return "elf64lppc";
7463 case llvm::Triple::sparc:
7464 return "elf32_sparc";
7465 case llvm::Triple::sparcv9:
7466 return "elf64_sparc";
7467 case llvm::Triple::mips:
7468 return "elf32btsmip";
7469 case llvm::Triple::mipsel:
7470 return "elf32ltsmip";
7471 case llvm::Triple::mips64:
7472 if (mips::hasMipsAbiArg(Args, "n32"))
7473 return "elf32btsmipn32";
7474 return "elf64btsmip";
7475 case llvm::Triple::mips64el:
7476 if (mips::hasMipsAbiArg(Args, "n32"))
7477 return "elf32ltsmipn32";
7478 return "elf64ltsmip";
7479 case llvm::Triple::systemz:
7480 return "elf64_s390";
7481 case llvm::Triple::x86_64:
7482 if (T.getEnvironment() == llvm::Triple::GNUX32)
7483 return "elf32_x86_64";
7484 return "elf_x86_64";
7485 default:
7486 llvm_unreachable("Unexpected arch");
7487 }
7488}
7489
Thomas Schwinge4e555262013-03-28 19:04:25 +00007490void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7491 const InputInfo &Output,
7492 const InputInfoList &Inputs,
7493 const ArgList &Args,
7494 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007495 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007496 static_cast<const toolchains::Linux&>(getToolChain());
7497 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007498 const bool isAndroid =
7499 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007500 const bool IsPIE =
7501 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007502 !Args.hasArg(options::OPT_static) &&
7503 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7504 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007505 // Cannot use isPIEDefault here since otherwise
7506 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007507 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007508
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007509 ArgStringList CmdArgs;
7510
Rafael Espindolad1002f62010-11-15 18:28:16 +00007511 // Silence warning for "clang -g foo.o -o foo"
7512 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007513 // and "clang -emit-llvm foo.o -o foo"
7514 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007515 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007516 // handled somewhere else.
7517 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007518
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007519 if (!D.SysRoot.empty())
7520 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007521
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007522 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007523 CmdArgs.push_back("-pie");
7524
Rafael Espindola1c76c592010-11-07 22:57:16 +00007525 if (Args.hasArg(options::OPT_rdynamic))
7526 CmdArgs.push_back("-export-dynamic");
7527
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007528 if (Args.hasArg(options::OPT_s))
7529 CmdArgs.push_back("-s");
7530
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007531 if (ToolChain.getArch() == llvm::Triple::armeb ||
7532 ToolChain.getArch() == llvm::Triple::thumbeb)
7533 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7534
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007535 for (const auto &Opt : ToolChain.ExtraOpts)
7536 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007537
7538 if (!Args.hasArg(options::OPT_static)) {
7539 CmdArgs.push_back("--eh-frame-hdr");
7540 }
7541
7542 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007543 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007544
7545 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007546 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007547 ToolChain.getArch() == llvm::Triple::armeb ||
7548 ToolChain.getArch() == llvm::Triple::thumb ||
7549 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007550 CmdArgs.push_back("-Bstatic");
7551 else
7552 CmdArgs.push_back("-static");
7553 } else if (Args.hasArg(options::OPT_shared)) {
7554 CmdArgs.push_back("-shared");
7555 }
7556
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007557 if (ToolChain.getArch() == llvm::Triple::arm ||
7558 ToolChain.getArch() == llvm::Triple::armeb ||
7559 ToolChain.getArch() == llvm::Triple::thumb ||
7560 ToolChain.getArch() == llvm::Triple::thumbeb ||
7561 (!Args.hasArg(options::OPT_static) &&
7562 !Args.hasArg(options::OPT_shared))) {
7563 CmdArgs.push_back("-dynamic-linker");
7564 CmdArgs.push_back(Args.MakeArgString(
7565 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7566 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007567
Ulrich Weigandf32a1ac2015-01-29 19:08:51 +00007568 // Work around a bug in GNU ld (and gold) linker versions up to 2.25
7569 // that may mis-optimize code generated by this version of clang/LLVM
7570 // to access general-dynamic or local-dynamic TLS variables.
7571 if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7572 ToolChain.getArch() == llvm::Triple::ppc64le)
7573 CmdArgs.push_back("--no-tls-optimize");
7574
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007575 CmdArgs.push_back("-o");
7576 CmdArgs.push_back(Output.getFilename());
7577
Rafael Espindola81937ec2010-12-01 01:52:43 +00007578 if (!Args.hasArg(options::OPT_nostdlib) &&
7579 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007580 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007581 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007582 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007583 if (Args.hasArg(options::OPT_pg))
7584 crt1 = "gcrt1.o";
7585 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007586 crt1 = "Scrt1.o";
7587 else
7588 crt1 = "crt1.o";
7589 }
7590 if (crt1)
7591 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007592
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007593 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7594 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007595
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007596 const char *crtbegin;
7597 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007598 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007599 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007600 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007601 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007602 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007603 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007604 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007605 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007606
7607 // Add crtfastmath.o if available and fast math is enabled.
7608 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007609 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007610
7611 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007612 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007613
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007614 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007615
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007616 for (const auto &Path : Paths)
7617 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007618
Alp Tokerce365ca2013-12-02 12:43:03 +00007619 if (D.IsUsingLTO(Args))
7620 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007621
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007622 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7623 CmdArgs.push_back("--no-demangle");
7624
Alexey Samsonov52550342014-09-15 19:58:40 +00007625 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007626 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007627 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007628 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007629
Hans Wennborg70850d82013-07-18 20:29:38 +00007630 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007631 !Args.hasArg(options::OPT_nostdlib) &&
7632 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007633 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7634 !Args.hasArg(options::OPT_static);
7635 if (OnlyLibstdcxxStatic)
7636 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007637 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007638 if (OnlyLibstdcxxStatic)
7639 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007640 CmdArgs.push_back("-lm");
7641 }
7642
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007643 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007644 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7645 if (Args.hasArg(options::OPT_static))
7646 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007647
Alexey Samsonov52550342014-09-15 19:58:40 +00007648 if (NeedsSanitizerDeps)
7649 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7650
Alexey Bataev186b28a2014-03-06 05:43:53 +00007651 LibOpenMP UsedOpenMPLib = LibUnknown;
7652 if (Args.hasArg(options::OPT_fopenmp)) {
7653 UsedOpenMPLib = LibGOMP;
7654 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7655 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7656 .Case("libgomp", LibGOMP)
7657 .Case("libiomp5", LibIOMP5)
7658 .Default(LibUnknown);
7659 if (UsedOpenMPLib == LibUnknown)
7660 D.Diag(diag::err_drv_unsupported_option_argument)
7661 << A->getOption().getName() << A->getValue();
7662 }
7663 switch (UsedOpenMPLib) {
7664 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007665 CmdArgs.push_back("-lgomp");
7666
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007667 // FIXME: Exclude this for platforms with libgomp that don't require
7668 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007669 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007670 break;
7671 case LibIOMP5:
7672 CmdArgs.push_back("-liomp5");
7673 break;
7674 case LibUnknown:
7675 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007676 }
Renato Golinc4b49242014-02-13 10:01:16 +00007677 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007678
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007679 if ((Args.hasArg(options::OPT_pthread) ||
7680 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7681 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007682 CmdArgs.push_back("-lpthread");
7683
7684 CmdArgs.push_back("-lc");
7685
7686 if (Args.hasArg(options::OPT_static))
7687 CmdArgs.push_back("--end-group");
7688 else
Renato Golinc4b49242014-02-13 10:01:16 +00007689 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007690 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007691
Rafael Espindola81937ec2010-12-01 01:52:43 +00007692 if (!Args.hasArg(options::OPT_nostartfiles)) {
7693 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007694 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007695 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007696 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007697 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007698 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007699 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007700
Rafael Espindola81937ec2010-12-01 01:52:43 +00007701 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007702 if (!isAndroid)
7703 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007704 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007705 }
7706
David Blaikiec11bf802014-09-04 16:04:28 +00007707 C.addCommand(
7708 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007709}
7710
Chris Lattner3e2ee142010-07-07 16:01:42 +00007711void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007712 const InputInfo &Output,
7713 const InputInfoList &Inputs,
7714 const ArgList &Args,
7715 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007716 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007717 ArgStringList CmdArgs;
7718
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007719 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007720
7721 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007722 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007723
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007724 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007725 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007726
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007727 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007728 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007729}
7730
7731void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007732 const InputInfo &Output,
7733 const InputInfoList &Inputs,
7734 const ArgList &Args,
7735 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007736 const Driver &D = getToolChain().getDriver();
7737 ArgStringList CmdArgs;
7738
Daniel Dunbarb440f562010-08-02 02:38:21 +00007739 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007740 CmdArgs.push_back("-o");
7741 CmdArgs.push_back(Output.getFilename());
7742 } else {
7743 assert(Output.isNothing() && "Invalid output.");
7744 }
7745
7746 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007747 !Args.hasArg(options::OPT_nostartfiles)) {
7748 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7749 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7750 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7751 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7752 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007753
7754 Args.AddAllArgs(CmdArgs, options::OPT_L);
7755 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7756 Args.AddAllArgs(CmdArgs, options::OPT_e);
7757
Daniel Dunbar54423b22010-09-17 00:24:54 +00007758 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007759
Alexey Samsonov7811d192014-02-20 13:57:37 +00007760 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007761
Chris Lattner3e2ee142010-07-07 16:01:42 +00007762 if (!Args.hasArg(options::OPT_nostdlib) &&
7763 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007764 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007765 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007766 CmdArgs.push_back("-lm");
7767 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007768 }
7769
7770 if (!Args.hasArg(options::OPT_nostdlib) &&
7771 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007772 if (Args.hasArg(options::OPT_pthread))
7773 CmdArgs.push_back("-lpthread");
7774 CmdArgs.push_back("-lc");
7775 CmdArgs.push_back("-lCompilerRT-Generic");
7776 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7777 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007778 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007779 }
7780
Logan Chieneb9162f2014-06-26 14:23:45 +00007781 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007782 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007783}
7784
Daniel Dunbarcc912342009-05-02 18:28:39 +00007785/// DragonFly Tools
7786
7787// For now, DragonFly Assemble does just about the same as for
7788// FreeBSD, but this may change soon.
7789void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007790 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007791 const InputInfoList &Inputs,
7792 const ArgList &Args,
7793 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007794 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007795 ArgStringList CmdArgs;
7796
7797 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7798 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007799 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007800 CmdArgs.push_back("--32");
7801
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007802 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007803
7804 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007805 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007806
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007807 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007808 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007809
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007810 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007811 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007812}
7813
7814void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007815 const InputInfo &Output,
7816 const InputInfoList &Inputs,
7817 const ArgList &Args,
7818 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007819 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007820 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007821 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007822
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007823 if (!D.SysRoot.empty())
7824 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7825
John McCall65b8da02013-04-11 22:55:55 +00007826 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007827 if (Args.hasArg(options::OPT_static)) {
7828 CmdArgs.push_back("-Bstatic");
7829 } else {
John McCall65b8da02013-04-11 22:55:55 +00007830 if (Args.hasArg(options::OPT_rdynamic))
7831 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007832 if (Args.hasArg(options::OPT_shared))
7833 CmdArgs.push_back("-Bshareable");
7834 else {
7835 CmdArgs.push_back("-dynamic-linker");
7836 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7837 }
John McCall65b8da02013-04-11 22:55:55 +00007838 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007839 }
7840
7841 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7842 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007843 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007844 CmdArgs.push_back("-m");
7845 CmdArgs.push_back("elf_i386");
7846 }
7847
Daniel Dunbarb440f562010-08-02 02:38:21 +00007848 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007849 CmdArgs.push_back("-o");
7850 CmdArgs.push_back(Output.getFilename());
7851 } else {
7852 assert(Output.isNothing() && "Invalid output.");
7853 }
7854
7855 if (!Args.hasArg(options::OPT_nostdlib) &&
7856 !Args.hasArg(options::OPT_nostartfiles)) {
7857 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007858 if (Args.hasArg(options::OPT_pg))
7859 CmdArgs.push_back(Args.MakeArgString(
7860 getToolChain().GetFilePath("gcrt1.o")));
7861 else {
7862 if (Args.hasArg(options::OPT_pie))
7863 CmdArgs.push_back(Args.MakeArgString(
7864 getToolChain().GetFilePath("Scrt1.o")));
7865 else
7866 CmdArgs.push_back(Args.MakeArgString(
7867 getToolChain().GetFilePath("crt1.o")));
7868 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007869 }
John McCall65b8da02013-04-11 22:55:55 +00007870 CmdArgs.push_back(Args.MakeArgString(
7871 getToolChain().GetFilePath("crti.o")));
7872 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7873 CmdArgs.push_back(Args.MakeArgString(
7874 getToolChain().GetFilePath("crtbeginS.o")));
7875 else
7876 CmdArgs.push_back(Args.MakeArgString(
7877 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007878 }
7879
7880 Args.AddAllArgs(CmdArgs, options::OPT_L);
7881 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7882 Args.AddAllArgs(CmdArgs, options::OPT_e);
7883
Daniel Dunbar54423b22010-09-17 00:24:54 +00007884 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007885
7886 if (!Args.hasArg(options::OPT_nostdlib) &&
7887 !Args.hasArg(options::OPT_nodefaultlibs)) {
7888 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7889 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007890 if (UseGCC47)
7891 CmdArgs.push_back("-L/usr/lib/gcc47");
7892 else
7893 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007894
7895 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007896 if (UseGCC47) {
7897 CmdArgs.push_back("-rpath");
7898 CmdArgs.push_back("/usr/lib/gcc47");
7899 } else {
7900 CmdArgs.push_back("-rpath");
7901 CmdArgs.push_back("/usr/lib/gcc44");
7902 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007903 }
7904
Hans Wennborg70850d82013-07-18 20:29:38 +00007905 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007906 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007907 CmdArgs.push_back("-lm");
7908 }
7909
Daniel Dunbarcc912342009-05-02 18:28:39 +00007910 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007911 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007912
7913 if (!Args.hasArg(options::OPT_nolibc)) {
7914 CmdArgs.push_back("-lc");
7915 }
7916
John McCall65b8da02013-04-11 22:55:55 +00007917 if (UseGCC47) {
7918 if (Args.hasArg(options::OPT_static) ||
7919 Args.hasArg(options::OPT_static_libgcc)) {
7920 CmdArgs.push_back("-lgcc");
7921 CmdArgs.push_back("-lgcc_eh");
7922 } else {
7923 if (Args.hasArg(options::OPT_shared_libgcc)) {
7924 CmdArgs.push_back("-lgcc_pic");
7925 if (!Args.hasArg(options::OPT_shared))
7926 CmdArgs.push_back("-lgcc");
7927 } else {
7928 CmdArgs.push_back("-lgcc");
7929 CmdArgs.push_back("--as-needed");
7930 CmdArgs.push_back("-lgcc_pic");
7931 CmdArgs.push_back("--no-as-needed");
7932 }
7933 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007934 } else {
John McCall65b8da02013-04-11 22:55:55 +00007935 if (Args.hasArg(options::OPT_shared)) {
7936 CmdArgs.push_back("-lgcc_pic");
7937 } else {
7938 CmdArgs.push_back("-lgcc");
7939 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007940 }
7941 }
7942
7943 if (!Args.hasArg(options::OPT_nostdlib) &&
7944 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007945 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007946 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007947 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007948 else
7949 CmdArgs.push_back(Args.MakeArgString(
7950 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007951 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007952 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007953 }
7954
Alexey Samsonov7811d192014-02-20 13:57:37 +00007955 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007956
Logan Chieneb9162f2014-06-26 14:23:45 +00007957 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007958 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007959}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007960
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00007961// Try to find Exe from a Visual Studio distribution. This first tries to find
7962// an installed copy of Visual Studio and, failing that, looks in the PATH,
7963// making sure that whatever executable that's found is not a same-named exe
7964// from clang itself to prevent clang from falling back to itself.
7965static std::string FindVisualStudioExecutable(const ToolChain &TC,
7966 const char *Exe,
7967 const char *ClangProgramPath) {
7968 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
7969 std::string visualStudioBinDir;
7970 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
7971 visualStudioBinDir)) {
7972 SmallString<128> FilePath(visualStudioBinDir);
7973 llvm::sys::path::append(FilePath, Exe);
7974 if (llvm::sys::fs::can_execute(FilePath.c_str()))
7975 return FilePath.str();
7976 }
7977
7978 return Exe;
7979}
7980
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007981void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7982 const InputInfo &Output,
7983 const InputInfoList &Inputs,
7984 const ArgList &Args,
7985 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007986 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00007987 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007988
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00007989 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
7990 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007991 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7992 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007993
7994 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00007995 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007996 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007997
Zachary Turner10d75b22014-10-22 20:40:43 +00007998 if (!llvm::sys::Process::GetEnv("LIB")) {
7999 // If the VC environment hasn't been configured (perhaps because the user
8000 // did not run vcvarsall), try to build a consistent link environment. If
8001 // the environment variable is set however, assume the user knows what he's
8002 // doing.
8003 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008004 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008005 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8006 SmallString<128> LibDir(VisualStudioDir);
8007 llvm::sys::path::append(LibDir, "VC", "lib");
8008 switch (MSVC.getArch()) {
8009 case llvm::Triple::x86:
8010 // x86 just puts the libraries directly in lib
8011 break;
8012 case llvm::Triple::x86_64:
8013 llvm::sys::path::append(LibDir, "amd64");
8014 break;
8015 case llvm::Triple::arm:
8016 llvm::sys::path::append(LibDir, "arm");
8017 break;
8018 default:
8019 break;
8020 }
8021 CmdArgs.push_back(
8022 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8023 }
8024
8025 std::string WindowsSdkLibPath;
8026 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8027 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8028 WindowsSdkLibPath.c_str()));
8029 }
8030
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008031 CmdArgs.push_back("-nologo");
8032
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008033 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008034 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008035
Hans Wennborgf1a74252013-09-10 20:18:04 +00008036 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008037 if (DLL) {
8038 CmdArgs.push_back(Args.MakeArgString("-dll"));
8039
8040 SmallString<128> ImplibName(Output.getFilename());
8041 llvm::sys::path::replace_extension(ImplibName, "lib");
8042 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
8043 ImplibName.str()));
8044 }
8045
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008046 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008047 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008048 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008049 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008050 static const char *CompilerRTComponents[] = {
8051 "asan_dynamic",
8052 "asan_dynamic_runtime_thunk",
8053 };
8054 for (const auto &Component : CompilerRTComponents)
8055 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008056 // Make sure the dynamic runtime thunk is not optimized out at link time
8057 // to ensure proper SEH handling.
8058 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008059 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008060 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008061 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008062 static const char *CompilerRTComponents[] = {
8063 "asan",
8064 "asan_cxx",
8065 };
8066 for (const auto &Component : CompilerRTComponents)
8067 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008068 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008069 }
8070
Hans Wennborg2e274592013-08-13 23:38:57 +00008071 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008072
Reid Kleckner337188f2014-09-16 19:22:00 +00008073 // Add filenames, libraries, and other linker inputs.
8074 for (const auto &Input : Inputs) {
8075 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008076 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008077 continue;
8078 }
8079
8080 const Arg &A = Input.getInputArg();
8081
8082 // Render -l options differently for the MSVC linker.
8083 if (A.getOption().matches(options::OPT_l)) {
8084 StringRef Lib = A.getValue();
8085 const char *LinkLibArg;
8086 if (Lib.endswith(".lib"))
8087 LinkLibArg = Args.MakeArgString(Lib);
8088 else
8089 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8090 CmdArgs.push_back(LinkLibArg);
8091 continue;
8092 }
8093
8094 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8095 // or -L. Render it, even if MSVC doesn't understand it.
8096 A.renderAsInput(Args, CmdArgs);
8097 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008098
Zachary Turner719f58c2014-12-01 23:06:47 +00008099 // We need to special case some linker paths. In the case of lld, we need to
8100 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8101 // linker, we need to use a special search algorithm.
8102 llvm::SmallString<128> linkPath;
8103 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8104 if (Linker.equals_lower("lld"))
8105 Linker = "lld-link";
8106
8107 if (Linker.equals_lower("link")) {
8108 // If we're using the MSVC linker, it's not sufficient to just use link
8109 // from the program PATH, because other environments like GnuWin32 install
8110 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008111 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008112 C.getDriver().getClangProgramPath());
8113 } else {
8114 linkPath = Linker;
8115 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008116 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008117 }
8118
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008119 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008120 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008121}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008122
8123void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8124 const InputInfo &Output,
8125 const InputInfoList &Inputs,
8126 const ArgList &Args,
8127 const char *LinkingOutput) const {
8128 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8129}
8130
David Blaikiec11bf802014-09-04 16:04:28 +00008131std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8132 Compilation &C, const JobAction &JA, const InputInfo &Output,
8133 const InputInfoList &Inputs, const ArgList &Args,
8134 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008135 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008136 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008137 CmdArgs.push_back("/c"); // Compile only.
8138 CmdArgs.push_back("/W0"); // No warnings.
8139
8140 // The goal is to be able to invoke this tool correctly based on
8141 // any flag accepted by clang-cl.
8142
8143 // These are spelled the same way in clang and cl.exe,.
8144 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8145 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008146
8147 // Optimization level.
8148 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8149 if (A->getOption().getID() == options::OPT_O0) {
8150 CmdArgs.push_back("/Od");
8151 } else {
8152 StringRef OptLevel = A->getValue();
8153 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8154 A->render(Args, CmdArgs);
8155 else if (OptLevel == "3")
8156 CmdArgs.push_back("/Ox");
8157 }
8158 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008159
8160 // Flags for which clang-cl have an alias.
8161 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8162
David Majnemerf6072342014-07-01 22:24:56 +00008163 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8164 /*default=*/false))
8165 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008166 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8167 options::OPT_fno_function_sections))
8168 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8169 ? "/Gy"
8170 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008171 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8172 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008173 CmdArgs.push_back(
8174 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008175 if (Args.hasArg(options::OPT_fsyntax_only))
8176 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008177 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8178 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008179
Hans Wennborg260ff402013-09-27 17:54:18 +00008180 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008181 for (const auto &Include : Includes)
8182 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008183
Hans Wennborg87cfa712013-09-19 20:32:16 +00008184 // Flags that can simply be passed through.
8185 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8186 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008187 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008188
8189 // The order of these flags is relevant, so pick the last one.
8190 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8191 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8192 A->render(Args, CmdArgs);
8193
8194
8195 // Input filename.
8196 assert(Inputs.size() == 1);
8197 const InputInfo &II = Inputs[0];
8198 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8199 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8200 if (II.isFilename())
8201 CmdArgs.push_back(II.getFilename());
8202 else
8203 II.getInputArg().renderAsInput(Args, CmdArgs);
8204
8205 // Output filename.
8206 assert(Output.getType() == types::TY_Object);
8207 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8208 Output.getFilename());
8209 CmdArgs.push_back(Fo);
8210
Hans Wennborg188382e2013-09-20 18:16:35 +00008211 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008212 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8213 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008214 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8215 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008216}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008217
8218
8219/// XCore Tools
8220// We pass assemble and link construction to the xcc tool.
8221
8222void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8223 const InputInfo &Output,
8224 const InputInfoList &Inputs,
8225 const ArgList &Args,
8226 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008227 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008228 ArgStringList CmdArgs;
8229
8230 CmdArgs.push_back("-o");
8231 CmdArgs.push_back(Output.getFilename());
8232
8233 CmdArgs.push_back("-c");
8234
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008235 if (Args.hasArg(options::OPT_v))
8236 CmdArgs.push_back("-v");
8237
Robert Lytton894d25c2014-05-02 09:33:25 +00008238 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8239 if (!A->getOption().matches(options::OPT_g0))
8240 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008241
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008242 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8243 false))
8244 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008245
8246 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8247 options::OPT_Xassembler);
8248
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008249 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008250 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008251
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008252 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008253 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008254}
8255
8256void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8257 const InputInfo &Output,
8258 const InputInfoList &Inputs,
8259 const ArgList &Args,
8260 const char *LinkingOutput) const {
8261 ArgStringList CmdArgs;
8262
8263 if (Output.isFilename()) {
8264 CmdArgs.push_back("-o");
8265 CmdArgs.push_back(Output.getFilename());
8266 } else {
8267 assert(Output.isNothing() && "Invalid output.");
8268 }
8269
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008270 if (Args.hasArg(options::OPT_v))
8271 CmdArgs.push_back("-v");
8272
David Majnemer8de68642014-12-05 08:11:58 +00008273 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008274 CmdArgs.push_back("-fexceptions");
8275
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008276 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8277
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008278 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008279 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008280}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008281
8282void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8283 const InputInfo &Output,
8284 const InputInfoList &Inputs,
8285 const ArgList &Args,
8286 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008287 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008288 const auto &TC =
8289 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8290 ArgStringList CmdArgs;
8291 const char *Exec;
8292
8293 switch (TC.getArch()) {
8294 default: llvm_unreachable("unsupported architecture");
8295 case llvm::Triple::arm:
8296 case llvm::Triple::thumb:
8297 break;
8298 case llvm::Triple::x86:
8299 CmdArgs.push_back("--32");
8300 break;
8301 case llvm::Triple::x86_64:
8302 CmdArgs.push_back("--64");
8303 break;
8304 }
8305
8306 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8307
8308 CmdArgs.push_back("-o");
8309 CmdArgs.push_back(Output.getFilename());
8310
8311 for (const auto &Input : Inputs)
8312 CmdArgs.push_back(Input.getFilename());
8313
8314 const std::string Assembler = TC.GetProgramPath("as");
8315 Exec = Args.MakeArgString(Assembler);
8316
8317 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8318}
8319
8320void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8321 const InputInfo &Output,
8322 const InputInfoList &Inputs,
8323 const ArgList &Args,
8324 const char *LinkingOutput) const {
8325 const auto &TC =
8326 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8327 const llvm::Triple &T = TC.getTriple();
8328 const Driver &D = TC.getDriver();
8329 SmallString<128> EntryPoint;
8330 ArgStringList CmdArgs;
8331 const char *Exec;
8332
8333 // Silence warning for "clang -g foo.o -o foo"
8334 Args.ClaimAllArgs(options::OPT_g_Group);
8335 // and "clang -emit-llvm foo.o -o foo"
8336 Args.ClaimAllArgs(options::OPT_emit_llvm);
8337 // and for "clang -w foo.o -o foo"
8338 Args.ClaimAllArgs(options::OPT_w);
8339 // Other warning options are already handled somewhere else.
8340
8341 if (!D.SysRoot.empty())
8342 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8343
8344 if (Args.hasArg(options::OPT_pie))
8345 CmdArgs.push_back("-pie");
8346 if (Args.hasArg(options::OPT_rdynamic))
8347 CmdArgs.push_back("-export-dynamic");
8348 if (Args.hasArg(options::OPT_s))
8349 CmdArgs.push_back("--strip-all");
8350
8351 CmdArgs.push_back("-m");
8352 switch (TC.getArch()) {
8353 default: llvm_unreachable("unsupported architecture");
8354 case llvm::Triple::arm:
8355 case llvm::Triple::thumb:
8356 // FIXME: this is incorrect for WinCE
8357 CmdArgs.push_back("thumb2pe");
8358 break;
8359 case llvm::Triple::x86:
8360 CmdArgs.push_back("i386pe");
8361 EntryPoint.append("_");
8362 break;
8363 case llvm::Triple::x86_64:
8364 CmdArgs.push_back("i386pep");
8365 break;
8366 }
8367
8368 if (Args.hasArg(options::OPT_shared)) {
8369 switch (T.getArch()) {
8370 default: llvm_unreachable("unsupported architecture");
8371 case llvm::Triple::arm:
8372 case llvm::Triple::thumb:
8373 case llvm::Triple::x86_64:
8374 EntryPoint.append("_DllMainCRTStartup");
8375 break;
8376 case llvm::Triple::x86:
8377 EntryPoint.append("_DllMainCRTStartup@12");
8378 break;
8379 }
8380
8381 CmdArgs.push_back("-shared");
8382 CmdArgs.push_back("-Bdynamic");
8383
8384 CmdArgs.push_back("--enable-auto-image-base");
8385
8386 CmdArgs.push_back("--entry");
8387 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8388 } else {
8389 EntryPoint.append("mainCRTStartup");
8390
8391 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8392 : "-Bdynamic");
8393
8394 if (!Args.hasArg(options::OPT_nostdlib) &&
8395 !Args.hasArg(options::OPT_nostartfiles)) {
8396 CmdArgs.push_back("--entry");
8397 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8398 }
8399
8400 // FIXME: handle subsystem
8401 }
8402
8403 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008404 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008405
8406 CmdArgs.push_back("-o");
8407 CmdArgs.push_back(Output.getFilename());
8408
8409 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8410 SmallString<261> ImpLib(Output.getFilename());
8411 llvm::sys::path::replace_extension(ImpLib, ".lib");
8412
8413 CmdArgs.push_back("--out-implib");
8414 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8415 }
8416
8417 if (!Args.hasArg(options::OPT_nostdlib) &&
8418 !Args.hasArg(options::OPT_nostartfiles)) {
8419 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8420 const char *CRTBegin;
8421
8422 CRTBegin =
8423 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8424 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8425 }
8426
8427 Args.AddAllArgs(CmdArgs, options::OPT_L);
8428
8429 const auto &Paths = TC.getFilePaths();
8430 for (const auto &Path : Paths)
8431 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8432
8433 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8434
8435 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8436 !Args.hasArg(options::OPT_nodefaultlibs)) {
8437 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8438 !Args.hasArg(options::OPT_static);
8439 if (StaticCXX)
8440 CmdArgs.push_back("-Bstatic");
8441 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8442 if (StaticCXX)
8443 CmdArgs.push_back("-Bdynamic");
8444 }
8445
8446 if (!Args.hasArg(options::OPT_nostdlib)) {
8447 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8448 // TODO handle /MT[d] /MD[d]
8449 CmdArgs.push_back("-lmsvcrt");
8450 AddRunTimeLibs(TC, D, CmdArgs, Args);
8451 }
8452 }
8453
8454 const std::string Linker = TC.GetProgramPath("ld");
8455 Exec = Args.MakeArgString(Linker);
8456
8457 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8458}