blob: d2bb9ba5327a0ffb6d8964c9a5a28e053521cdd6 [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"
13#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000014#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000015#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000017#include "clang/Driver/Driver.h"
18#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000019#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000021#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000025#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000028#include "llvm/Option/Arg.h"
29#include "llvm/Option/ArgList.h"
30#include "llvm/Option/Option.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000031#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000032#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000033#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000034#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000035#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000036#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000037#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000038#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000039#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000040
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041using namespace clang::driver;
42using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000044using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000045
Joerg Sonnenbergerd11c4782014-02-02 22:40:33 +000046static bool hasMipsABIArg(const ArgList &Args, const char *Value) {
47 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
48 return A && (A->getValue() == StringRef(Value));
49}
50
Daniel Dunbar64198ef2009-09-10 01:21:05 +000051/// CheckPreprocessingOptions - Perform some validation of preprocessing
52/// arguments that is shared with gcc.
53static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
54 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000055 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000056 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000057 << A->getAsString(Args) << "-E";
58}
59
Daniel Dunbar4eadb602009-09-10 01:21:12 +000060/// CheckCodeGenerationOptions - Perform some validation of code generation
61/// arguments that is shared with gcc.
62static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
63 // In gcc, only ARM checks this, but it seems reasonable to check universally.
64 if (Args.hasArg(options::OPT_static))
65 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
66 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000067 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068 << A->getAsString(Args) << "-static";
69}
70
Chris Lattnerbf2803f2010-03-29 17:55:58 +000071// Quote target names for inclusion in GNU Make dependency files.
72// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000073static void QuoteTarget(StringRef Target,
74 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000075 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
76 switch (Target[i]) {
77 case ' ':
78 case '\t':
79 // Escape the preceding backslashes
80 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
81 Res.push_back('\\');
82
83 // Escape the space/tab
84 Res.push_back('\\');
85 break;
86 case '$':
87 Res.push_back('$');
88 break;
89 case '#':
90 Res.push_back('\\');
91 break;
92 default:
93 break;
94 }
95
96 Res.push_back(Target[i]);
97 }
98}
99
Bill Wendlingc0938f32012-03-12 22:10:06 +0000100static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000101 ArgStringList &CmdArgs,
102 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000103 const char *EnvVar) {
104 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000105 bool CombinedArg = false;
106
Bill Wendling281ca292012-03-12 21:22:35 +0000107 if (!DirList)
108 return; // Nothing to do.
109
Chad Rosier616e8a52012-10-30 21:42:09 +0000110 StringRef Name(ArgName);
111 if (Name.equals("-I") || Name.equals("-L"))
112 CombinedArg = true;
113
Bill Wendling281ca292012-03-12 21:22:35 +0000114 StringRef Dirs(DirList);
115 if (Dirs.empty()) // Empty string should not add '.'.
116 return;
117
118 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000119 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000120 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000121 if (CombinedArg) {
122 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
123 } else {
124 CmdArgs.push_back(ArgName);
125 CmdArgs.push_back(".");
126 }
Bill Wendling281ca292012-03-12 21:22:35 +0000127 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 if (CombinedArg) {
129 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
130 } else {
131 CmdArgs.push_back(ArgName);
132 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
133 }
Bill Wendling281ca292012-03-12 21:22:35 +0000134 }
Nico Weber89355782012-03-19 15:00:03 +0000135 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000136 }
137
138 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000139 if (CombinedArg) {
140 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
141 } else {
142 CmdArgs.push_back(ArgName);
143 CmdArgs.push_back(".");
144 }
Bill Wendling281ca292012-03-12 21:22:35 +0000145 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000146 if (CombinedArg) {
147 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
148 } else {
149 CmdArgs.push_back(ArgName);
150 CmdArgs.push_back(Args.MakeArgString(Dirs));
151 }
Bill Wendling281ca292012-03-12 21:22:35 +0000152 }
153}
154
Daniel Dunbar54423b22010-09-17 00:24:54 +0000155static void AddLinkerInputs(const ToolChain &TC,
156 const InputInfoList &Inputs, const ArgList &Args,
157 ArgStringList &CmdArgs) {
158 const Driver &D = TC.getDriver();
159
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000160 // Add extra linker input arguments which are not treated as inputs
161 // (constructed via -Xarch_).
162 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
163
Daniel Dunbar54423b22010-09-17 00:24:54 +0000164 for (InputInfoList::const_iterator
165 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
166 const InputInfo &II = *it;
167
168 if (!TC.HasNativeLLVMSupport()) {
169 // Don't try to pass LLVM inputs unless we have native support.
170 if (II.getType() == types::TY_LLVM_IR ||
171 II.getType() == types::TY_LTO_IR ||
172 II.getType() == types::TY_LLVM_BC ||
173 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000174 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000175 << TC.getTripleString();
176 }
177
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000178 // Add filenames immediately.
179 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000180 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000181 continue;
182 }
183
184 // Otherwise, this is a linker input argument.
185 const Arg &A = II.getInputArg();
186
187 // Handle reserved library options.
188 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000189 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000190 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
191 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000192 } else
193 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
Bill Wendling281ca292012-03-12 21:22:35 +0000195
196 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000197 // and only supported on native toolchains.
198 if (!TC.isCrossCompiling())
199 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000200}
201
John McCall31168b02011-06-15 23:02:42 +0000202/// \brief Determine whether Objective-C automated reference counting is
203/// enabled.
204static bool isObjCAutoRefCount(const ArgList &Args) {
205 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
206}
207
Ted Kremeneke65b0862012-03-06 20:05:56 +0000208/// \brief Determine whether we are linking the ObjC runtime.
209static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000210 if (isObjCAutoRefCount(Args)) {
211 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000212 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000213 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000214 return Args.hasArg(options::OPT_fobjc_link_runtime);
215}
216
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000217static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000218 ArgStringList &CmdArgs,
219 llvm::Triple Triple) {
220 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
221 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +0000222 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Bill Wendling08760582011-06-27 19:15:03 +0000223 Args.hasArg(options::OPT_fcreate_profile) ||
224 Args.hasArg(options::OPT_coverage)))
225 return;
226
227 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
228 // the link line. We cannot do the same thing because unlike gcov there is a
229 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
230 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000231 std::string ProfileRT =
232 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000233
Bill Wendling08760582011-06-27 19:15:03 +0000234 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000235}
236
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000237static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000238 // Don't forward inputs from the original command line. They are added from
239 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000240 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000241 !O.hasFlag(options::DriverOption) &&
242 !O.hasFlag(options::LinkerInput);
243}
244
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000245void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000246 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000247 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000248 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 ArgStringList &CmdArgs,
250 const InputInfo &Output,
251 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000254 CheckPreprocessingOptions(D, Args);
255
256 Args.AddLastArg(CmdArgs, options::OPT_C);
257 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000258
259 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000260 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 (A = Args.getLastArg(options::OPT_MD)) ||
262 (A = Args.getLastArg(options::OPT_MMD))) {
263 // Determine the output location.
264 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000266 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000268 } else if (Output.getType() == types::TY_Dependencies) {
269 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000270 } else if (A->getOption().matches(options::OPT_M) ||
271 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 DepFile = "-";
273 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000274 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000275 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 }
277 CmdArgs.push_back("-dependency-file");
278 CmdArgs.push_back(DepFile);
279
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
282 const char *DepTarget;
283
284 // If user provided -o, that is the dependency target, except
285 // when we are only generating a dependency file.
286 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
287 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000288 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 } else {
290 // Otherwise derive from the base input.
291 //
292 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000293 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000294 llvm::sys::path::replace_extension(P, "o");
295 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297
298 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000299 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 QuoteTarget(DepTarget, Quoted);
301 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000304 if (A->getOption().matches(options::OPT_M) ||
305 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 CmdArgs.push_back("-sys-header-deps");
307 }
308
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000309 if (Args.hasArg(options::OPT_MG)) {
310 if (!A || A->getOption().matches(options::OPT_MD) ||
311 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000312 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 CmdArgs.push_back("-MG");
314 }
315
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000317
318 // Convert all -MQ <target> args to -MT <quoted target>
319 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
320 options::OPT_MQ),
321 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000322 const Arg *A = *it;
323 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000324
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000327 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000328 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000329 CmdArgs.push_back(Args.MakeArgString(Quoted));
330
331 // -MT flag - no change
332 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000333 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 }
335 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000336
Douglas Gregor111af7d2009-04-18 00:34:01 +0000337 // Add -i* options, and automatically translate to
338 // -include-pch/-include-pth for transparent PCH support. It's
339 // wonky, but we include looking for .gch so we can support seamless
340 // replacement into a build system already set up to be generating
341 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000343 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
344 ie = Args.filtered_end(); it != ie; ++it) {
345 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346
347 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000348 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
349 RenderedImplicitInclude = true;
350
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000351 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000353
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000354 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000356 SmallString<128> P(A->getValue());
357 // We want the files to have a name like foo.h.pch. Add a dummy extension
358 // so that replace_extension does the right thing.
359 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000360 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000361 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000362 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000364 }
365
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000367 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000368 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000370 }
371
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000373 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000374 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000375 FoundPCH = UsePCH;
376 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000378 }
379
380 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000381 if (IsFirstImplicitInclude) {
382 A->claim();
383 if (UsePCH)
384 CmdArgs.push_back("-include-pch");
385 else
386 CmdArgs.push_back("-include-pth");
387 CmdArgs.push_back(Args.MakeArgString(P.str()));
388 continue;
389 } else {
390 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000391 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 << P.str() << A->getAsString(Args);
393 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394 }
395 }
396
397 // Not translated, render as usual.
398 A->claim();
399 A->render(Args, CmdArgs);
400 }
401
402 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000403 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
404 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000405
406 // Add -Wp, and -Xassembler if using the preprocessor.
407
408 // FIXME: There is a very unfortunate problem here, some troubled
409 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
410 // really support that we would have to parse and then translate
411 // those options. :(
412 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
413 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000414
415 // -I- is a deprecated GCC feature, reject it.
416 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000417 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418
419 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
420 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000421 StringRef sysroot = C.getSysRoot();
422 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000423 if (!Args.hasArg(options::OPT_isysroot)) {
424 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000425 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000426 }
427 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000428
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000429 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000430 // FIXME: We should probably sink the logic for handling these from the
431 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // CPATH - included following the user specified includes (but prior to
433 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000436 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000437 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000438 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000439 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000440 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000441 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000442 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000444 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000445 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000446 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000447
448 // Add system include arguments.
449 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000450}
451
Amara Emerson703da2e2013-10-31 09:32:33 +0000452/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
453//
454// FIXME: tblgen this.
455static std::string getAArch64TargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue();
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 return "generic";
470}
471
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000472// FIXME: Move to target hook.
473static bool isSignedCharDefault(const llvm::Triple &Triple) {
474 switch (Triple.getArch()) {
475 default:
476 return true;
477
Tim Northover9bb857a2013-01-31 12:13:10 +0000478 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000479 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000480 case llvm::Triple::ppc:
481 case llvm::Triple::ppc64:
Tim Northover157d9112014-01-16 08:48:16 +0000482 if (Triple.isOSBinFormatMachO())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000483 return true;
484 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000485
Bill Schmidt778d3872013-07-26 01:36:11 +0000486 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000487 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000488 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000489 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000490 }
491}
492
Robert Lytton0e076492013-08-13 09:43:10 +0000493static bool isNoCommonDefault(const llvm::Triple &Triple) {
494 switch (Triple.getArch()) {
495 default:
496 return false;
497
498 case llvm::Triple::xcore:
499 return true;
500 }
501}
502
Chad Rosiercfbfc582012-04-04 20:51:35 +0000503// Handle -mfpu=.
504//
505// FIXME: Centralize feature selection, defaulting shouldn't be also in the
506// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000507static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
508 const ArgList &Args,
509 std::vector<const char *> &Features) {
510 StringRef FPU = A->getValue();
511 if (FPU == "fp-armv8") {
512 Features.push_back("+fp-armv8");
513 } else if (FPU == "neon-fp-armv8") {
514 Features.push_back("+fp-armv8");
515 Features.push_back("+neon");
516 } else if (FPU == "crypto-neon-fp-armv8") {
517 Features.push_back("+fp-armv8");
518 Features.push_back("+neon");
519 Features.push_back("+crypto");
520 } else if (FPU == "neon") {
521 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000522 } else
523 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
524}
525
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000526// Handle -mhwdiv=.
527static void getARMHWDivFeatures(const Driver &D, const Arg *A,
528 const ArgList &Args,
529 std::vector<const char *> &Features) {
530 StringRef HWDiv = A->getValue();
531 if (HWDiv == "arm") {
532 Features.push_back("+hwdiv-arm");
533 Features.push_back("-hwdiv");
534 } else if (HWDiv == "thumb") {
535 Features.push_back("-hwdiv-arm");
536 Features.push_back("+hwdiv");
537 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
538 Features.push_back("+hwdiv-arm");
539 Features.push_back("+hwdiv");
540 } else if (HWDiv == "none") {
541 Features.push_back("-hwdiv-arm");
542 Features.push_back("-hwdiv");
543 } else
544 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
545}
546
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000547// Handle -mfpu=.
548//
549// FIXME: Centralize feature selection, defaulting shouldn't be also in the
550// frontend target.
551static void getARMFPUFeatures(const Driver &D, const Arg *A,
552 const ArgList &Args,
553 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000554 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000555
556 // Set the target features based on the FPU.
557 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
558 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000559 Features.push_back("-vfp2");
560 Features.push_back("-vfp3");
561 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000562 } else if (FPU == "vfp") {
563 Features.push_back("+vfp2");
564 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000565 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000566 Features.push_back("+vfp3");
567 Features.push_back("+d16");
568 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000569 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000570 Features.push_back("+vfp3");
571 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000572 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
573 Features.push_back("+vfp4");
574 Features.push_back("+d16");
575 Features.push_back("-neon");
576 } else if (FPU == "vfp4" || FPU == "vfpv4") {
577 Features.push_back("+vfp4");
578 Features.push_back("-neon");
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");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000593 } else if (FPU == "none") {
594 Features.push_back("-vfp2");
595 Features.push_back("-vfp3");
596 Features.push_back("-vfp4");
597 Features.push_back("-fp-armv8");
598 Features.push_back("-crypto");
599 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000600 } else
601 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
602}
603
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000604// Select the float ABI as determined by -msoft-float, -mhard-float, and
605// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000606StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
607 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000608 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
610 options::OPT_mhard_float,
611 options::OPT_mfloat_abi_EQ)) {
612 if (A->getOption().matches(options::OPT_msoft_float))
613 FloatABI = "soft";
614 else if (A->getOption().matches(options::OPT_mhard_float))
615 FloatABI = "hard";
616 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000617 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000618 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000619 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000620 << A->getAsString(Args);
621 FloatABI = "soft";
622 }
623 }
624 }
625
626 // If unspecified, choose the default based on the platform.
627 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000628 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000629 case llvm::Triple::Darwin:
630 case llvm::Triple::MacOSX:
631 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000632 // Darwin defaults to "softfp" for v6 and v7.
633 //
634 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000635 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000636 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000637 if (StringRef(ArchName).startswith("v6") ||
638 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 FloatABI = "softfp";
640 else
641 FloatABI = "soft";
642 break;
643 }
644
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000645 case llvm::Triple::FreeBSD:
646 // FreeBSD defaults to soft float
647 FloatABI = "soft";
648 break;
649
Daniel Dunbar78485922009-09-10 23:00:09 +0000650 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000651 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000652 case llvm::Triple::GNUEABIHF:
653 FloatABI = "hard";
654 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000655 case llvm::Triple::GNUEABI:
656 FloatABI = "softfp";
657 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000658 case llvm::Triple::EABIHF:
659 FloatABI = "hard";
660 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000661 case llvm::Triple::EABI:
662 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
663 FloatABI = "softfp";
664 break;
Tim Northover5a68c4b2014-01-23 15:00:01 +0000665 case llvm::Triple::MachO: {
666 FloatABI = "soft";
667 break;
668 }
Logan Chienc6fd8202012-09-02 09:30:11 +0000669 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000670 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000671 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000672 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000673 FloatABI = "softfp";
674 else
675 FloatABI = "soft";
676 break;
677 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000678 default:
679 // Assume "soft", but warn the user we are guessing.
680 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000681 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000682 break;
683 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000684 }
685 }
686
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000687 return FloatABI;
688}
689
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000690static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
691 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000692 std::vector<const char *> &Features,
693 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000694 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000695 if (!ForAS) {
696 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
697 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
698 // stripped out by the ARM target. We should probably pass this a new
699 // -target-option, which is handled by the -cc1/-cc1as invocation.
700 //
701 // FIXME2: For consistency, it would be ideal if we set up the target
702 // machine state the same when using the frontend or the assembler. We don't
703 // currently do that for the assembler, we pass the options directly to the
704 // backend and never even instantiate the frontend TargetInfo. If we did,
705 // and used its handleTargetFeatures hook, then we could ensure the
706 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000707
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000708 // Use software floating point operations?
709 if (FloatABI == "soft")
710 Features.push_back("+soft-float");
711
712 // Use software floating point argument passing?
713 if (FloatABI != "hard")
714 Features.push_back("+soft-float-abi");
715 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000716
717 // Honor -mfpu=.
718 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000719 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000720 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
721 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000722
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000723 // Setting -msoft-float effectively disables NEON because of the GCC
724 // implementation, although the same isn't true of VFP or VFP3.
725 if (FloatABI == "soft")
726 Features.push_back("-neon");
Bernard Ogden18b57012013-10-29 09:47:51 +0000727
728 // En/disable crc
729 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
730 options::OPT_mnocrc)) {
731 if (A->getOption().matches(options::OPT_mcrc))
732 Features.push_back("+crc");
733 else
734 Features.push_back("-crc");
735 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000736}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000737
738void Clang::AddARMTargetArgs(const ArgList &Args,
739 ArgStringList &CmdArgs,
740 bool KernelOrKext) const {
741 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000742 // Get the effective triple, which takes into account the deployment target.
743 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
744 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000745 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000746
747 // Select the ABI to use.
748 //
749 // FIXME: Support -meabi.
750 const char *ABIName = 0;
751 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000752 ABIName = A->getValue();
Tim Northover157d9112014-01-16 08:48:16 +0000753 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000754 // The backend is hardwired to assume AAPCS for M-class processors, ensure
755 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000756 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Tim Northover157d9112014-01-16 08:48:16 +0000757 Triple.getEnvironment() == llvm::Triple::MachO ||
Tim Northovere66c9462013-10-03 14:23:28 +0000758 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000759 ABIName = "aapcs";
760 } else {
761 ABIName = "apcs-gnu";
762 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000763 } else {
764 // Select the default based on the platform.
765 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000766 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000767 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000768 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000769 ABIName = "aapcs-linux";
770 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000771 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000772 case llvm::Triple::EABI:
773 ABIName = "aapcs";
774 break;
775 default:
776 ABIName = "apcs-gnu";
777 }
778 }
779 CmdArgs.push_back("-target-abi");
780 CmdArgs.push_back(ABIName);
781
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000782 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000783 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000784 if (FloatABI == "soft") {
785 // Floating point operations and argument passing are soft.
786 //
787 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000788 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000789 CmdArgs.push_back("-mfloat-abi");
790 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000791 } else if (FloatABI == "softfp") {
792 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000793 CmdArgs.push_back("-mfloat-abi");
794 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000795 } else {
796 // Floating point operations and argument passing are hard.
797 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000798 CmdArgs.push_back("-mfloat-abi");
799 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000800 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000801
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000802 // Kernel code has more strict alignment requirements.
803 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000804 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000805 CmdArgs.push_back("-backend-option");
806 CmdArgs.push_back("-arm-long-calls");
807 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000808
Daniel Dunbar12100e22011-03-22 16:48:17 +0000809 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000810 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000811
812 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000813 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000814 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000815 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000816
817 // Setting -mno-global-merge disables the codegen global merge pass. Setting
818 // -mglobal-merge has no effect as the pass is enabled by default.
819 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
820 options::OPT_mno_global_merge)) {
821 if (A->getOption().matches(options::OPT_mno_global_merge))
822 CmdArgs.push_back("-mno-global-merge");
823 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000824
Bob Wilson9c8af452013-04-11 18:53:25 +0000825 if (!Args.hasFlag(options::OPT_mimplicit_float,
826 options::OPT_mno_implicit_float,
827 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000828 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000829
830 // llvm does not support reserving registers in general. There is support
831 // for reserving r9 on ARM though (defined as a platform-specific register
832 // in ARM EABI).
833 if (Args.hasArg(options::OPT_ffixed_r9)) {
834 CmdArgs.push_back("-backend-option");
835 CmdArgs.push_back("-arm-reserve-r9");
836 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000837}
838
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000839// Get CPU and ABI names. They are not independent
840// so we have to calculate them together.
841static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000842 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000843 StringRef &CPUName,
844 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000845 const char *DefMips32CPU = "mips32r2";
846 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000847
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000848 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000849 options::OPT_mcpu_EQ))
850 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000851
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000852 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000853 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000854 // Convert a GNU style Mips ABI name to the name
855 // accepted by LLVM Mips backend.
856 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
857 .Case("32", "o32")
858 .Case("64", "n64")
859 .Default(ABIName);
860 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000861
862 // Setup default CPU and ABI names.
863 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000864 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000865 default:
866 llvm_unreachable("Unexpected triple arch name");
867 case llvm::Triple::mips:
868 case llvm::Triple::mipsel:
869 CPUName = DefMips32CPU;
870 break;
871 case llvm::Triple::mips64:
872 case llvm::Triple::mips64el:
873 CPUName = DefMips64CPU;
874 break;
875 }
876 }
877
878 if (!ABIName.empty()) {
879 // Deduce CPU name from ABI name.
880 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000881 .Cases("32", "o32", "eabi", DefMips32CPU)
882 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000883 .Default("");
884 }
885 else if (!CPUName.empty()) {
886 // Deduce ABI name from CPU name.
887 ABIName = llvm::StringSwitch<const char *>(CPUName)
888 .Cases("mips32", "mips32r2", "o32")
889 .Cases("mips64", "mips64r2", "n64")
890 .Default("");
891 }
892
893 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000894}
895
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000896// Convert ABI name to the GNU tools acceptable variant.
897static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
898 return llvm::StringSwitch<llvm::StringRef>(ABI)
899 .Case("o32", "32")
900 .Case("n64", "64")
901 .Default(ABI);
902}
903
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000904// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
905// and -mfloat-abi=.
906static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000907 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000908 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000909 options::OPT_mhard_float,
910 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000911 if (A->getOption().matches(options::OPT_msoft_float))
912 FloatABI = "soft";
913 else if (A->getOption().matches(options::OPT_mhard_float))
914 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000915 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000916 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000917 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000918 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000919 FloatABI = "hard";
920 }
921 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000922 }
923
924 // If unspecified, choose the default based on the platform.
925 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000926 // Assume "hard", because it's a default value used by gcc.
927 // When we start to recognize specific target MIPS processors,
928 // we will be able to select the default more correctly.
929 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000930 }
931
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000932 return FloatABI;
933}
934
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000935static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000936 std::vector<const char *> &Features,
937 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000938 StringRef FeatureName) {
939 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000940 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000941 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000942 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000943 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000944 }
945}
946
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000947static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
948 std::vector<const char *> &Features) {
949 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000950 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000951 // FIXME: Note, this is a hack. We need to pass the selected float
952 // mode to the MipsTargetInfoBase to define appropriate macros there.
953 // Now it is the only method.
954 Features.push_back("+soft-float");
955 }
956
Simon Atanasyan22127ce2013-09-24 09:09:16 +0000957 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
958 if (StringRef(A->getValue()) == "2008")
959 Features.push_back("+nan2008");
960 }
961
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000962 AddTargetFeature(Args, Features, options::OPT_msingle_float,
963 options::OPT_mdouble_float, "single-float");
964 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
965 "mips16");
966 AddTargetFeature(Args, Features, options::OPT_mmicromips,
967 options::OPT_mno_micromips, "micromips");
968 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
969 "dsp");
970 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
971 "dspr2");
972 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
973 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +0000974 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
975 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000976}
977
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000978void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000979 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000980 const Driver &D = getToolChain().getDriver();
981 StringRef CPUName;
982 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000983 const llvm::Triple &Triple = getToolChain().getTriple();
984 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000985
986 CmdArgs.push_back("-target-abi");
987 CmdArgs.push_back(ABIName.data());
988
989 StringRef FloatABI = getMipsFloatABI(D, Args);
990
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +0000991 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +0000992 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000993 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000996 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000997 else {
998 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000999 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001000 CmdArgs.push_back("-mfloat-abi");
1001 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001002 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001003
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001004 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1005 if (A->getOption().matches(options::OPT_mxgot)) {
1006 CmdArgs.push_back("-mllvm");
1007 CmdArgs.push_back("-mxgot");
1008 }
1009 }
1010
Simon Atanasyanc580b322013-05-11 06:33:44 +00001011 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1012 options::OPT_mno_ldc1_sdc1)) {
1013 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1014 CmdArgs.push_back("-mllvm");
1015 CmdArgs.push_back("-mno-ldc1-sdc1");
1016 }
1017 }
1018
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001019 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1020 options::OPT_mno_check_zero_division)) {
1021 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1022 CmdArgs.push_back("-mllvm");
1023 CmdArgs.push_back("-mno-check-zero-division");
1024 }
1025 }
1026
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001027 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001028 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001029 CmdArgs.push_back("-mllvm");
1030 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1031 A->claim();
1032 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001033}
1034
Hal Finkel8eb59282012-06-11 22:35:19 +00001035/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1036static std::string getPPCTargetCPU(const ArgList &Args) {
1037 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001038 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001039
1040 if (CPUName == "native") {
1041 std::string CPU = llvm::sys::getHostCPUName();
1042 if (!CPU.empty() && CPU != "generic")
1043 return CPU;
1044 else
1045 return "";
1046 }
1047
1048 return llvm::StringSwitch<const char *>(CPUName)
1049 .Case("common", "generic")
1050 .Case("440", "440")
1051 .Case("440fp", "440")
1052 .Case("450", "450")
1053 .Case("601", "601")
1054 .Case("602", "602")
1055 .Case("603", "603")
1056 .Case("603e", "603e")
1057 .Case("603ev", "603ev")
1058 .Case("604", "604")
1059 .Case("604e", "604e")
1060 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001061 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001062 .Case("G3", "g3")
1063 .Case("7400", "7400")
1064 .Case("G4", "g4")
1065 .Case("7450", "7450")
1066 .Case("G4+", "g4+")
1067 .Case("750", "750")
1068 .Case("970", "970")
1069 .Case("G5", "g5")
1070 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001071 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001072 .Case("e500mc", "e500mc")
1073 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001074 .Case("power3", "pwr3")
1075 .Case("power4", "pwr4")
1076 .Case("power5", "pwr5")
1077 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001078 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001079 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001080 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001081 .Case("pwr3", "pwr3")
1082 .Case("pwr4", "pwr4")
1083 .Case("pwr5", "pwr5")
1084 .Case("pwr5x", "pwr5x")
1085 .Case("pwr6", "pwr6")
1086 .Case("pwr6x", "pwr6x")
1087 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001088 .Case("powerpc", "ppc")
1089 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001090 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001091 .Default("");
1092 }
1093
1094 return "";
1095}
1096
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001097static void getPPCTargetFeatures(const ArgList &Args,
1098 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001099 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1100 ie = Args.filtered_end();
1101 it != ie; ++it) {
1102 StringRef Name = (*it)->getOption().getName();
1103 (*it)->claim();
1104
1105 // Skip over "-m".
1106 assert(Name.startswith("m") && "Invalid feature name.");
1107 Name = Name.substr(1);
1108
1109 bool IsNegative = Name.startswith("no-");
1110 if (IsNegative)
1111 Name = Name.substr(3);
1112
1113 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1114 // pass the correct option to the backend while calling the frontend
1115 // option the same.
1116 // TODO: Change the LLVM backend option maybe?
1117 if (Name == "mfcrf")
1118 Name = "mfocrf";
1119
1120 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1121 }
1122
1123 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001124 AddTargetFeature(Args, Features, options::OPT_faltivec,
1125 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001126}
1127
Tom Stellard6674c702013-04-01 20:56:53 +00001128/// Get the (LLVM) name of the R600 gpu we are targeting.
1129static std::string getR600TargetGPU(const ArgList &Args) {
1130 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001131 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001132 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001133 .Cases("rv630", "rv635", "r600")
1134 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001135 .Case("rv740", "rv770")
1136 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001137 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001138 .Case("hemlock", "cypress")
1139 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001140 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001141 }
1142 return "";
1143}
1144
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001145static void getSparcTargetFeatures(const ArgList &Args,
1146 std::vector<const char *> Features) {
1147 bool SoftFloatABI = true;
1148 if (Arg *A =
1149 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1150 if (A->getOption().matches(options::OPT_mhard_float))
1151 SoftFloatABI = false;
1152 }
1153 if (SoftFloatABI)
1154 Features.push_back("+soft-float");
1155}
1156
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001157void Clang::AddSparcTargetArgs(const ArgList &Args,
1158 ArgStringList &CmdArgs) const {
1159 const Driver &D = getToolChain().getDriver();
1160
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001161 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001162 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001163 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1164 options::OPT_mhard_float)) {
1165 if (A->getOption().matches(options::OPT_msoft_float))
1166 FloatABI = "soft";
1167 else if (A->getOption().matches(options::OPT_mhard_float))
1168 FloatABI = "hard";
1169 }
1170
1171 // If unspecified, choose the default based on the platform.
1172 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001173 // Assume "soft", but warn the user we are guessing.
1174 FloatABI = "soft";
1175 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001176 }
1177
1178 if (FloatABI == "soft") {
1179 // Floating point operations and argument passing are soft.
1180 //
1181 // FIXME: This changes CPP defines, we need -target-soft-float.
1182 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001183 } else {
1184 assert(FloatABI == "hard" && "Invalid float abi!");
1185 CmdArgs.push_back("-mhard-float");
1186 }
1187}
1188
Richard Sandiford4652d892013-07-19 16:51:51 +00001189static const char *getSystemZTargetCPU(const ArgList &Args) {
1190 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1191 return A->getValue();
1192 return "z10";
1193}
1194
Chandler Carruth953fb082013-01-13 11:46:33 +00001195static const char *getX86TargetCPU(const ArgList &Args,
1196 const llvm::Triple &Triple) {
1197 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001198 if (StringRef(A->getValue()) != "native") {
Tim Northover157d9112014-01-16 08:48:16 +00001199 if (Triple.isOSBinFormatMachO() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001200 return "core-avx2";
1201
Chandler Carruth953fb082013-01-13 11:46:33 +00001202 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001203 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001204
1205 // FIXME: Reject attempts to use -march=native unless the target matches
1206 // the host.
1207 //
1208 // FIXME: We should also incorporate the detected target features for use
1209 // with -native.
1210 std::string CPU = llvm::sys::getHostCPUName();
1211 if (!CPU.empty() && CPU != "generic")
1212 return Args.MakeArgString(CPU);
1213 }
1214
1215 // Select the default CPU if none was given (or detection failed).
1216
1217 if (Triple.getArch() != llvm::Triple::x86_64 &&
1218 Triple.getArch() != llvm::Triple::x86)
1219 return 0; // This routine is only handling x86 targets.
1220
1221 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1222
1223 // FIXME: Need target hooks.
Tim Northover157d9112014-01-16 08:48:16 +00001224 if (Triple.isOSBinFormatMachO()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001225 if (Triple.getArchName() == "x86_64h")
1226 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001227 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001228 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001229
Alexey Bataev286d1b92014-01-31 04:07:13 +00001230 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001231 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001232 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001233
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001234 // Everything else goes to x86-64 in 64-bit mode.
1235 if (Is64Bit)
1236 return "x86-64";
1237
1238 switch (Triple.getOS()) {
1239 case llvm::Triple::FreeBSD:
1240 case llvm::Triple::NetBSD:
1241 case llvm::Triple::OpenBSD:
1242 return "i486";
1243 case llvm::Triple::Haiku:
1244 return "i586";
1245 case llvm::Triple::Bitrig:
1246 return "i686";
1247 default:
1248 // Fallback to p4.
1249 return "pentium4";
1250 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001251}
1252
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001253static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1254 switch(T.getArch()) {
1255 default:
1256 return "";
1257
Amara Emerson703da2e2013-10-31 09:32:33 +00001258 case llvm::Triple::aarch64:
1259 return getAArch64TargetCPU(Args, T);
1260
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001261 case llvm::Triple::arm:
1262 case llvm::Triple::thumb:
Bernard Ogden31561762013-12-12 13:27:11 +00001263 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001264
1265 case llvm::Triple::mips:
1266 case llvm::Triple::mipsel:
1267 case llvm::Triple::mips64:
1268 case llvm::Triple::mips64el: {
1269 StringRef CPUName;
1270 StringRef ABIName;
1271 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1272 return CPUName;
1273 }
1274
1275 case llvm::Triple::ppc:
1276 case llvm::Triple::ppc64:
1277 case llvm::Triple::ppc64le: {
1278 std::string TargetCPUName = getPPCTargetCPU(Args);
1279 // LLVM may default to generating code for the native CPU,
1280 // but, like gcc, we default to a more generic option for
1281 // each architecture. (except on Darwin)
1282 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1283 if (T.getArch() == llvm::Triple::ppc64)
1284 TargetCPUName = "ppc64";
1285 else if (T.getArch() == llvm::Triple::ppc64le)
1286 TargetCPUName = "ppc64le";
1287 else
1288 TargetCPUName = "ppc";
1289 }
1290 return TargetCPUName;
1291 }
1292
1293 case llvm::Triple::sparc:
1294 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1295 return A->getValue();
1296 return "";
1297
1298 case llvm::Triple::x86:
1299 case llvm::Triple::x86_64:
1300 return getX86TargetCPU(Args, T);
1301
1302 case llvm::Triple::hexagon:
1303 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1304
1305 case llvm::Triple::systemz:
1306 return getSystemZTargetCPU(Args);
1307
1308 case llvm::Triple::r600:
1309 return getR600TargetGPU(Args);
1310 }
1311}
1312
Alp Tokerce365ca2013-12-02 12:43:03 +00001313static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1314 ArgStringList &CmdArgs) {
1315 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1316 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1317 // forward.
1318 CmdArgs.push_back("-plugin");
1319 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1320 CmdArgs.push_back(Args.MakeArgString(Plugin));
1321
1322 // Try to pass driver level flags relevant to LTO code generation down to
1323 // the plugin.
1324
1325 // Handle flags for selecting CPU variants.
1326 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1327 if (!CPU.empty())
1328 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1329}
1330
Jim Grosbach82eee262013-11-16 00:53:35 +00001331static void getX86TargetFeatures(const llvm::Triple &Triple,
1332 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001333 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001334 if (Triple.getArchName() == "x86_64h") {
1335 // x86_64h implies quite a few of the more modern subtarget features
1336 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1337 Features.push_back("-rdrnd");
1338 Features.push_back("-aes");
1339 Features.push_back("-pclmul");
1340 Features.push_back("-rtm");
1341 Features.push_back("-hle");
1342 Features.push_back("-fsgsbase");
1343 }
1344
Alexey Bataev286d1b92014-01-31 04:07:13 +00001345 if (Triple.getEnvironment() == llvm::Triple::Android) {
1346 // Add sse3 feature to comply with gcc on Android
1347 Features.push_back("+sse3");
1348 }
1349
Jim Grosbach82eee262013-11-16 00:53:35 +00001350 // Now add any that the user explicitly requested on the command line,
1351 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001352 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1353 ie = Args.filtered_end();
1354 it != ie; ++it) {
1355 StringRef Name = (*it)->getOption().getName();
1356 (*it)->claim();
1357
1358 // Skip over "-m".
1359 assert(Name.startswith("m") && "Invalid feature name.");
1360 Name = Name.substr(1);
1361
1362 bool IsNegative = Name.startswith("no-");
1363 if (IsNegative)
1364 Name = Name.substr(3);
1365
1366 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1367 }
1368}
1369
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001370void Clang::AddX86TargetArgs(const ArgList &Args,
1371 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001372 if (!Args.hasFlag(options::OPT_mred_zone,
1373 options::OPT_mno_red_zone,
1374 true) ||
1375 Args.hasArg(options::OPT_mkernel) ||
1376 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001377 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001378
Bob Wilson2616e2e2013-02-10 16:01:41 +00001379 // Default to avoid implicit floating-point for kernel/kext code, but allow
1380 // that to be overridden with -mno-soft-float.
1381 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1382 Args.hasArg(options::OPT_fapple_kext));
1383 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1384 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001385 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001386 options::OPT_mno_implicit_float)) {
1387 const Option &O = A->getOption();
1388 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1389 O.matches(options::OPT_msoft_float));
1390 }
1391 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001392 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001393}
1394
Matthew Curtise8f80a12012-12-06 17:49:03 +00001395static inline bool HasPICArg(const ArgList &Args) {
1396 return Args.hasArg(options::OPT_fPIC)
1397 || Args.hasArg(options::OPT_fpic);
1398}
1399
1400static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1401 return Args.getLastArg(options::OPT_G,
1402 options::OPT_G_EQ,
1403 options::OPT_msmall_data_threshold_EQ);
1404}
1405
1406static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1407 std::string value;
1408 if (HasPICArg(Args))
1409 value = "0";
1410 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1411 value = A->getValue();
1412 A->claim();
1413 }
1414 return value;
1415}
1416
Tony Linthicum76329bf2011-12-12 21:14:55 +00001417void Clang::AddHexagonTargetArgs(const ArgList &Args,
1418 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001419 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001420 CmdArgs.push_back("-mqdsp6-compat");
1421 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001422
Matthew Curtise8f80a12012-12-06 17:49:03 +00001423 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1424 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001425 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001426 CmdArgs.push_back(Args.MakeArgString(
1427 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001428 }
1429
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001430 if (!Args.hasArg(options::OPT_fno_short_enums))
1431 CmdArgs.push_back("-fshort-enums");
1432 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1433 CmdArgs.push_back ("-mllvm");
1434 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1435 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001436 CmdArgs.push_back ("-mllvm");
1437 CmdArgs.push_back ("-machine-sink-split=0");
1438}
1439
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001440static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1441 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001442 // Honor -mfpu=.
1443 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001444 getAArch64FPUFeatures(D, A, Args, Features);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001445
1446 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1447 Features.push_back("-fp-armv8");
1448 Features.push_back("-crypto");
1449 Features.push_back("-neon");
1450 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001451}
1452
1453static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001454 const ArgList &Args, ArgStringList &CmdArgs,
1455 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001456 std::vector<const char *> Features;
1457 switch (Triple.getArch()) {
1458 default:
1459 break;
1460 case llvm::Triple::mips:
1461 case llvm::Triple::mipsel:
1462 case llvm::Triple::mips64:
1463 case llvm::Triple::mips64el:
1464 getMIPSTargetFeatures(D, Args, Features);
1465 break;
1466
1467 case llvm::Triple::arm:
1468 case llvm::Triple::thumb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001469 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001470 break;
1471
1472 case llvm::Triple::ppc:
1473 case llvm::Triple::ppc64:
1474 case llvm::Triple::ppc64le:
1475 getPPCTargetFeatures(Args, Features);
1476 break;
1477 case llvm::Triple::sparc:
1478 getSparcTargetFeatures(Args, Features);
1479 break;
1480 case llvm::Triple::aarch64:
1481 getAArch64TargetFeatures(D, Args, Features);
1482 break;
1483 case llvm::Triple::x86:
1484 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001485 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001486 break;
1487 }
Rafael Espindola43964802013-08-21 17:34:32 +00001488
1489 // Find the last of each feature.
1490 llvm::StringMap<unsigned> LastOpt;
1491 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1492 const char *Name = Features[I];
1493 assert(Name[0] == '-' || Name[0] == '+');
1494 LastOpt[Name + 1] = I;
1495 }
1496
1497 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1498 // If this feature was overridden, ignore it.
1499 const char *Name = Features[I];
1500 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1501 assert(LastI != LastOpt.end());
1502 unsigned Last = LastI->second;
1503 if (Last != I)
1504 continue;
1505
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001506 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001507 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001508 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001509}
1510
Eric Christopher84fbdb42011-08-19 00:30:14 +00001511static bool
John McCall5fb5df92012-06-20 06:18:46 +00001512shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001513 const llvm::Triple &Triple) {
1514 // We use the zero-cost exception tables for Objective-C if the non-fragile
1515 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1516 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001517 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001518 return true;
1519
Bob Wilson83e723a2013-12-05 19:38:42 +00001520 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001521 return false;
1522
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001523 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001524 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001525 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001526}
1527
Anders Carlssone96ab552011-02-28 02:27:16 +00001528/// addExceptionArgs - Adds exception related arguments to the driver command
1529/// arguments. There's a master flag, -fexceptions and also language specific
1530/// flags to enable/disable C++ and Objective-C exceptions.
1531/// This makes it possible to for example disable C++ exceptions but enable
1532/// Objective-C exceptions.
1533static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1534 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001535 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001536 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001537 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001538 if (KernelOrKext) {
1539 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1540 // arguments now to avoid warnings about unused arguments.
1541 Args.ClaimAllArgs(options::OPT_fexceptions);
1542 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1543 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1544 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1545 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1546 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001547 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001548 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001549
1550 // Exceptions are enabled by default.
1551 bool ExceptionsEnabled = true;
1552
1553 // This keeps track of whether exceptions were explicitly turned on or off.
1554 bool DidHaveExplicitExceptionFlag = false;
1555
Rafael Espindola00a66572009-10-01 13:33:33 +00001556 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1557 options::OPT_fno_exceptions)) {
1558 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001559 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001560 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001561 ExceptionsEnabled = false;
1562
1563 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001564 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001565
Anders Carlssone96ab552011-02-28 02:27:16 +00001566 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001567
Anders Carlssone96ab552011-02-28 02:27:16 +00001568 // Exception tables and cleanups can be enabled with -fexceptions even if the
1569 // language itself doesn't support exceptions.
1570 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1571 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001572
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001573 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1574 // is not necessarily sensible, but follows GCC.
1575 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001576 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001577 options::OPT_fno_objc_exceptions,
1578 true)) {
1579 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001580
Eric Christopher84fbdb42011-08-19 00:30:14 +00001581 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001582 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001583 }
1584
1585 if (types::isCXX(InputType)) {
1586 bool CXXExceptionsEnabled = ExceptionsEnabled;
1587
Eric Christopher84fbdb42011-08-19 00:30:14 +00001588 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1589 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001590 options::OPT_fexceptions,
1591 options::OPT_fno_exceptions)) {
1592 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1593 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001594 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001595 CXXExceptionsEnabled = false;
1596 }
1597
1598 if (CXXExceptionsEnabled) {
1599 CmdArgs.push_back("-fcxx-exceptions");
1600
1601 ShouldUseExceptionTables = true;
1602 }
1603 }
1604
1605 if (ShouldUseExceptionTables)
1606 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001607}
1608
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001609static bool ShouldDisableAutolink(const ArgList &Args,
1610 const ToolChain &TC) {
1611 bool Default = true;
1612 if (TC.getTriple().isOSDarwin()) {
1613 // The native darwin assembler doesn't support the linker_option directives,
1614 // so we disable them if we think the .s file will be passed to it.
1615 Default = TC.useIntegratedAs();
1616 }
1617 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1618 Default);
1619}
1620
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001621static bool ShouldDisableCFI(const ArgList &Args,
1622 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001623 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001624 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001625 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001626 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001627 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001628 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001629 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001630 options::OPT_fno_dwarf2_cfi_asm,
1631 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001632}
1633
Ted Kremenek62093662013-03-12 17:02:12 +00001634static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1635 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001636 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1637 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001638 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001639 return !UseDwarfDirectory;
1640}
1641
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001642/// \brief Check whether the given input tree contains any compilation actions.
1643static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001644 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001645 return true;
1646
1647 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1648 if (ContainsCompileAction(*it))
1649 return true;
1650
1651 return false;
1652}
1653
1654/// \brief Check if -relax-all should be passed to the internal assembler.
1655/// This is done by default when compiling non-assembler source with -O0.
1656static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1657 bool RelaxDefault = true;
1658
1659 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1660 RelaxDefault = A->getOption().matches(options::OPT_O0);
1661
1662 if (RelaxDefault) {
1663 RelaxDefault = false;
1664 for (ActionList::const_iterator it = C.getActions().begin(),
1665 ie = C.getActions().end(); it != ie; ++it) {
1666 if (ContainsCompileAction(*it)) {
1667 RelaxDefault = true;
1668 break;
1669 }
1670 }
1671 }
1672
1673 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1674 RelaxDefault);
1675}
1676
David Blaikie9260ed62013-07-25 21:19:01 +00001677static void CollectArgsForIntegratedAssembler(Compilation &C,
1678 const ArgList &Args,
1679 ArgStringList &CmdArgs,
1680 const Driver &D) {
1681 if (UseRelaxAll(C, Args))
1682 CmdArgs.push_back("-mrelax-all");
1683
David Peixottodfb66142013-11-14 22:52:58 +00001684 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001685 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001686 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1687 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1688 // arg after parsing the '-I' arg.
1689 bool TakeNextArg = false;
1690
David Blaikie9260ed62013-07-25 21:19:01 +00001691 // When using an integrated assembler, translate -Wa, and -Xassembler
1692 // options.
1693 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1694 options::OPT_Xassembler),
1695 ie = Args.filtered_end(); it != ie; ++it) {
1696 const Arg *A = *it;
1697 A->claim();
1698
1699 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1700 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001701 if (TakeNextArg) {
1702 CmdArgs.push_back(Value.data());
1703 TakeNextArg = false;
1704 continue;
1705 }
David Blaikie9260ed62013-07-25 21:19:01 +00001706
1707 if (Value == "-force_cpusubtype_ALL") {
1708 // Do nothing, this is the default and we don't support anything else.
1709 } else if (Value == "-L") {
1710 CmdArgs.push_back("-msave-temp-labels");
1711 } else if (Value == "--fatal-warnings") {
1712 CmdArgs.push_back("-mllvm");
1713 CmdArgs.push_back("-fatal-assembler-warnings");
1714 } else if (Value == "--noexecstack") {
1715 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00001716 } else if (Value == "-compress-debug-sections" ||
1717 Value == "--compress-debug-sections") {
David Blaikie372d9502014-01-17 03:17:40 +00001718 D.Diag(diag::warn_missing_debug_compression);
David Peixottodfb66142013-11-14 22:52:58 +00001719 } else if (Value.startswith("-I")) {
1720 CmdArgs.push_back(Value.data());
1721 // We need to consume the next argument if the current arg is a plain
1722 // -I. The next arg will be the include directory.
1723 if (Value == "-I")
1724 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001725 } else {
1726 D.Diag(diag::err_drv_unsupported_option_argument)
1727 << A->getOption().getName() << Value;
1728 }
1729 }
1730 }
1731}
1732
Renato Goline807c122014-01-31 11:47:28 +00001733// Until ARM libraries are build separately, we have them all in one library
1734static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
1735 if (TC.getArch() == llvm::Triple::arm)
1736 return "arm";
1737 else
1738 return TC.getArchName();
1739}
1740
Chandler Carruth36381702013-06-23 11:28:48 +00001741static void addProfileRTLinux(
1742 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1743 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1744 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00001745 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00001746 Args.hasArg(options::OPT_fcreate_profile) ||
1747 Args.hasArg(options::OPT_coverage)))
1748 return;
1749
1750 // The profile runtime is located in the Linux library directory and has name
1751 // "libclang_rt.profile-<ArchName>.a".
1752 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1753 llvm::sys::path::append(
1754 LibProfile, "lib", "linux",
Renato Goline807c122014-01-31 11:47:28 +00001755 Twine("libclang_rt.profile-") + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00001756
1757 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1758}
1759
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001760static void addSanitizerRTLinkFlagsLinux(
1761 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001762 const StringRef Sanitizer, bool BeforeLibStdCXX,
1763 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001764 // Sanitizer runtime is located in the Linux library directory and
1765 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1766 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1767 llvm::sys::path::append(
1768 LibSanitizer, "lib", "linux",
Renato Goline807c122014-01-31 11:47:28 +00001769 (Twine("libclang_rt.") + Sanitizer + "-" +
1770 getArchNameForCompilerRTLib(TC) + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001771
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001772 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1773 // etc.) so that the linker picks custom versions of the global 'operator
1774 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001775 // strategy of inserting it at the front of the link command. It also
1776 // needs to be forced to end up in the executable, so wrap it in
1777 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001778 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001779 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001780 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001781 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001782
1783 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1784 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1785
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001786 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001787 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001788 CmdArgs.push_back("-ldl");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001789 CmdArgs.push_back("-lm");
Richard Smithf3e624c2013-03-23 00:30:08 +00001790
1791 // If possible, use a dynamic symbols file to export the symbols from the
1792 // runtime library. If we can't do so, use -export-dynamic instead to export
1793 // all symbols from the binary.
1794 if (ExportSymbols) {
1795 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1796 CmdArgs.push_back(
1797 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1798 else
1799 CmdArgs.push_back("-export-dynamic");
1800 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001801}
1802
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001803/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1804/// This needs to be called before we add the C run-time (malloc, etc).
1805static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001806 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001807 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001808 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1809 llvm::sys::path::append(LibAsan, "lib", "linux",
1810 (Twine("libclang_rt.asan-") +
Renato Goline807c122014-01-31 11:47:28 +00001811 getArchNameForCompilerRTLib(TC) + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001812 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001813 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001814 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001815 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001816 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001817}
1818
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001819/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1820/// This needs to be called before we add the C run-time (malloc, etc).
1821static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1822 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001823 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001824 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001825}
1826
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001827/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1828/// This needs to be called before we add the C run-time (malloc, etc).
1829static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1830 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001831 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001832 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001833}
1834
1835/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1836/// This needs to be called before we add the C run-time (malloc, etc).
1837static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1838 ArgStringList &CmdArgs) {
1839 if (!Args.hasArg(options::OPT_shared))
1840 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001841}
1842
Richard Smithe30752c2012-10-09 19:52:38 +00001843/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1844/// (Linux).
1845static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001846 ArgStringList &CmdArgs, bool IsCXX,
1847 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001848 // Need a copy of sanitizer_common. This could come from another sanitizer
1849 // runtime; if we're not including one, include our own copy.
1850 if (!HasOtherSanitizerRt)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001851 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1852
1853 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1854
1855 // Only include the bits of the runtime which need a C++ ABI library if
1856 // we're linking in C++ mode.
1857 if (IsCXX)
1858 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001859}
1860
Peter Collingbournec3772752013-08-07 22:47:34 +00001861static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1862 ArgStringList &CmdArgs) {
1863 if (!Args.hasArg(options::OPT_shared))
1864 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1865}
1866
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001867static bool shouldUseFramePointerForTarget(const ArgList &Args,
1868 const llvm::Triple &Triple) {
1869 switch (Triple.getArch()) {
1870 // Don't use a frame pointer on linux if optimizing for certain targets.
1871 case llvm::Triple::mips64:
1872 case llvm::Triple::mips64el:
1873 case llvm::Triple::mips:
1874 case llvm::Triple::mipsel:
1875 case llvm::Triple::systemz:
1876 case llvm::Triple::x86:
1877 case llvm::Triple::x86_64:
1878 if (Triple.isOSLinux())
1879 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1880 if (!A->getOption().matches(options::OPT_O0))
1881 return false;
1882 return true;
1883 case llvm::Triple::xcore:
1884 return false;
1885 default:
1886 return true;
1887 }
1888}
1889
Rafael Espindola224dd632011-12-14 21:02:23 +00001890static bool shouldUseFramePointer(const ArgList &Args,
1891 const llvm::Triple &Triple) {
1892 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1893 options::OPT_fomit_frame_pointer))
1894 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1895
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001896 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00001897}
1898
Eric Christopherb7d97e92013-04-03 01:58:53 +00001899static bool shouldUseLeafFramePointer(const ArgList &Args,
1900 const llvm::Triple &Triple) {
1901 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1902 options::OPT_momit_leaf_frame_pointer))
1903 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1904
Benjamin Kramer34cb0432013-10-16 17:42:39 +00001905 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00001906}
1907
Rafael Espindolac7367ff2013-08-10 01:40:10 +00001908/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001909static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001910 SmallString<128> cwd;
1911 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001912 CmdArgs.push_back("-fdebug-compilation-dir");
1913 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001914 }
1915}
1916
Eric Christopherd3804002013-02-22 20:12:52 +00001917static const char *SplitDebugName(const ArgList &Args,
1918 const InputInfoList &Inputs) {
1919 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1920 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1921 SmallString<128> T(FinalOutput->getValue());
1922 llvm::sys::path::replace_extension(T, "dwo");
1923 return Args.MakeArgString(T);
1924 } else {
1925 // Use the compilation dir.
1926 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1927 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1928 llvm::sys::path::replace_extension(F, "dwo");
1929 T += F;
1930 return Args.MakeArgString(F);
1931 }
1932}
1933
1934static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1935 const Tool &T, const JobAction &JA,
1936 const ArgList &Args, const InputInfo &Output,
1937 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001938 ArgStringList ExtractArgs;
1939 ExtractArgs.push_back("--extract-dwo");
1940
1941 ArgStringList StripArgs;
1942 StripArgs.push_back("--strip-dwo");
1943
1944 // Grabbing the output of the earlier compile step.
1945 StripArgs.push_back(Output.getFilename());
1946 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001947 ExtractArgs.push_back(OutFile);
1948
1949 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001950 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001951
1952 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001953 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001954
1955 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001956 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001957}
1958
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001959static bool isOptimizationLevelFast(const ArgList &Args) {
1960 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1961 if (A->getOption().matches(options::OPT_Ofast))
1962 return true;
1963 return false;
1964}
1965
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001966/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
1967static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
1968 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00001969 if (A->getOption().matches(options::OPT_O4) ||
1970 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001971 return true;
1972
1973 if (A->getOption().matches(options::OPT_O0))
1974 return false;
1975
1976 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
1977
Rafael Espindola91780de2013-08-26 14:05:41 +00001978 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001979 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00001980 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00001981 return true;
1982
1983 // Don't vectorize -Oz.
1984 if (S == "z")
1985 return false;
1986
1987 unsigned OptLevel = 0;
1988 if (S.getAsInteger(10, OptLevel))
1989 return false;
1990
1991 return OptLevel > 1;
1992 }
1993
1994 return false;
1995}
1996
Ben Langmuir2cb4a782014-02-05 22:21:15 +00001997/// Add -x lang to \p CmdArgs for \p Input.
1998static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
1999 ArgStringList &CmdArgs) {
2000 // When using -verify-pch, we don't want to provide the type
2001 // 'precompiled-header' if it was inferred from the file extension
2002 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2003 return;
2004
2005 CmdArgs.push_back("-x");
2006 if (Args.hasArg(options::OPT_rewrite_objc))
2007 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2008 else
2009 CmdArgs.push_back(types::getTypeName(Input.getType()));
2010}
2011
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002012void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002013 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002014 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002015 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002016 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002017 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2018 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002019 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002020 ArgStringList CmdArgs;
2021
Daniel Dunbare521a892009-03-31 20:53:55 +00002022 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2023
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002024 // Invoke ourselves in -cc1 mode.
2025 //
2026 // FIXME: Implement custom jobs for internal actions.
2027 CmdArgs.push_back("-cc1");
2028
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002029 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002030 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002031 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002032 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002033
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002034 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002035 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002036
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002037 if (isa<AnalyzeJobAction>(JA)) {
2038 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2039 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002040 } else if (isa<MigrateJobAction>(JA)) {
2041 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002042 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002043 if (Output.getType() == types::TY_Dependencies)
2044 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002045 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002046 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002047 if (Args.hasArg(options::OPT_rewrite_objc) &&
2048 !Args.hasArg(options::OPT_g_Group))
2049 CmdArgs.push_back("-P");
2050 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002051 } else if (isa<AssembleJobAction>(JA)) {
2052 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002053
David Blaikie9260ed62013-07-25 21:19:01 +00002054 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002055
2056 // Also ignore explicit -force_cpusubtype_ALL option.
2057 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002058 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002059 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002060 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002061
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002062 if (JA.getType() == types::TY_Nothing)
2063 CmdArgs.push_back("-fsyntax-only");
2064 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002065 CmdArgs.push_back("-emit-pch");
2066 else
2067 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002068 } else if (isa<VerifyPCHJobAction>(JA)) {
2069 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002070 } else {
2071 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002072
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002073 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002074 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002075 } else if (JA.getType() == types::TY_LLVM_IR ||
2076 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002077 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002078 } else if (JA.getType() == types::TY_LLVM_BC ||
2079 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002080 CmdArgs.push_back("-emit-llvm-bc");
2081 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002082 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002083 } else if (JA.getType() == types::TY_AST) {
2084 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002085 } else if (JA.getType() == types::TY_ModuleFile) {
2086 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002087 } else if (JA.getType() == types::TY_RewrittenObjC) {
2088 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002089 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002090 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2091 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002092 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002093 } else {
2094 assert(JA.getType() == types::TY_PP_Asm &&
2095 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002096 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002097 }
2098
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002099 // The make clang go fast button.
2100 CmdArgs.push_back("-disable-free");
2101
John McCallbb79b5f2010-02-13 03:50:24 +00002102 // Disable the verification pass in -asserts builds.
2103#ifdef NDEBUG
2104 CmdArgs.push_back("-disable-llvm-verifier");
2105#endif
2106
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002107 // Set the main file name, so that debug info works even with
2108 // -save-temps.
2109 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002110 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002111
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002112 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002113 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002114 if (Args.hasArg(options::OPT_static))
2115 CmdArgs.push_back("-static-define");
2116
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002117 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002118 // Enable region store model by default.
2119 CmdArgs.push_back("-analyzer-store=region");
2120
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002121 // Treat blocks as analysis entry points.
2122 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2123
Ted Kremenek49c79792011-03-24 00:28:47 +00002124 CmdArgs.push_back("-analyzer-eagerly-assume");
2125
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002126 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002127 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002128 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002129
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002130 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2131 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002132
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002133 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002134 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002135
2136 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002137
Jordan Rose10ad0812013-04-05 17:55:07 +00002138 if (types::isCXX(Inputs[0].getType()))
2139 CmdArgs.push_back("-analyzer-checker=cplusplus");
2140
Ted Kremenek37e96522012-01-26 02:27:38 +00002141 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002142 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2143 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2144 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2145 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2146 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2147 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002148 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002149
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002150 // Set the output format. The default is plist, for (lame) historical
2151 // reasons.
2152 CmdArgs.push_back("-analyzer-output");
2153 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002154 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002155 else
2156 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002157
Ted Kremenekfe449a22010-03-22 22:32:05 +00002158 // Disable the presentation of standard compiler warnings when
2159 // using --analyze. We only want to show static analyzer diagnostics
2160 // or frontend errors.
2161 CmdArgs.push_back("-w");
2162
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002163 // Add -Xanalyzer arguments when running as analyzer.
2164 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002165 }
2166
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002167 CheckCodeGenerationOptions(D, Args);
2168
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002169 bool PIE = getToolChain().isPIEDefault();
2170 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002171 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002172
Alexey Bataev40e75222014-01-28 06:30:35 +00002173 // Android-specific defaults for PIC/PIE
2174 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2175 switch (getToolChain().getTriple().getArch()) {
2176 case llvm::Triple::arm:
2177 case llvm::Triple::thumb:
2178 case llvm::Triple::mips:
2179 case llvm::Triple::mipsel:
2180 case llvm::Triple::mips64:
2181 case llvm::Triple::mips64el:
2182 PIC = true; // "-fpic"
2183 break;
2184
2185 case llvm::Triple::x86:
2186 case llvm::Triple::x86_64:
2187 PIC = true; // "-fPIC"
2188 IsPICLevelTwo = true;
2189 break;
2190
2191 default:
2192 break;
2193 }
2194 }
2195
Alexey Samsonov090301e2013-04-09 12:28:19 +00002196 // For the PIC and PIE flag options, this logic is different from the
2197 // legacy logic in very old versions of GCC, as that logic was just
2198 // a bug no one had ever fixed. This logic is both more rational and
2199 // consistent with GCC's new logic now that the bugs are fixed. The last
2200 // argument relating to either PIC or PIE wins, and no other argument is
2201 // used. If the last argument is any flavor of the '-fno-...' arguments,
2202 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2203 // at the same level.
2204 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2205 options::OPT_fpic, options::OPT_fno_pic,
2206 options::OPT_fPIE, options::OPT_fno_PIE,
2207 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002208 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2209 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002210 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002211 if (LastPICArg) {
2212 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002213 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2214 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2215 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2216 PIC = PIE || O.matches(options::OPT_fPIC) ||
2217 O.matches(options::OPT_fpic);
2218 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2219 O.matches(options::OPT_fPIC);
2220 } else {
2221 PIE = PIC = false;
2222 }
2223 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002224 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002225
Nick Lewycky609dd662013-10-11 03:33:53 +00002226 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002227 // specified while enabling PIC enabled level 1 PIC, just force it back to
2228 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2229 // informal testing).
2230 if (PIC && getToolChain().getTriple().isOSDarwin())
2231 IsPICLevelTwo |= getToolChain().isPICDefault();
2232
Chandler Carruthc0c04552012-04-08 16:40:35 +00002233 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2234 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002235 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002236 if (KernelOrKext &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002237 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002238 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002239 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002240 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002241
Chandler Carruth76a943b2012-11-19 03:52:03 +00002242 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2243 // This is a very special mode. It trumps the other modes, almost no one
2244 // uses it, and it isn't even valid on any OS but Darwin.
2245 if (!getToolChain().getTriple().isOSDarwin())
2246 D.Diag(diag::err_drv_unsupported_opt_for_target)
2247 << A->getSpelling() << getToolChain().getTriple().str();
2248
2249 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2250
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002251 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002252 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002253
Chandler Carruth76a943b2012-11-19 03:52:03 +00002254 // Only a forced PIC mode can cause the actual compile to have PIC defines
2255 // etc., no flags are sufficient. This behavior was selected to closely
2256 // match that of llvm-gcc and Apple GCC before that.
2257 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2258 CmdArgs.push_back("-pic-level");
2259 CmdArgs.push_back("2");
2260 }
2261 } else {
2262 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2263 // handled in Clang's IRGen by the -pie-level flag.
2264 CmdArgs.push_back("-mrelocation-model");
2265 CmdArgs.push_back(PIC ? "pic" : "static");
2266
2267 if (PIC) {
2268 CmdArgs.push_back("-pic-level");
2269 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2270 if (PIE) {
2271 CmdArgs.push_back("-pie-level");
2272 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2273 }
2274 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002275 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002276
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002277 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2278 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002279 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002280
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002281 // LLVM Code Generator Options.
2282
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002283 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2284 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002285 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002286 }
2287
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002288 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2289 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002290 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002291 D.Diag(diag::err_drv_unsupported_opt_for_target)
2292 << A->getSpelling() << getToolChain().getTriple().str();
2293 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2294 CmdArgs.push_back("-fpcc-struct-return");
2295 } else {
2296 assert(A->getOption().matches(options::OPT_freg_struct_return));
2297 CmdArgs.push_back("-freg-struct-return");
2298 }
2299 }
2300
Roman Divacky65b88cd2011-03-01 17:40:53 +00002301 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2302 CmdArgs.push_back("-mrtd");
2303
Rafael Espindola224dd632011-12-14 21:02:23 +00002304 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002305 CmdArgs.push_back("-mdisable-fp-elim");
2306 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2307 options::OPT_fno_zero_initialized_in_bss))
2308 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002309
2310 bool OFastEnabled = isOptimizationLevelFast(Args);
2311 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2312 // enabled. This alias option is being used to simplify the hasFlag logic.
2313 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2314 options::OPT_fstrict_aliasing;
2315 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002316 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002317 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002318 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2319 options::OPT_fno_struct_path_tbaa))
2320 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002321 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2322 false))
2323 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002324 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2325 options::OPT_fno_optimize_sibling_calls))
2326 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002327
Eric Christopher006208c2013-04-04 06:29:47 +00002328 // Handle segmented stacks.
2329 if (Args.hasArg(options::OPT_fsplit_stack))
2330 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002331
2332 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2333 // This alias option is being used to simplify the getLastArg logic.
2334 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2335 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002336
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002337 // Handle various floating point optimization flags, mapping them to the
2338 // appropriate LLVM code generation flags. The pattern for all of these is to
2339 // default off the codegen optimizations, and if any flag enables them and no
2340 // flag disables them after the flag enabling them, enable the codegen
2341 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002342 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002343 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002344 options::OPT_ffinite_math_only,
2345 options::OPT_fno_finite_math_only,
2346 options::OPT_fhonor_infinities,
2347 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002348 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2349 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002350 A->getOption().getID() != options::OPT_fhonor_infinities)
2351 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002352 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002353 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002354 options::OPT_ffinite_math_only,
2355 options::OPT_fno_finite_math_only,
2356 options::OPT_fhonor_nans,
2357 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002358 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2359 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002360 A->getOption().getID() != options::OPT_fhonor_nans)
2361 CmdArgs.push_back("-menable-no-nans");
2362
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002363 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2364 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002365 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002366 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002367 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002368 options::OPT_fno_math_errno)) {
2369 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2370 // However, turning *off* -ffast_math merely restores the toolchain default
2371 // (which may be false).
2372 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2373 A->getOption().getID() == options::OPT_ffast_math ||
2374 A->getOption().getID() == options::OPT_Ofast)
2375 MathErrno = false;
2376 else if (A->getOption().getID() == options::OPT_fmath_errno)
2377 MathErrno = true;
2378 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002379 if (MathErrno)
2380 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002381
2382 // There are several flags which require disabling very specific
2383 // optimizations. Any of these being disabled forces us to turn off the
2384 // entire set of LLVM optimizations, so collect them through all the flag
2385 // madness.
2386 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002387 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002388 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002389 options::OPT_funsafe_math_optimizations,
2390 options::OPT_fno_unsafe_math_optimizations,
2391 options::OPT_fassociative_math,
2392 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002393 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2394 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002395 A->getOption().getID() != options::OPT_fno_associative_math)
2396 AssociativeMath = true;
2397 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002398 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002399 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002400 options::OPT_funsafe_math_optimizations,
2401 options::OPT_fno_unsafe_math_optimizations,
2402 options::OPT_freciprocal_math,
2403 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002404 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2405 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002406 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2407 ReciprocalMath = true;
2408 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002409 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002410 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002411 options::OPT_funsafe_math_optimizations,
2412 options::OPT_fno_unsafe_math_optimizations,
2413 options::OPT_fsigned_zeros,
2414 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002415 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2416 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002417 A->getOption().getID() != options::OPT_fsigned_zeros)
2418 SignedZeros = false;
2419 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002420 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002421 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002422 options::OPT_funsafe_math_optimizations,
2423 options::OPT_fno_unsafe_math_optimizations,
2424 options::OPT_ftrapping_math,
2425 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002426 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2427 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002428 A->getOption().getID() != options::OPT_ftrapping_math)
2429 TrappingMath = false;
2430 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2431 !TrappingMath)
2432 CmdArgs.push_back("-menable-unsafe-fp-math");
2433
Lang Hamesaa53b932012-07-06 00:59:19 +00002434
2435 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002436 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002437 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002438 options::OPT_ffp_contract)) {
2439 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002440 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002441 if (Val == "fast" || Val == "on" || Val == "off") {
2442 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2443 } else {
2444 D.Diag(diag::err_drv_unsupported_option_argument)
2445 << A->getOption().getName() << Val;
2446 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002447 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2448 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002449 // If fast-math is set then set the fp-contract mode to fast.
2450 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2451 }
2452 }
2453
Bob Wilson6a039162012-07-19 03:52:53 +00002454 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2455 // and if we find them, tell the frontend to provide the appropriate
2456 // preprocessor macros. This is distinct from enabling any optimizations as
2457 // these options induce language changes which must survive serialization
2458 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002459 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2460 options::OPT_fno_fast_math))
2461 if (!A->getOption().matches(options::OPT_fno_fast_math))
2462 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002463 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2464 if (A->getOption().matches(options::OPT_ffinite_math_only))
2465 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002466
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002467 // Decide whether to use verbose asm. Verbose assembly is the default on
2468 // toolchains which have the integrated assembler on by default.
2469 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2470 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002471 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002472 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002473 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002474
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002475 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2476 CmdArgs.push_back("-mdebug-pass");
2477 CmdArgs.push_back("Structure");
2478 }
2479 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2480 CmdArgs.push_back("-mdebug-pass");
2481 CmdArgs.push_back("Arguments");
2482 }
2483
John McCall8517abc2010-02-19 02:45:38 +00002484 // Enable -mconstructor-aliases except on darwin, where we have to
2485 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002486 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002487 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002488
John McCall7ef5cb32011-03-18 02:56:14 +00002489 // Darwin's kernel doesn't support guard variables; just die if we
2490 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002491 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002492 CmdArgs.push_back("-fforbid-guard-variables");
2493
Douglas Gregordbe39272011-02-01 15:15:22 +00002494 if (Args.hasArg(options::OPT_mms_bitfields)) {
2495 CmdArgs.push_back("-mms-bitfields");
2496 }
John McCall8517abc2010-02-19 02:45:38 +00002497
Daniel Dunbar306945d2009-09-16 06:17:29 +00002498 // This is a coarse approximation of what llvm-gcc actually does, both
2499 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2500 // complicated ways.
2501 bool AsynchronousUnwindTables =
2502 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2503 options::OPT_fno_asynchronous_unwind_tables,
2504 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002505 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002506 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2507 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002508 CmdArgs.push_back("-munwind-tables");
2509
Chandler Carruth05fb5852012-11-21 23:40:23 +00002510 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002511
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002512 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2513 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002514 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002515 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002516
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002517 // FIXME: Handle -mtune=.
2518 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002519
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002520 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002521 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002522 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002523 }
2524
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002525 // Add the target cpu
2526 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2527 llvm::Triple ETriple(ETripleStr);
2528 std::string CPU = getCPUName(Args, ETriple);
2529 if (!CPU.empty()) {
2530 CmdArgs.push_back("-target-cpu");
2531 CmdArgs.push_back(Args.MakeArgString(CPU));
2532 }
2533
Rafael Espindolaeb265472013-08-21 21:59:03 +00002534 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2535 CmdArgs.push_back("-mfpmath");
2536 CmdArgs.push_back(A->getValue());
2537 }
2538
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002539 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002540 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002541
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002542 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002543 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002544 default:
2545 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002546
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002547 case llvm::Triple::arm:
2548 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002549 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002550 break;
2551
Eric Christopher0b26a612010-03-02 02:41:08 +00002552 case llvm::Triple::mips:
2553 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002554 case llvm::Triple::mips64:
2555 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002556 AddMIPSTargetArgs(Args, CmdArgs);
2557 break;
2558
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002559 case llvm::Triple::sparc:
2560 AddSparcTargetArgs(Args, CmdArgs);
2561 break;
2562
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002563 case llvm::Triple::x86:
2564 case llvm::Triple::x86_64:
2565 AddX86TargetArgs(Args, CmdArgs);
2566 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002567
2568 case llvm::Triple::hexagon:
2569 AddHexagonTargetArgs(Args, CmdArgs);
2570 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002571 }
2572
Hans Wennborg75958c42013-08-08 00:17:41 +00002573 // Add clang-cl arguments.
2574 if (getToolChain().getDriver().IsCLMode())
2575 AddClangCLArgs(Args, CmdArgs);
2576
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002577 // Pass the linker version in use.
2578 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2579 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002580 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002581 }
2582
Eric Christopherb7d97e92013-04-03 01:58:53 +00002583 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002584 CmdArgs.push_back("-momit-leaf-frame-pointer");
2585
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002586 // Explicitly error on some things we know we don't support and can't just
2587 // ignore.
2588 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002589 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2590 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002591 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002592 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002593 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002594 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2595 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002596 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002597 << Unsupported->getOption().getName();
2598 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002599 }
2600
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002601 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002602 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002603 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002604 CmdArgs.push_back("-header-include-file");
2605 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2606 D.CCPrintHeadersFilename : "-");
2607 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002608 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002609 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002610
Chad Rosierbe10f982011-08-02 17:58:04 +00002611 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002612 CmdArgs.push_back("-diagnostic-log-file");
2613 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2614 D.CCLogDiagnosticsFilename : "-");
2615 }
2616
Manman Ren17bdb0f2013-11-20 20:22:14 +00002617 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2618 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002619 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002620 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002621 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2622 // FIXME: we should support specifying dwarf version with
2623 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002624 CmdArgs.push_back("-gline-tables-only");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002625 // Default is dwarf-2 for darwin.
Tim Northover157d9112014-01-16 08:48:16 +00002626 if (getToolChain().getTriple().isOSBinFormatMachO())
Manman Ren17bdb0f2013-11-20 20:22:14 +00002627 CmdArgs.push_back("-gdwarf-2");
2628 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002629 CmdArgs.push_back("-gdwarf-2");
2630 else if (A->getOption().matches(options::OPT_gdwarf_3))
2631 CmdArgs.push_back("-gdwarf-3");
2632 else if (A->getOption().matches(options::OPT_gdwarf_4))
2633 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002634 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002635 !A->getOption().matches(options::OPT_ggdb0)) {
2636 // Default is dwarf-2 for darwin.
Tim Northover157d9112014-01-16 08:48:16 +00002637 if (getToolChain().getTriple().isOSBinFormatMachO())
Manman Ren38db0922013-07-02 23:15:25 +00002638 CmdArgs.push_back("-gdwarf-2");
2639 else
2640 CmdArgs.push_back("-g");
2641 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002642 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002643
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002644 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2645 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002646 if (Args.hasArg(options::OPT_gcolumn_info))
2647 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002648
Eric Christopher138c32b2013-09-13 22:37:55 +00002649 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002650 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2651 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002652 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002653 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002654 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002655 CmdArgs.push_back("-g");
2656 CmdArgs.push_back("-backend-option");
2657 CmdArgs.push_back("-split-dwarf=Enable");
2658 }
2659
Eric Christopher138c32b2013-09-13 22:37:55 +00002660 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2661 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2662 CmdArgs.push_back("-backend-option");
2663 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2664 }
Eric Christophereec89c22013-06-18 00:03:50 +00002665
David Blaikief36d9ba2014-01-27 18:52:43 +00002666 if (Args.hasFlag(options::OPT_fdebug_types_section,
2667 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00002668 CmdArgs.push_back("-backend-option");
2669 CmdArgs.push_back("-generate-type-units");
2670 }
Eric Christophereec89c22013-06-18 00:03:50 +00002671
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00002672 if (Args.hasFlag(options::OPT_ffunction_sections,
2673 options::OPT_fno_function_sections, false)) {
2674 CmdArgs.push_back("-ffunction-sections");
2675 }
2676
2677 if (Args.hasFlag(options::OPT_fdata_sections,
2678 options::OPT_fno_data_sections, false)) {
2679 CmdArgs.push_back("-fdata-sections");
2680 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002681
Chris Lattner3c77a352010-06-22 00:03:40 +00002682 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2683
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002684 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2685 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2686 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2687 D.Diag(diag::err_drv_argument_not_allowed_with)
2688 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2689
2690 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2691
2692 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2693 A->render(Args, CmdArgs);
2694 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2695 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2696
Nick Lewycky207bce32011-04-21 23:44:07 +00002697 if (Args.hasArg(options::OPT_ftest_coverage) ||
2698 Args.hasArg(options::OPT_coverage))
2699 CmdArgs.push_back("-femit-coverage-notes");
2700 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2701 Args.hasArg(options::OPT_coverage))
2702 CmdArgs.push_back("-femit-coverage-data");
2703
Nick Lewycky480cb992011-05-04 20:46:58 +00002704 if (C.getArgs().hasArg(options::OPT_c) ||
2705 C.getArgs().hasArg(options::OPT_S)) {
2706 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002707 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002708 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002709 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002710 SmallString<128> Pwd;
2711 if (!llvm::sys::fs::current_path(Pwd)) {
2712 llvm::sys::path::append(Pwd, CoverageFilename.str());
2713 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002714 }
2715 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002716 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002717 }
2718 }
2719
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002720 // Pass options for controlling the default header search paths.
2721 if (Args.hasArg(options::OPT_nostdinc)) {
2722 CmdArgs.push_back("-nostdsysteminc");
2723 CmdArgs.push_back("-nobuiltininc");
2724 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002725 if (Args.hasArg(options::OPT_nostdlibinc))
2726 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002727 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2728 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2729 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002730
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002731 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002732 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002733 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002734
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002735 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2736
Ted Kremenekf7639e12012-03-06 20:06:33 +00002737 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002738 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002739 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002740 options::OPT_ccc_arcmt_modify,
2741 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002742 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002743 switch (A->getOption().getID()) {
2744 default:
2745 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002746 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002747 CmdArgs.push_back("-arcmt-check");
2748 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002749 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002750 CmdArgs.push_back("-arcmt-modify");
2751 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002752 case options::OPT_ccc_arcmt_migrate:
2753 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002754 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002755 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002756
2757 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2758 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002759 break;
John McCalld70fb982011-06-15 23:25:17 +00002760 }
2761 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002762 } else {
2763 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2764 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2765 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002766 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002767
Ted Kremenekf7639e12012-03-06 20:06:33 +00002768 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2769 if (ARCMTEnabled) {
2770 D.Diag(diag::err_drv_argument_not_allowed_with)
2771 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2772 }
2773 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002774 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002775
2776 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002777 options::OPT_objcmt_migrate_subscripting,
2778 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002779 // None specified, means enable them all.
2780 CmdArgs.push_back("-objcmt-migrate-literals");
2781 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002782 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002783 } else {
2784 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2785 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002786 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002787 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002788 } else {
2789 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2790 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2791 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2792 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2793 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2794 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2795 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2796 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2797 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2798 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2799 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2800 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2801 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002802 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002803 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002804 }
2805
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002806 // Add preprocessing options like -I, -D, etc. if we are using the
2807 // preprocessor.
2808 //
2809 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002810 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002811 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002812
Rafael Espindolaa7431922011-07-21 23:40:37 +00002813 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2814 // that "The compiler can only warn and ignore the option if not recognized".
2815 // When building with ccache, it will pass -D options to clang even on
2816 // preprocessed inputs and configure concludes that -fPIC is not supported.
2817 Args.ClaimAllArgs(options::OPT_D);
2818
Alp Toker7874bdc2013-11-15 20:40:58 +00002819 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002820 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2821 if (A->getOption().matches(options::OPT_O4)) {
2822 CmdArgs.push_back("-O3");
2823 D.Diag(diag::warn_O4_is_O3);
2824 } else {
2825 A->render(Args, CmdArgs);
2826 }
2827 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002828
Chad Rosier86b82082012-12-12 20:06:31 +00002829 // Don't warn about unused -flto. This can happen when we're preprocessing or
2830 // precompiling.
2831 Args.ClaimAllArgs(options::OPT_flto);
2832
Daniel Dunbar945577c2009-10-29 02:24:45 +00002833 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002834 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2835 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002836 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002837 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002838
2839 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00002840 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002841 //
2842 // If a std is supplied, only add -trigraphs if it follows the
2843 // option.
2844 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2845 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002846 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002847 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002848 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002849 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002850 else
2851 Std->render(Args, CmdArgs);
2852
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002853 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2854 options::OPT_trigraphs))
2855 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002856 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002857 } else {
2858 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002859 //
2860 // FIXME: Clang doesn't correctly handle -std= when the input language
2861 // doesn't match. For the time being just ignore this for C++ inputs;
2862 // eventually we want to do all the standard defaulting here instead of
2863 // splitting it between the driver and clang -cc1.
2864 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002865 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2866 "-std=", /*Joined=*/true);
2867 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2868 CmdArgs.push_back("-std=c++11");
2869
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002870 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002871 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002872
Richard Smith282b4492013-09-04 22:50:31 +00002873 // GCC's behavior for -Wwrite-strings is a bit strange:
2874 // * In C, this "warning flag" changes the types of string literals from
2875 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2876 // for the discarded qualifier.
2877 // * In C++, this is just a normal warning flag.
2878 //
2879 // Implementing this warning correctly in C is hard, so we follow GCC's
2880 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2881 // a non-const char* in C, rather than using this crude hack.
2882 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00002883 // FIXME: This should behave just like a warning flag, and thus should also
2884 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
2885 Arg *WriteStrings =
2886 Args.getLastArg(options::OPT_Wwrite_strings,
2887 options::OPT_Wno_write_strings, options::OPT_w);
2888 if (WriteStrings &&
2889 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00002890 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00002891 }
2892
Chandler Carruth61fbf622011-04-23 09:27:53 +00002893 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002894 // during C++ compilation, which it is by default. GCC keeps this define even
2895 // in the presence of '-w', match this behavior bug-for-bug.
2896 if (types::isCXX(InputType) &&
2897 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2898 true)) {
2899 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002900 }
2901
Chandler Carruthe0391482010-05-22 02:21:53 +00002902 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2903 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2904 if (Asm->getOption().matches(options::OPT_fasm))
2905 CmdArgs.push_back("-fgnu-keywords");
2906 else
2907 CmdArgs.push_back("-fno-gnu-keywords");
2908 }
2909
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002910 if (ShouldDisableCFI(Args, getToolChain()))
2911 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002912
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002913 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2914 CmdArgs.push_back("-fno-dwarf-directory-asm");
2915
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002916 if (ShouldDisableAutolink(Args, getToolChain()))
2917 CmdArgs.push_back("-fno-autolink");
2918
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002919 // Add in -fdebug-compilation-dir if necessary.
2920 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002921
Richard Smith9a568822011-11-21 19:36:32 +00002922 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2923 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002924 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002925 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002926 }
2927
Richard Smith79c927b2013-11-06 19:31:51 +00002928 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2929 CmdArgs.push_back("-foperator-arrow-depth");
2930 CmdArgs.push_back(A->getValue());
2931 }
2932
Richard Smith9a568822011-11-21 19:36:32 +00002933 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2934 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002935 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002936 }
2937
Richard Smitha3d3bd22013-05-08 02:12:03 +00002938 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2939 CmdArgs.push_back("-fconstexpr-steps");
2940 CmdArgs.push_back(A->getValue());
2941 }
2942
Richard Smithb3a14522013-02-22 01:59:51 +00002943 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2944 CmdArgs.push_back("-fbracket-depth");
2945 CmdArgs.push_back(A->getValue());
2946 }
2947
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002948 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2949 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002950 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002951 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002952 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2953 } else
2954 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002955 }
2956
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002957
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002958 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002959 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002960
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002961 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2962 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002963 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002964 }
David Chisnall5778fce2009-08-31 16:41:57 +00002965
Chris Lattnere23003d2010-01-09 21:54:33 +00002966 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2967 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002968 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002969 }
2970
Chris Lattnerb35583d2010-04-07 20:49:23 +00002971 CmdArgs.push_back("-ferror-limit");
2972 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002973 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002974 else
2975 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002976
Chandler Carrutha77a7272010-05-06 04:55:18 +00002977 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2978 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002979 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002980 }
2981
2982 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2983 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002984 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002985 }
2986
Richard Smithf6f003a2011-12-16 19:06:07 +00002987 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2988 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002989 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002990 }
2991
Daniel Dunbar2c978472009-11-04 06:24:47 +00002992 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002993 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002994 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002995 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002996 } else {
2997 // If -fmessage-length=N was not specified, determine whether this is a
2998 // terminal and, if so, implicitly define -fmessage-length appropriately.
2999 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003000 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003001 }
3002
John McCallb4a99d32013-02-19 01:57:35 +00003003 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3004 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3005 options::OPT_fvisibility_ms_compat)) {
3006 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3007 CmdArgs.push_back("-fvisibility");
3008 CmdArgs.push_back(A->getValue());
3009 } else {
3010 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3011 CmdArgs.push_back("-fvisibility");
3012 CmdArgs.push_back("hidden");
3013 CmdArgs.push_back("-ftype-visibility");
3014 CmdArgs.push_back("default");
3015 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003016 }
3017
Douglas Gregor08329632010-06-15 17:05:35 +00003018 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003019
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003020 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3021
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003022 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003023 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3024 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003025 CmdArgs.push_back("-ffreestanding");
3026
Daniel Dunbare357d562009-12-03 18:42:11 +00003027 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003028 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003029 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003030 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3031 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003032 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003033 // AltiVec language extensions aren't relevant for assembling.
3034 if (!isa<PreprocessJobAction>(JA) ||
3035 Output.getType() != types::TY_PP_Asm)
3036 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003037 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3038 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003039
Peter Collingbourne32701642013-11-01 18:16:25 +00003040 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3041 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003042
Will Dietz3676d562012-12-30 20:53:28 +00003043 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3044 options::OPT_fno_sanitize_recover,
3045 true))
3046 CmdArgs.push_back("-fno-sanitize-recover");
3047
Chad Rosierae229d52013-01-29 23:31:22 +00003048 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
3049 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3050 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3051 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3052
Eric Christopher459d2712013-02-19 06:16:53 +00003053 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003054 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003055 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003056 getToolChain().getArch() == llvm::Triple::ppc64 ||
3057 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003058 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003059 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003060
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003061 if (getToolChain().SupportsProfiling())
3062 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003063
3064 // -flax-vector-conversions is default.
3065 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3066 options::OPT_fno_lax_vector_conversions))
3067 CmdArgs.push_back("-fno-lax-vector-conversions");
3068
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003069 if (Args.getLastArg(options::OPT_fapple_kext))
3070 CmdArgs.push_back("-fapple-kext");
3071
David Blaikie690f21e2012-06-14 18:55:27 +00003072 if (Args.hasFlag(options::OPT_frewrite_includes,
3073 options::OPT_fno_rewrite_includes, false))
3074 CmdArgs.push_back("-frewrite-includes");
3075
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003076 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003077 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003078 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003079 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3080 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003081
3082 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3083 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003084 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003085 }
3086
Bob Wilson14adb362012-02-03 06:27:22 +00003087 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003088
Chandler Carruth6e501032011-03-27 00:04:55 +00003089 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3090 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3091 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3092 options::OPT_fno_wrapv)) {
3093 if (A->getOption().matches(options::OPT_fwrapv))
3094 CmdArgs.push_back("-fwrapv");
3095 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3096 options::OPT_fno_strict_overflow)) {
3097 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3098 CmdArgs.push_back("-fwrapv");
3099 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003100
3101 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3102 options::OPT_fno_reroll_loops))
3103 if (A->getOption().matches(options::OPT_freroll_loops))
3104 CmdArgs.push_back("-freroll-loops");
3105
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003106 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003107 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3108 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003109
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003110 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3111
Mahesha S6a682be42012-10-27 07:47:56 +00003112
Daniel Dunbar4930e332009-11-17 08:07:36 +00003113 // -stack-protector=0 is default.
3114 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003115 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3116 options::OPT_fstack_protector_all,
3117 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003118 if (A->getOption().matches(options::OPT_fstack_protector))
3119 StackProtectorLevel = 1;
3120 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3121 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00003122 } else {
3123 StackProtectorLevel =
3124 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3125 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003126 if (StackProtectorLevel) {
3127 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003128 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003129 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003130
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003131 // --param ssp-buffer-size=
3132 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3133 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003134 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003135 if (Str.startswith("ssp-buffer-size=")) {
3136 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003137 CmdArgs.push_back("-stack-protector-buffer-size");
3138 // FIXME: Verify the argument is a valid integer.
3139 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003140 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003141 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003142 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003143 }
3144
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003145 // Translate -mstackrealign
3146 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3147 false)) {
3148 CmdArgs.push_back("-backend-option");
3149 CmdArgs.push_back("-force-align-stack");
3150 }
3151 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3152 false)) {
3153 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3154 }
3155
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003156 if (Args.hasArg(options::OPT_mstack_alignment)) {
3157 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3158 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003159 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003160 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003161 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003162 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3163 options::OPT_munaligned_access)) {
3164 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3165 CmdArgs.push_back("-backend-option");
3166 CmdArgs.push_back("-arm-strict-align");
3167 } else {
3168 CmdArgs.push_back("-backend-option");
3169 CmdArgs.push_back("-arm-no-strict-align");
3170 }
Renato Golina146a482013-08-24 14:44:41 +00003171 }
Chad Rosier60027022012-11-09 17:29:19 +00003172 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003173
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003174 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3175 options::OPT_mno_restrict_it)) {
3176 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3177 CmdArgs.push_back("-backend-option");
3178 CmdArgs.push_back("-arm-restrict-it");
3179 } else {
3180 CmdArgs.push_back("-backend-option");
3181 CmdArgs.push_back("-arm-no-restrict-it");
3182 }
3183 }
3184
Daniel Dunbard18049a2009-04-07 21:16:11 +00003185 // Forward -f options with positive and negative forms; we translate
3186 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003187 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3188 StringRef fname = A->getValue();
3189 if (!llvm::sys::fs::exists(fname))
3190 D.Diag(diag::err_drv_no_such_file) << fname;
3191 else
3192 A->render(Args, CmdArgs);
3193 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003194
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003195 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003196 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003197 CmdArgs.push_back("-fapple-kext");
3198 if (!Args.hasArg(options::OPT_fbuiltin))
3199 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003200 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003201 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003202 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003203 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003204 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003205
Nuno Lopes13c88c72009-12-16 16:59:22 +00003206 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3207 options::OPT_fno_assume_sane_operator_new))
3208 CmdArgs.push_back("-fno-assume-sane-operator-new");
3209
Daniel Dunbar4930e332009-11-17 08:07:36 +00003210 // -fblocks=0 is default.
3211 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003212 getToolChain().IsBlocksDefault()) ||
3213 (Args.hasArg(options::OPT_fgnu_runtime) &&
3214 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3215 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003216 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003217
3218 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3219 !getToolChain().hasBlocksRuntime())
3220 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003221 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003222
Douglas Gregor226173a2012-01-18 15:19:58 +00003223 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3224 // users must also pass -fcxx-modules. The latter flag will disappear once the
3225 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003226 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003227 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3228 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3229 options::OPT_fno_cxx_modules,
3230 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003231 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003232 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003233 HaveModules = true;
3234 }
3235 }
3236
Daniel Jasper07e6c402013-08-05 20:26:17 +00003237 // -fmodule-maps enables module map processing (off by default) for header
3238 // checking. It is implied by -fmodules.
3239 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3240 false)) {
3241 CmdArgs.push_back("-fmodule-maps");
3242 }
3243
Daniel Jasperac42b752013-10-21 06:34:34 +00003244 // -fmodules-decluse checks that modules used are declared so (off by
3245 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003246 if (Args.hasFlag(options::OPT_fmodules_decluse,
3247 options::OPT_fno_modules_decluse,
3248 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003249 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003250 }
3251
Daniel Jasperac42b752013-10-21 06:34:34 +00003252 // -fmodule-name specifies the module that is currently being built (or
3253 // used for header checking by -fmodule-maps).
3254 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3255 A->claim();
3256 A->render(Args, CmdArgs);
3257 }
3258
3259 // -fmodule-map-file can be used to specify a file containing module
3260 // definitions.
3261 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3262 A->claim();
3263 A->render(Args, CmdArgs);
3264 }
3265
Douglas Gregor35b04d62013-02-07 19:01:24 +00003266 // If a module path was provided, pass it along. Otherwise, use a temporary
3267 // directory.
3268 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3269 A->claim();
3270 if (HaveModules) {
3271 A->render(Args, CmdArgs);
3272 }
3273 } else if (HaveModules) {
3274 SmallString<128> DefaultModuleCache;
3275 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3276 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003277 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3278 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003279 const char Arg[] = "-fmodules-cache-path=";
3280 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3281 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003282 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3283 }
3284
3285 // Pass through all -fmodules-ignore-macro arguments.
3286 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003287 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3288 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003289
John McCalldfea9982010-04-09 19:12:06 +00003290 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003291 if (Args.hasFlag(options::OPT_fno_access_control,
3292 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003293 false))
John McCall3155f572010-04-09 19:03:51 +00003294 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003295
Anders Carlssond470fef2010-11-21 00:09:52 +00003296 // -felide-constructors is the default.
3297 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3298 options::OPT_felide_constructors,
3299 false))
3300 CmdArgs.push_back("-fno-elide-constructors");
3301
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003302 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003303 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003304 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003305 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003306
Richard Smith52be6192012-11-05 22:04:41 +00003307 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003308 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003309 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003310 Args.getLastArg(options::OPT_mkernel,
3311 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003312 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003313 D.Diag(diag::err_drv_argument_not_allowed_with)
3314 << "-fsanitize=vptr" << NoRttiArg;
3315 }
3316 }
3317
Tony Linthicum76329bf2011-12-12 21:14:55 +00003318 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003319 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003320 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003321 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003322 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003323 CmdArgs.push_back("-fshort-enums");
3324
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003325 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003326 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003327 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003328 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003329
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003330 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003331 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003332 options::OPT_fno_threadsafe_statics))
3333 CmdArgs.push_back("-fno-threadsafe-statics");
3334
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003335 // -fuse-cxa-atexit is default.
Rafael Espindolaa6775b62013-11-04 17:13:51 +00003336 if (!Args.hasFlag(
3337 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3338 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3339 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Robert Lytton6b1deb42013-11-12 10:09:22 +00003340 getToolChain().getArch() != llvm::Triple::hexagon &&
3341 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003342 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003343 CmdArgs.push_back("-fno-use-cxa-atexit");
3344
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003345 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003346 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003347 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3348 CmdArgs.push_back("-fms-extensions");
3349
Francois Pichet1b4f1632011-09-17 04:32:15 +00003350 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003351 if (Args.hasFlag(options::OPT_fms_compatibility,
3352 options::OPT_fno_ms_compatibility,
3353 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3354 Args.hasFlag(options::OPT_fms_extensions,
3355 options::OPT_fno_ms_extensions,
3356 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003357 CmdArgs.push_back("-fms-compatibility");
3358
Reid Klecknerc106fda2013-09-18 00:33:59 +00003359 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003360 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3361 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3362 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003363 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003364 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003365 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003366 else
3367 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3368 }
3369
3370
Eric Christopher5ecce122013-02-18 00:38:31 +00003371 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003372 if (Args.hasFlag(options::OPT_fborland_extensions,
3373 options::OPT_fno_borland_extensions, false))
3374 CmdArgs.push_back("-fborland-extensions");
3375
Francois Pichet02744872011-09-01 16:38:08 +00003376 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3377 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003378 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3379 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003380 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003381 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003382
Chandler Carruthe03aa552010-04-17 20:17:31 +00003383 // -fgnu-keywords default varies depending on language; only pass if
3384 // specified.
3385 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003386 options::OPT_fno_gnu_keywords))
3387 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003388
Rafael Espindola922a6242011-06-02 17:30:53 +00003389 if (Args.hasFlag(options::OPT_fgnu89_inline,
3390 options::OPT_fno_gnu89_inline,
3391 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003392 CmdArgs.push_back("-fgnu89-inline");
3393
Chad Rosier9c76d242012-03-15 22:31:42 +00003394 if (Args.hasArg(options::OPT_fno_inline))
3395 CmdArgs.push_back("-fno-inline");
3396
Chad Rosier64d6be92012-03-06 21:17:19 +00003397 if (Args.hasArg(options::OPT_fno_inline_functions))
3398 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003399
John McCall5fb5df92012-06-20 06:18:46 +00003400 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003401
John McCall5fb5df92012-06-20 06:18:46 +00003402 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003403 // legacy is the default. Except for deployment taget of 10.5,
3404 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3405 // gets ignored silently.
3406 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003407 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3408 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003409 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003410 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003411 if (getToolChain().UseObjCMixedDispatch())
3412 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3413 else
3414 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3415 }
3416 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003417
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003418 // When ObjectiveC legacy runtime is in effect on MacOSX,
3419 // turn on the option to do Array/Dictionary subscripting
3420 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003421 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3422 getToolChain().getTriple().isMacOSX() &&
3423 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3424 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003425 objcRuntime.isNeXTFamily())
3426 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3427
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003428 // -fencode-extended-block-signature=1 is default.
3429 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3430 CmdArgs.push_back("-fencode-extended-block-signature");
3431 }
3432
John McCall24fc0de2011-07-06 00:26:06 +00003433 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3434 // NOTE: This logic is duplicated in ToolChains.cpp.
3435 bool ARC = isObjCAutoRefCount(Args);
3436 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003437 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003438
John McCall24fc0de2011-07-06 00:26:06 +00003439 CmdArgs.push_back("-fobjc-arc");
3440
Chandler Carruth491db322011-11-04 07:34:47 +00003441 // FIXME: It seems like this entire block, and several around it should be
3442 // wrapped in isObjC, but for now we just use it here as this is where it
3443 // was being used previously.
3444 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3445 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3446 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3447 else
3448 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3449 }
3450
John McCall24fc0de2011-07-06 00:26:06 +00003451 // Allow the user to enable full exceptions code emission.
3452 // We define off for Objective-CC, on for Objective-C++.
3453 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3454 options::OPT_fno_objc_arc_exceptions,
3455 /*default*/ types::isCXX(InputType)))
3456 CmdArgs.push_back("-fobjc-arc-exceptions");
3457 }
3458
3459 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3460 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003461 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003462 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003463
John McCall24fc0de2011-07-06 00:26:06 +00003464 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3465 // takes precedence.
3466 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3467 if (!GCArg)
3468 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3469 if (GCArg) {
3470 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003471 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003472 << GCArg->getAsString(Args);
3473 } else if (getToolChain().SupportsObjCGC()) {
3474 GCArg->render(Args, CmdArgs);
3475 } else {
3476 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003477 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003478 << GCArg->getAsString(Args);
3479 }
3480 }
3481
John McCallb5f652e2011-06-22 00:53:57 +00003482 // Add exception args.
3483 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003484 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003485
3486 if (getToolChain().UseSjLjExceptions())
3487 CmdArgs.push_back("-fsjlj-exceptions");
3488
3489 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003490 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3491 options::OPT_fno_assume_sane_operator_new))
3492 CmdArgs.push_back("-fno-assume-sane-operator-new");
3493
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003494 // -fconstant-cfstrings is default, and may be subject to argument translation
3495 // on Darwin.
3496 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3497 options::OPT_fno_constant_cfstrings) ||
3498 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3499 options::OPT_mno_constant_cfstrings))
3500 CmdArgs.push_back("-fno-constant-cfstrings");
3501
John Thompsoned4e2952009-11-05 20:14:16 +00003502 // -fshort-wchar default varies depending on platform; only
3503 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003504 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3505 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003506
Hans Wennborg28c96312013-07-31 23:39:13 +00003507 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003508 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003509 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003510 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003511 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003512
Daniel Dunbar096ed292011-10-05 21:04:55 +00003513 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3514 // -fno-pack-struct doesn't apply to -fpack-struct=.
3515 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003516 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003517 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003518 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003519 } else if (Args.hasFlag(options::OPT_fpack_struct,
3520 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003521 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003522 }
3523
Robert Lytton0e076492013-08-13 09:43:10 +00003524 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003525 if (!Args.hasArg(options::OPT_fcommon))
3526 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003527 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003528 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003529
Daniel Dunbard18049a2009-04-07 21:16:11 +00003530 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003531 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003532 CmdArgs.push_back("-fno-common");
3533
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003534 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003535 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003536 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003537 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003538 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003539 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3540
Daniel Dunbar6358d682010-10-15 22:30:42 +00003541 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3542 if (!Args.hasFlag(options::OPT_ffor_scope,
3543 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003544 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003545 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3546
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003547 // -fcaret-diagnostics is default.
3548 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3549 options::OPT_fno_caret_diagnostics, true))
3550 CmdArgs.push_back("-fno-caret-diagnostics");
3551
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003552 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003553 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003554 options::OPT_fno_diagnostics_fixit_info))
3555 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003556
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003557 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003558 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003559 options::OPT_fno_diagnostics_show_option))
3560 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003561
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003562 if (const Arg *A =
3563 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3564 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003565 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003566 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003567
Douglas Gregor643c9222011-05-21 17:07:29 +00003568 if (const Arg *A =
3569 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3570 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003571 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003572 }
3573
Chandler Carruthb6766f02011-03-27 01:50:55 +00003574 if (Arg *A = Args.getLastArg(
3575 options::OPT_fdiagnostics_show_note_include_stack,
3576 options::OPT_fno_diagnostics_show_note_include_stack)) {
3577 if (A->getOption().matches(
3578 options::OPT_fdiagnostics_show_note_include_stack))
3579 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3580 else
3581 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3582 }
3583
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003584 // Color diagnostics are the default, unless the terminal doesn't support
3585 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003586 // Support both clang's -f[no-]color-diagnostics and gcc's
3587 // -f[no-]diagnostics-colors[=never|always|auto].
3588 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3589 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3590 it != ie; ++it) {
3591 const Option &O = (*it)->getOption();
3592 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3593 !O.matches(options::OPT_fdiagnostics_color) &&
3594 !O.matches(options::OPT_fno_color_diagnostics) &&
3595 !O.matches(options::OPT_fno_diagnostics_color) &&
3596 !O.matches(options::OPT_fdiagnostics_color_EQ))
3597 continue;
3598
3599 (*it)->claim();
3600 if (O.matches(options::OPT_fcolor_diagnostics) ||
3601 O.matches(options::OPT_fdiagnostics_color)) {
3602 ShowColors = Colors_On;
3603 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3604 O.matches(options::OPT_fno_diagnostics_color)) {
3605 ShowColors = Colors_Off;
3606 } else {
3607 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3608 StringRef value((*it)->getValue());
3609 if (value == "always")
3610 ShowColors = Colors_On;
3611 else if (value == "never")
3612 ShowColors = Colors_Off;
3613 else if (value == "auto")
3614 ShowColors = Colors_Auto;
3615 else
3616 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3617 << ("-fdiagnostics-color=" + value).str();
3618 }
3619 }
3620 if (ShowColors == Colors_On ||
3621 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003622 CmdArgs.push_back("-fcolor-diagnostics");
3623
Nico Rieck7857d462013-09-11 00:38:02 +00003624 if (Args.hasArg(options::OPT_fansi_escape_codes))
3625 CmdArgs.push_back("-fansi-escape-codes");
3626
Daniel Dunbardb097022009-06-08 21:13:54 +00003627 if (!Args.hasFlag(options::OPT_fshow_source_location,
3628 options::OPT_fno_show_source_location))
3629 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003630
Douglas Gregor643c9222011-05-21 17:07:29 +00003631 if (!Args.hasFlag(options::OPT_fshow_column,
3632 options::OPT_fno_show_column,
3633 true))
3634 CmdArgs.push_back("-fno-show-column");
3635
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003636 if (!Args.hasFlag(options::OPT_fspell_checking,
3637 options::OPT_fno_spell_checking))
3638 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003639
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003640
Chad Rosierc8e56e82012-12-05 21:08:21 +00003641 // -fno-asm-blocks is default.
3642 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3643 false))
3644 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003645
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003646 // Enable vectorization per default according to the optimization level
3647 // selected. For optimization levels that want vectorization we use the alias
3648 // option to simplify the hasFlag logic.
3649 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3650 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003651 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003652 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003653 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003654 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003655
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003656 // -fslp-vectorize is default.
3657 if (Args.hasFlag(options::OPT_fslp_vectorize,
3658 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003659 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003660
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003661 // -fno-slp-vectorize-aggressive is default.
3662 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003663 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003664 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003665
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003666 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3667 A->render(Args, CmdArgs);
3668
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003669 // -fdollars-in-identifiers default varies depending on platform and
3670 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003671 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003672 options::OPT_fno_dollars_in_identifiers)) {
3673 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003674 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003675 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003676 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003677 }
3678
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003679 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3680 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003681 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003682 options::OPT_fno_unit_at_a_time)) {
3683 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003684 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003685 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003686
Eli Friedman055c9702011-11-02 01:53:16 +00003687 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3688 options::OPT_fno_apple_pragma_pack, false))
3689 CmdArgs.push_back("-fapple-pragma-pack");
3690
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003691 // le32-specific flags:
3692 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3693 // by default.
3694 if (getToolChain().getArch() == llvm::Triple::le32) {
3695 CmdArgs.push_back("-fno-math-builtin");
3696 }
3697
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003698 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003699 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003700 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003701#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003702 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003703 (getToolChain().getArch() == llvm::Triple::arm ||
3704 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003705 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3706 CmdArgs.push_back("-fno-builtin-strcat");
3707 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3708 CmdArgs.push_back("-fno-builtin-strcpy");
3709 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003710#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003711
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003712 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003713 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003714 options::OPT_traditional_cpp)) {
3715 if (isa<PreprocessJobAction>(JA))
3716 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003717 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003718 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003719 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003720
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003721 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003722 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003723
3724 // Handle serialized diagnostics.
3725 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3726 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003727 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003728 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003729
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003730 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3731 CmdArgs.push_back("-fretain-comments-from-system-headers");
3732
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003733 // Forward -fcomment-block-commands to -cc1.
3734 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003735 // Forward -fparse-all-comments to -cc1.
3736 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003737
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003738 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3739 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003740 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003741 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3742 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003743 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003744
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003745 // We translate this by hand to the -cc1 argument, since nightly test uses
3746 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003747 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003748 CmdArgs.push_back("-disable-llvm-optzns");
3749 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003750 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003751 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003752
Daniel Dunbard67a3222009-03-30 06:36:42 +00003753 if (Output.getType() == types::TY_Dependencies) {
3754 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003755 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003756 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003757 CmdArgs.push_back(Output.getFilename());
3758 } else {
3759 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003760 }
3761
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003762 for (InputInfoList::const_iterator
3763 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3764 const InputInfo &II = *it;
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003765
3766 addDashXForInput(Args, II, CmdArgs);
3767
Daniel Dunbarb440f562010-08-02 02:38:21 +00003768 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003769 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003770 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003771 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003772 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003773
Chris Lattnere9d7d782009-11-03 19:50:27 +00003774 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3775
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003776 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003777
3778 // Optionally embed the -cc1 level arguments into the debug info, for build
3779 // analysis.
3780 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003781 ArgStringList OriginalArgs;
3782 for (ArgList::const_iterator it = Args.begin(),
3783 ie = Args.end(); it != ie; ++it)
3784 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003785
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003786 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003787 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003788 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003789 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003790 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003791 }
3792 CmdArgs.push_back("-dwarf-debug-flags");
3793 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3794 }
3795
Eric Christopherd3804002013-02-22 20:12:52 +00003796 // Add the split debug info name to the command lines here so we
3797 // can propagate it to the backend.
3798 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003799 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003800 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003801 const char *SplitDwarfOut;
3802 if (SplitDwarf) {
3803 CmdArgs.push_back("-split-dwarf-file");
3804 SplitDwarfOut = SplitDebugName(Args, Inputs);
3805 CmdArgs.push_back(SplitDwarfOut);
3806 }
3807
3808 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00003809 if (Args.hasArg(options::OPT__SLASH_fallback) &&
3810 Output.getType() == types::TY_Object) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00003811 tools::visualstudio::Compile CL(getToolChain());
3812 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3813 LinkingOutput);
3814 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3815 } else {
3816 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3817 }
3818
Daniel Dunbar17731772009-03-23 19:03:36 +00003819
Eric Christopherf1545832013-02-22 23:50:16 +00003820 // Handle the debug info splitting at object creation time if we're
3821 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003822 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003823 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003824 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003825
Roman Divacky178e01602011-02-10 16:52:03 +00003826 if (Arg *A = Args.getLastArg(options::OPT_pg))
3827 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003828 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003829 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003830
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003831 // Claim some arguments which clang supports automatically.
3832
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003833 // -fpch-preprocess is used with gcc to add a special marker in the output to
3834 // include the PCH file. Clang's PTH solution is completely transparent, so we
3835 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003836 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003837
Daniel Dunbar17731772009-03-23 19:03:36 +00003838 // Claim some arguments which clang doesn't support, but we don't
3839 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003840 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3841 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003842
Rafael Espindolab0092d72013-09-04 19:37:35 +00003843 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00003844 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003845}
3846
John McCall5fb5df92012-06-20 06:18:46 +00003847/// Add options related to the Objective-C runtime/ABI.
3848///
3849/// Returns true if the runtime is non-fragile.
3850ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3851 ArgStringList &cmdArgs,
3852 RewriteKind rewriteKind) const {
3853 // Look for the controlling runtime option.
3854 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3855 options::OPT_fgnu_runtime,
3856 options::OPT_fobjc_runtime_EQ);
3857
3858 // Just forward -fobjc-runtime= to the frontend. This supercedes
3859 // options about fragility.
3860 if (runtimeArg &&
3861 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3862 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003863 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003864 if (runtime.tryParse(value)) {
3865 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3866 << value;
3867 }
3868
3869 runtimeArg->render(args, cmdArgs);
3870 return runtime;
3871 }
3872
3873 // Otherwise, we'll need the ABI "version". Version numbers are
3874 // slightly confusing for historical reasons:
3875 // 1 - Traditional "fragile" ABI
3876 // 2 - Non-fragile ABI, version 1
3877 // 3 - Non-fragile ABI, version 2
3878 unsigned objcABIVersion = 1;
3879 // If -fobjc-abi-version= is present, use that to set the version.
3880 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003881 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003882 if (value == "1")
3883 objcABIVersion = 1;
3884 else if (value == "2")
3885 objcABIVersion = 2;
3886 else if (value == "3")
3887 objcABIVersion = 3;
3888 else
3889 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3890 << value;
3891 } else {
3892 // Otherwise, determine if we are using the non-fragile ABI.
3893 bool nonFragileABIIsDefault =
3894 (rewriteKind == RK_NonFragile ||
3895 (rewriteKind == RK_None &&
3896 getToolChain().IsObjCNonFragileABIDefault()));
3897 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3898 options::OPT_fno_objc_nonfragile_abi,
3899 nonFragileABIIsDefault)) {
3900 // Determine the non-fragile ABI version to use.
3901#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3902 unsigned nonFragileABIVersion = 1;
3903#else
3904 unsigned nonFragileABIVersion = 2;
3905#endif
3906
3907 if (Arg *abiArg = args.getLastArg(
3908 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003909 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003910 if (value == "1")
3911 nonFragileABIVersion = 1;
3912 else if (value == "2")
3913 nonFragileABIVersion = 2;
3914 else
3915 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3916 << value;
3917 }
3918
3919 objcABIVersion = 1 + nonFragileABIVersion;
3920 } else {
3921 objcABIVersion = 1;
3922 }
3923 }
3924
3925 // We don't actually care about the ABI version other than whether
3926 // it's non-fragile.
3927 bool isNonFragile = objcABIVersion != 1;
3928
3929 // If we have no runtime argument, ask the toolchain for its default runtime.
3930 // However, the rewriter only really supports the Mac runtime, so assume that.
3931 ObjCRuntime runtime;
3932 if (!runtimeArg) {
3933 switch (rewriteKind) {
3934 case RK_None:
3935 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3936 break;
3937 case RK_Fragile:
3938 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3939 break;
3940 case RK_NonFragile:
3941 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3942 break;
3943 }
3944
3945 // -fnext-runtime
3946 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3947 // On Darwin, make this use the default behavior for the toolchain.
Tim Northover157d9112014-01-16 08:48:16 +00003948 if (getToolChain().getTriple().isOSBinFormatMachO()) {
John McCall5fb5df92012-06-20 06:18:46 +00003949 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3950
3951 // Otherwise, build for a generic macosx port.
3952 } else {
3953 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3954 }
3955
3956 // -fgnu-runtime
3957 } else {
3958 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003959 // Legacy behaviour is to target the gnustep runtime if we are i
3960 // non-fragile mode or the GCC runtime in fragile mode.
3961 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003962 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003963 else
3964 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003965 }
3966
3967 cmdArgs.push_back(args.MakeArgString(
3968 "-fobjc-runtime=" + runtime.getAsString()));
3969 return runtime;
3970}
3971
Hans Wennborg75958c42013-08-08 00:17:41 +00003972void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3973 unsigned RTOptionID = options::OPT__SLASH_MT;
3974
Hans Wennborgf1a74252013-09-10 20:18:04 +00003975 if (Args.hasArg(options::OPT__SLASH_LDd))
3976 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3977 // but defining _DEBUG is sticky.
3978 RTOptionID = options::OPT__SLASH_MTd;
3979
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00003980 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00003981 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00003982
Hans Wennborg75958c42013-08-08 00:17:41 +00003983 switch(RTOptionID) {
3984 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003985 if (Args.hasArg(options::OPT__SLASH_LDd))
3986 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00003987 CmdArgs.push_back("-D_MT");
3988 CmdArgs.push_back("-D_DLL");
3989 CmdArgs.push_back("--dependent-lib=msvcrt");
3990 break;
3991 case options::OPT__SLASH_MDd:
3992 CmdArgs.push_back("-D_DEBUG");
3993 CmdArgs.push_back("-D_MT");
3994 CmdArgs.push_back("-D_DLL");
3995 CmdArgs.push_back("--dependent-lib=msvcrtd");
3996 break;
3997 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00003998 if (Args.hasArg(options::OPT__SLASH_LDd))
3999 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004000 CmdArgs.push_back("-D_MT");
4001 CmdArgs.push_back("--dependent-lib=libcmt");
4002 break;
4003 case options::OPT__SLASH_MTd:
4004 CmdArgs.push_back("-D_DEBUG");
4005 CmdArgs.push_back("-D_MT");
4006 CmdArgs.push_back("--dependent-lib=libcmtd");
4007 break;
4008 default:
4009 llvm_unreachable("Unexpected option ID.");
4010 }
4011
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004012 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4013 // users want. The /Za flag to cl.exe turns this off, but it's not
4014 // implemented in clang.
4015 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004016
Hans Wennborg0fd62072013-08-09 00:32:23 +00004017 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4018 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004019
4020 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4021 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004022 if (Args.hasArg(options::OPT__SLASH_fallback))
4023 CmdArgs.push_back("msvc-fallback");
4024 else
4025 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004026 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004027}
4028
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004029void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004030 const InputInfo &Output,
4031 const InputInfoList &Inputs,
4032 const ArgList &Args,
4033 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004034 ArgStringList CmdArgs;
4035
4036 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4037 const InputInfo &Input = Inputs[0];
4038
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004039 // Don't warn about "clang -w -c foo.s"
4040 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004041 // and "clang -emit-llvm -c foo.s"
4042 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004043
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004044 // Invoke ourselves in -cc1as mode.
4045 //
4046 // FIXME: Implement custom jobs for internal actions.
4047 CmdArgs.push_back("-cc1as");
4048
4049 // Add the "effective" target triple.
4050 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004051 std::string TripleStr =
4052 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004053 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4054
4055 // Set the output mode, we currently only expect to be used as a real
4056 // assembler.
4057 CmdArgs.push_back("-filetype");
4058 CmdArgs.push_back("obj");
4059
Eric Christopher45f2e712012-12-18 00:31:10 +00004060 // Set the main file name, so that debug info works even with
4061 // -save-temps or preprocessed assembly.
4062 CmdArgs.push_back("-main-file-name");
4063 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4064
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004065 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004066 const llvm::Triple &Triple = getToolChain().getTriple();
4067 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004068 if (!CPU.empty()) {
4069 CmdArgs.push_back("-target-cpu");
4070 CmdArgs.push_back(Args.MakeArgString(CPU));
4071 }
4072
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004073 // Add the target features
4074 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004075 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004076
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004077 // Ignore explicit -force_cpusubtype_ALL option.
4078 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004079
Eric Christopherfc3ee562012-01-10 00:38:01 +00004080 // Determine the original source input.
4081 const Action *SourceAction = &JA;
4082 while (SourceAction->getKind() != Action::InputClass) {
4083 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4084 SourceAction = SourceAction->getInputs()[0];
4085 }
4086
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004087 // Forward -g and handle debug info related flags, assuming we are dealing
4088 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004089 if (SourceAction->getType() == types::TY_Asm ||
4090 SourceAction->getType() == types::TY_PP_Asm) {
4091 Args.ClaimAllArgs(options::OPT_g_Group);
4092 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4093 if (!A->getOption().matches(options::OPT_g0))
4094 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004095
4096 // Add the -fdebug-compilation-dir flag if needed.
4097 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004098
4099 // Set the AT_producer to the clang version when using the integrated
4100 // assembler on assembly source files.
4101 CmdArgs.push_back("-dwarf-debug-producer");
4102 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004103 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004104
4105 // Optionally embed the -cc1as level arguments into the debug info, for build
4106 // analysis.
4107 if (getToolChain().UseDwarfDebugFlags()) {
4108 ArgStringList OriginalArgs;
4109 for (ArgList::const_iterator it = Args.begin(),
4110 ie = Args.end(); it != ie; ++it)
4111 (*it)->render(Args, OriginalArgs);
4112
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004113 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004114 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4115 Flags += Exec;
4116 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4117 Flags += " ";
4118 Flags += OriginalArgs[i];
4119 }
4120 CmdArgs.push_back("-dwarf-debug-flags");
4121 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4122 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004123
4124 // FIXME: Add -static support, once we have it.
4125
David Blaikie372d9502014-01-17 03:17:40 +00004126 // Consume all the warning flags. Usually this would be handled more
4127 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4128 // doesn't handle that so rather than warning about unused flags that are
4129 // actually used, we'll lie by omission instead.
4130 // FIXME: Stop lying and consume only the appropriate driver flags
4131 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4132 ie = Args.filtered_end();
4133 it != ie; ++it)
4134 (*it)->claim();
4135
David Blaikie9260ed62013-07-25 21:19:01 +00004136 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4137 getToolChain().getDriver());
4138
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004139 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004140
4141 assert(Output.isFilename() && "Unexpected lipo output.");
4142 CmdArgs.push_back("-o");
4143 CmdArgs.push_back(Output.getFilename());
4144
Daniel Dunbarb440f562010-08-02 02:38:21 +00004145 assert(Input.isFilename() && "Invalid input.");
4146 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004147
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004148 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004149 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004150
4151 // Handle the debug info splitting at object creation time if we're
4152 // creating an object.
4153 // TODO: Currently only works on linux with newer objcopy.
4154 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004155 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004156 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4157 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004158}
4159
Daniel Dunbara3246a02009-03-18 08:07:30 +00004160void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004161 const InputInfo &Output,
4162 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004163 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004164 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004165 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004166 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004167
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004168 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004169 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004170 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004171 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004172 // Don't forward any -g arguments to assembly steps.
4173 if (isa<AssembleJobAction>(JA) &&
4174 A->getOption().matches(options::OPT_g_Group))
4175 continue;
4176
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004177 // Don't forward any -W arguments to assembly and link steps.
4178 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4179 A->getOption().matches(options::OPT_W_Group))
4180 continue;
4181
Daniel Dunbar2da02722009-03-19 07:55:12 +00004182 // It is unfortunate that we have to claim here, as this means
4183 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004184 // platforms using a generic gcc, even if we are just using gcc
4185 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004186 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004187 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004188 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004189 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004190
Daniel Dunbar4e295052010-01-25 22:35:08 +00004191 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004192
4193 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004194 llvm::Triple::ArchType Arch = getToolChain().getArch();
Tim Northover157d9112014-01-16 08:48:16 +00004195 if (getToolChain().getTriple().isOSBinFormatMachO()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004196 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004197
4198 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004199 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004200 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004201 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004202 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004203 else if (Arch == llvm::Triple::ppc64le)
4204 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004205 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004206 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004207 }
4208
Daniel Dunbar5716d872009-05-02 21:41:52 +00004209 // Try to force gcc to match the tool chain we want, if we recognize
4210 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004211 //
4212 // FIXME: The triple class should directly provide the information we want
4213 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004214 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004215 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004216 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4217 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004218 CmdArgs.push_back("-m64");
4219
Daniel Dunbarb440f562010-08-02 02:38:21 +00004220 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004221 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004222 CmdArgs.push_back(Output.getFilename());
4223 } else {
4224 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004225 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004226 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004227
Tony Linthicum76329bf2011-12-12 21:14:55 +00004228 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4229 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004230
4231 // Only pass -x if gcc will understand it; otherwise hope gcc
4232 // understands the suffix correctly. The main use case this would go
4233 // wrong in is for linker inputs if they happened to have an odd
4234 // suffix; really the only way to get this to happen is a command
4235 // like '-x foobar a.c' which will treat a.c like a linker input.
4236 //
4237 // FIXME: For the linker case specifically, can we safely convert
4238 // inputs into '-Wl,' options?
4239 for (InputInfoList::const_iterator
4240 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4241 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004242
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004243 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004244 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4245 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004246 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004247 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004248 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004249 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004250 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004251 else if (II.getType() == types::TY_ModuleFile)
4252 D.Diag(diag::err_drv_no_module_support)
4253 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004254
Daniel Dunbara3246a02009-03-18 08:07:30 +00004255 if (types::canTypeBeUserSpecified(II.getType())) {
4256 CmdArgs.push_back("-x");
4257 CmdArgs.push_back(types::getTypeName(II.getType()));
4258 }
4259
Daniel Dunbarb440f562010-08-02 02:38:21 +00004260 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004261 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004262 else {
4263 const Arg &A = II.getInputArg();
4264
4265 // Reverse translate some rewritten options.
4266 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4267 CmdArgs.push_back("-lstdc++");
4268 continue;
4269 }
4270
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004271 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004272 A.render(Args, CmdArgs);
4273 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004274 }
4275
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004276 const std::string customGCCName = D.getCCCGenericGCCName();
4277 const char *GCCName;
4278 if (!customGCCName.empty())
4279 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004280 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004281 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004282 } else
4283 GCCName = "gcc";
4284
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004285 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004286 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004287 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004288}
4289
Daniel Dunbar4e295052010-01-25 22:35:08 +00004290void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4291 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004292 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004293}
4294
Daniel Dunbar4e295052010-01-25 22:35:08 +00004295void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4296 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004297 const Driver &D = getToolChain().getDriver();
4298
Daniel Dunbar4e295052010-01-25 22:35:08 +00004299 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004300 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4301 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004302 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004303 else {
4304 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004305 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004306 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004307
Daniel Dunbar4e295052010-01-25 22:35:08 +00004308 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004309 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004310}
4311
Daniel Dunbar4e295052010-01-25 22:35:08 +00004312void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4313 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004314 // The types are (hopefully) good enough.
4315}
4316
Tony Linthicum76329bf2011-12-12 21:14:55 +00004317// Hexagon tools start.
4318void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4319 ArgStringList &CmdArgs) const {
4320
4321}
4322void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4323 const InputInfo &Output,
4324 const InputInfoList &Inputs,
4325 const ArgList &Args,
4326 const char *LinkingOutput) const {
4327
4328 const Driver &D = getToolChain().getDriver();
4329 ArgStringList CmdArgs;
4330
4331 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004332 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004333 CmdArgs.push_back(Args.MakeArgString(MarchString));
4334
4335 RenderExtraToolArgs(JA, CmdArgs);
4336
4337 if (Output.isFilename()) {
4338 CmdArgs.push_back("-o");
4339 CmdArgs.push_back(Output.getFilename());
4340 } else {
4341 assert(Output.isNothing() && "Unexpected output");
4342 CmdArgs.push_back("-fsyntax-only");
4343 }
4344
Matthew Curtise8f80a12012-12-06 17:49:03 +00004345 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4346 if (!SmallDataThreshold.empty())
4347 CmdArgs.push_back(
4348 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004349
Matthew Curtise5df3812012-12-07 17:23:04 +00004350 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4351 options::OPT_Xassembler);
4352
Tony Linthicum76329bf2011-12-12 21:14:55 +00004353 // Only pass -x if gcc will understand it; otherwise hope gcc
4354 // understands the suffix correctly. The main use case this would go
4355 // wrong in is for linker inputs if they happened to have an odd
4356 // suffix; really the only way to get this to happen is a command
4357 // like '-x foobar a.c' which will treat a.c like a linker input.
4358 //
4359 // FIXME: For the linker case specifically, can we safely convert
4360 // inputs into '-Wl,' options?
4361 for (InputInfoList::const_iterator
4362 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4363 const InputInfo &II = *it;
4364
4365 // Don't try to pass LLVM or AST inputs to a generic gcc.
4366 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4367 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4368 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4369 << getToolChain().getTripleString();
4370 else if (II.getType() == types::TY_AST)
4371 D.Diag(clang::diag::err_drv_no_ast_support)
4372 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004373 else if (II.getType() == types::TY_ModuleFile)
4374 D.Diag(diag::err_drv_no_module_support)
4375 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004376
4377 if (II.isFilename())
4378 CmdArgs.push_back(II.getFilename());
4379 else
4380 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4381 II.getInputArg().render(Args, CmdArgs);
4382 }
4383
4384 const char *GCCName = "hexagon-as";
4385 const char *Exec =
4386 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4387 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4388
4389}
4390void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4391 ArgStringList &CmdArgs) const {
4392 // The types are (hopefully) good enough.
4393}
4394
4395void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4396 const InputInfo &Output,
4397 const InputInfoList &Inputs,
4398 const ArgList &Args,
4399 const char *LinkingOutput) const {
4400
Matthew Curtise689b052012-12-06 15:46:07 +00004401 const toolchains::Hexagon_TC& ToolChain =
4402 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4403 const Driver &D = ToolChain.getDriver();
4404
Tony Linthicum76329bf2011-12-12 21:14:55 +00004405 ArgStringList CmdArgs;
4406
Matthew Curtise689b052012-12-06 15:46:07 +00004407 //----------------------------------------------------------------------------
4408 //
4409 //----------------------------------------------------------------------------
4410 bool hasStaticArg = Args.hasArg(options::OPT_static);
4411 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004412 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004413 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4414 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4415 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4416 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004417
Matthew Curtise689b052012-12-06 15:46:07 +00004418 //----------------------------------------------------------------------------
4419 // Silence warnings for various options
4420 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004421
Matthew Curtise689b052012-12-06 15:46:07 +00004422 Args.ClaimAllArgs(options::OPT_g_Group);
4423 Args.ClaimAllArgs(options::OPT_emit_llvm);
4424 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4425 // handled somewhere else.
4426 Args.ClaimAllArgs(options::OPT_static_libgcc);
4427
4428 //----------------------------------------------------------------------------
4429 //
4430 //----------------------------------------------------------------------------
4431 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4432 e = ToolChain.ExtraOpts.end();
4433 i != e; ++i)
4434 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004435
Matthew Curtisf10a5952012-12-06 14:16:43 +00004436 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4437 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004438
Matthew Curtise689b052012-12-06 15:46:07 +00004439 if (buildingLib) {
4440 CmdArgs.push_back("-shared");
4441 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4442 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004443 }
4444
Matthew Curtise689b052012-12-06 15:46:07 +00004445 if (hasStaticArg)
4446 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004447
Matthew Curtise8f80a12012-12-06 17:49:03 +00004448 if (buildPIE && !buildingLib)
4449 CmdArgs.push_back("-pie");
4450
4451 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4452 if (!SmallDataThreshold.empty()) {
4453 CmdArgs.push_back(
4454 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4455 }
4456
Matthew Curtise689b052012-12-06 15:46:07 +00004457 //----------------------------------------------------------------------------
4458 //
4459 //----------------------------------------------------------------------------
4460 CmdArgs.push_back("-o");
4461 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004462
Matthew Curtise689b052012-12-06 15:46:07 +00004463 const std::string MarchSuffix = "/" + MarchString;
4464 const std::string G0Suffix = "/G0";
4465 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4466 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4467 + "/";
4468 const std::string StartFilesDir = RootDir
4469 + "hexagon/lib"
4470 + (buildingLib
4471 ? MarchG0Suffix : MarchSuffix);
4472
4473 //----------------------------------------------------------------------------
4474 // moslib
4475 //----------------------------------------------------------------------------
4476 std::vector<std::string> oslibs;
4477 bool hasStandalone= false;
4478
4479 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4480 ie = Args.filtered_end(); it != ie; ++it) {
4481 (*it)->claim();
4482 oslibs.push_back((*it)->getValue());
4483 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004484 }
Matthew Curtise689b052012-12-06 15:46:07 +00004485 if (oslibs.empty()) {
4486 oslibs.push_back("standalone");
4487 hasStandalone = true;
4488 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004489
Matthew Curtise689b052012-12-06 15:46:07 +00004490 //----------------------------------------------------------------------------
4491 // Start Files
4492 //----------------------------------------------------------------------------
4493 if (incStdLib && incStartFiles) {
4494
4495 if (!buildingLib) {
4496 if (hasStandalone) {
4497 CmdArgs.push_back(
4498 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4499 }
4500 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4501 }
4502 std::string initObj = useShared ? "/initS.o" : "/init.o";
4503 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4504 }
4505
4506 //----------------------------------------------------------------------------
4507 // Library Search Paths
4508 //----------------------------------------------------------------------------
4509 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4510 for (ToolChain::path_list::const_iterator
4511 i = LibPaths.begin(),
4512 e = LibPaths.end();
4513 i != e;
4514 ++i)
4515 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4516
4517 //----------------------------------------------------------------------------
4518 //
4519 //----------------------------------------------------------------------------
4520 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4521 Args.AddAllArgs(CmdArgs, options::OPT_e);
4522 Args.AddAllArgs(CmdArgs, options::OPT_s);
4523 Args.AddAllArgs(CmdArgs, options::OPT_t);
4524 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4525
4526 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4527
4528 //----------------------------------------------------------------------------
4529 // Libraries
4530 //----------------------------------------------------------------------------
4531 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004532 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004533 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4534 CmdArgs.push_back("-lm");
4535 }
4536
4537 CmdArgs.push_back("--start-group");
4538
4539 if (!buildingLib) {
4540 for(std::vector<std::string>::iterator i = oslibs.begin(),
4541 e = oslibs.end(); i != e; ++i)
4542 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4543 CmdArgs.push_back("-lc");
4544 }
4545 CmdArgs.push_back("-lgcc");
4546
4547 CmdArgs.push_back("--end-group");
4548 }
4549
4550 //----------------------------------------------------------------------------
4551 // End files
4552 //----------------------------------------------------------------------------
4553 if (incStdLib && incStartFiles) {
4554 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4555 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4556 }
4557
4558 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004559 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004560}
4561// Hexagon tools end.
4562
Bernard Ogden31561762013-12-12 13:27:11 +00004563/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4564//
4565// FIXME: tblgen this.
4566const char *arm::getARMCPUForMArch(const ArgList &Args,
4567 const llvm::Triple &Triple) {
4568 StringRef MArch;
4569 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4570 // Otherwise, if we have -march= choose the base CPU for that arch.
4571 MArch = A->getValue();
4572 } else {
4573 // Otherwise, use the Arch from the triple.
4574 MArch = Triple.getArchName();
4575 }
4576
4577 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004578 if (MArch == "native") {
4579 std::string CPU = llvm::sys::getHostCPUName();
4580 if (CPU != "generic") {
4581 // Translate the native cpu into the architecture. The switch below will
4582 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004583 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004584 }
4585 }
4586
4587 if (Triple.getOS() == llvm::Triple::NetBSD) {
4588 if (MArch == "armv6")
4589 return "arm1176jzf-s";
4590 }
4591
4592 const char *result = llvm::StringSwitch<const char *>(MArch)
4593 .Cases("armv2", "armv2a","arm2")
4594 .Case("armv3", "arm6")
4595 .Case("armv3m", "arm7m")
4596 .Case("armv4", "strongarm")
4597 .Case("armv4t", "arm7tdmi")
4598 .Case("thumbv4t", "arm7tdmi")
4599 .Cases("armv5", "armv5t", "arm10tdmi")
4600 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4601 .Cases("armv5e", "armv5te", "arm1022e")
4602 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4603 .Case("armv5tej", "arm926ej-s")
4604 .Case("thumbv5tej", "arm926ej-s")
4605 .Cases("armv6", "armv6k", "arm1136jf-s")
4606 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4607 .Case("armv6j", "arm1136j-s")
4608 .Case("thumbv6j", "arm1136j-s")
4609 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4610 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4611 .Case("armv6t2", "arm1156t2-s")
4612 .Case("thumbv6t2", "arm1156t2-s")
4613 .Cases("armv6m", "armv6-m", "cortex-m0")
4614 .Case("thumbv6m", "cortex-m0")
4615 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
4616 .Cases("thumbv7", "thumbv7a", "cortex-a8")
4617 .Cases("armv7l", "armv7-l", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004618 .Cases("armv7s", "armv7-s", "swift")
4619 .Cases("armv7r", "armv7-r", "cortex-r4")
4620 .Case("thumbv7r", "cortex-r4")
4621 .Cases("armv7m", "armv7-m", "cortex-m3")
4622 .Case("thumbv7m", "cortex-m3")
4623 .Cases("armv7em", "armv7e-m", "cortex-m4")
4624 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
4625 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
4626 .Cases("thumbv8", "thumbv8a", "cortex-a53")
4627 .Case("ep9312", "ep9312")
4628 .Case("iwmmxt", "iwmmxt")
4629 .Case("xscale", "xscale")
4630 // If all else failed, return the most base CPU with thumb interworking
4631 // supported by LLVM.
4632 .Default(0);
4633
4634 if (result)
4635 return result;
4636
4637 return
4638 Triple.getEnvironment() == llvm::Triple::GNUEABIHF
4639 ? "arm1176jzf-s"
4640 : "arm7tdmi";
4641}
4642
4643/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004644StringRef arm::getARMTargetCPU(const ArgList &Args,
4645 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004646 // FIXME: Warn on inconsistent use of -mcpu and -march.
4647 // If we have -mcpu=, use that.
4648 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4649 StringRef MCPU = A->getValue();
4650 // Handle -mcpu=native.
4651 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004652 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004653 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004654 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004655 }
4656
4657 return getARMCPUForMArch(Args, Triple);
4658}
4659
4660/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4661/// CPU.
4662//
4663// FIXME: This is redundant with -mcpu, why does LLVM use this.
4664// FIXME: tblgen this, or kill it!
4665const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4666 return llvm::StringSwitch<const char *>(CPU)
4667 .Case("strongarm", "v4")
4668 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4669 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4670 .Cases("arm920", "arm920t", "arm922t", "v4t")
4671 .Cases("arm940t", "ep9312","v4t")
4672 .Cases("arm10tdmi", "arm1020t", "v5")
4673 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4674 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4675 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4676 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4677 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4678 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004679 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00004680 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4681 .Cases("cortex-r4", "cortex-r5", "v7r")
4682 .Case("cortex-m0", "v6m")
4683 .Case("cortex-m3", "v7m")
4684 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00004685 .Case("swift", "v7s")
4686 .Cases("cortex-a53", "cortex-a57", "v8")
4687 .Default("");
4688}
4689
Tim Northover157d9112014-01-16 08:48:16 +00004690llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004691 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4692 // archs which Darwin doesn't use.
4693
4694 // The matching this routine does is fairly pointless, since it is neither the
4695 // complete architecture list, nor a reasonable subset. The problem is that
4696 // historically the driver driver accepts this and also ties its -march=
4697 // handling to the architecture name, so we need to be careful before removing
4698 // support for it.
4699
4700 // This code must be kept in sync with Clang's Darwin specific argument
4701 // translation.
4702
4703 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4704 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4705 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4706 .Case("ppc64", llvm::Triple::ppc64)
4707 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4708 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4709 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004710 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004711 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004712 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00004713 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00004714 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004715 .Case("r600", llvm::Triple::r600)
4716 .Case("nvptx", llvm::Triple::nvptx)
4717 .Case("nvptx64", llvm::Triple::nvptx64)
4718 .Case("amdil", llvm::Triple::amdil)
4719 .Case("spir", llvm::Triple::spir)
4720 .Default(llvm::Triple::UnknownArch);
4721}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004722
Tim Northover157d9112014-01-16 08:48:16 +00004723void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
4724 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
4725 T.setArch(Arch);
4726
4727 if (Str == "x86_64h")
4728 T.setArchName(Str);
4729 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
4730 T.setOS(llvm::Triple::UnknownOS);
4731 T.setEnvironment(llvm::Triple::MachO);
4732 }
4733}
4734
Bob Wilsondecc03e2012-11-23 06:14:39 +00004735const char *Clang::getBaseInputName(const ArgList &Args,
4736 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004737 return Args.MakeArgString(
4738 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004739}
4740
Bob Wilsondecc03e2012-11-23 06:14:39 +00004741const char *Clang::getBaseInputStem(const ArgList &Args,
4742 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004743 const char *Str = getBaseInputName(Args, Inputs);
4744
Chris Lattner906bb902011-01-16 08:14:11 +00004745 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004746 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004747
4748 return Str;
4749}
4750
Bob Wilsondecc03e2012-11-23 06:14:39 +00004751const char *Clang::getDependencyFileName(const ArgList &Args,
4752 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004753 // FIXME: Think about this more.
4754 std::string Res;
4755
4756 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004757 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004758 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004759 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004760 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004761 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004762 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004763}
4764
Daniel Dunbarbe220842009-03-20 16:06:39 +00004765void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004766 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004767 const InputInfoList &Inputs,
4768 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004769 const char *LinkingOutput) const {
4770 ArgStringList CmdArgs;
4771
4772 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4773 const InputInfo &Input = Inputs[0];
4774
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004775 // Determine the original source input.
4776 const Action *SourceAction = &JA;
4777 while (SourceAction->getKind() != Action::InputClass) {
4778 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4779 SourceAction = SourceAction->getInputs()[0];
4780 }
4781
Kevin Enderby319baa42013-11-18 23:30:29 +00004782 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4783 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00004784 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4785 // FIXME: at run-time detect assembler capabilities or rely on version
4786 // information forwarded by -target-assembler-version (future)
4787 if (Args.hasArg(options::OPT_no_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00004788 const llvm::Triple &T(getToolChain().getTriple());
4789 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00004790 CmdArgs.push_back("-Q");
4791 }
Kevin Enderby319baa42013-11-18 23:30:29 +00004792
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004793 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004794 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004795 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004796 if (Args.hasArg(options::OPT_gstabs))
4797 CmdArgs.push_back("--gstabs");
4798 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004799 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004800 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004801
Daniel Dunbarbe220842009-03-20 16:06:39 +00004802 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00004803 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004804
Daniel Dunbar6d484762010-07-22 01:47:22 +00004805 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004806 if (getToolChain().getArch() == llvm::Triple::x86 ||
4807 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004808 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4809 CmdArgs.push_back("-force_cpusubtype_ALL");
4810
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004811 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004812 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004813 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00004814 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004815 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004816 CmdArgs.push_back("-static");
4817
Daniel Dunbarbe220842009-03-20 16:06:39 +00004818 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4819 options::OPT_Xassembler);
4820
4821 assert(Output.isFilename() && "Unexpected lipo output.");
4822 CmdArgs.push_back("-o");
4823 CmdArgs.push_back(Output.getFilename());
4824
Daniel Dunbarb440f562010-08-02 02:38:21 +00004825 assert(Input.isFilename() && "Invalid input.");
4826 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004827
4828 // asm_final spec is empty.
4829
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004830 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004831 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004832 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004833}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004834
Tim Northover157d9112014-01-16 08:48:16 +00004835void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00004836
Tim Northover157d9112014-01-16 08:48:16 +00004837void darwin::MachOTool::AddMachOArch(const ArgList &Args,
4838 ArgStringList &CmdArgs) const {
4839 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004840
Daniel Dunbarc1964212009-03-26 16:23:12 +00004841 // Derived from darwin_arch spec.
4842 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004843 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004844
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004845 // FIXME: Is this needed anymore?
4846 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004847 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004848}
4849
Bill Wendling3b2000f2012-10-02 18:02:50 +00004850bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4851 // We only need to generate a temp path for LTO if we aren't compiling object
4852 // files. When compiling source files, we run 'dsymutil' after linking. We
4853 // don't run 'dsymutil' when compiling object files.
4854 for (InputInfoList::const_iterator
4855 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4856 if (it->getType() != types::TY_Object)
4857 return true;
4858
4859 return false;
4860}
4861
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004862void darwin::Link::AddLinkArgs(Compilation &C,
4863 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004864 ArgStringList &CmdArgs,
4865 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004866 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00004867 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004868
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004869 unsigned Version[3] = { 0, 0, 0 };
4870 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4871 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004872 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004873 Version[1], Version[2], HadExtra) ||
4874 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004875 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004876 << A->getAsString(Args);
4877 }
4878
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00004879 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004880 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00004881 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
4882 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004883
Bob Wilson3d27dad2013-08-02 22:25:34 +00004884 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4885 CmdArgs.push_back("-export_dynamic");
4886
Bill Wendling313b6bf2012-11-16 23:03:00 +00004887 // If we are using LTO, then automatically create a temporary file path for
4888 // the linker to use, so that it's lifetime will extend past a possible
4889 // dsymutil step.
4890 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4891 const char *TmpPath = C.getArgs().MakeArgString(
4892 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4893 C.addTempFile(TmpPath);
4894 CmdArgs.push_back("-object_path_lto");
4895 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004896 }
4897
Daniel Dunbarc1964212009-03-26 16:23:12 +00004898 // Derived from the "link" spec.
4899 Args.AddAllArgs(CmdArgs, options::OPT_static);
4900 if (!Args.hasArg(options::OPT_static))
4901 CmdArgs.push_back("-dynamic");
4902 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4903 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4904 // here. How do we wish to handle such things?
4905 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004906
Daniel Dunbarc1964212009-03-26 16:23:12 +00004907 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00004908 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004909 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004910 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004911
4912 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4913 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4914 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4915
4916 Arg *A;
4917 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4918 (A = Args.getLastArg(options::OPT_current__version)) ||
4919 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004920 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004921 << A->getAsString(Args) << "-dynamiclib";
4922
4923 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4924 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4925 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4926 } else {
4927 CmdArgs.push_back("-dylib");
4928
4929 Arg *A;
4930 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4931 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4932 (A = Args.getLastArg(options::OPT_client__name)) ||
4933 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4934 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4935 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004936 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004937 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004938
Daniel Dunbarc1964212009-03-26 16:23:12 +00004939 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4940 "-dylib_compatibility_version");
4941 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4942 "-dylib_current_version");
4943
Tim Northover157d9112014-01-16 08:48:16 +00004944 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004945
4946 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4947 "-dylib_install_name");
4948 }
4949
4950 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4951 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4952 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00004953 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004954 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004955 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4956 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4957 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4958 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4959 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4960 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004961 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004962 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4963 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4964 Args.AddAllArgs(CmdArgs, options::OPT_init);
4965
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004966 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00004967 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004968
Daniel Dunbarc1964212009-03-26 16:23:12 +00004969 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4970 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4971 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4972 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4973 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004974
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004975 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4976 options::OPT_fno_pie,
4977 options::OPT_fno_PIE)) {
4978 if (A->getOption().matches(options::OPT_fpie) ||
4979 A->getOption().matches(options::OPT_fPIE))
4980 CmdArgs.push_back("-pie");
4981 else
4982 CmdArgs.push_back("-no_pie");
4983 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004984
4985 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4986 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4987 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4988 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4989 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4990 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4991 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4992 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4993 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4994 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4995 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4996 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4997 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4998 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4999 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5000 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005001
Daniel Dunbar84384642011-05-02 21:03:47 +00005002 // Give --sysroot= preference, over the Apple specific behavior to also use
5003 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005004 StringRef sysroot = C.getSysRoot();
5005 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005006 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005007 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005008 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5009 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005010 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005011 }
5012
Daniel Dunbarc1964212009-03-26 16:23:12 +00005013 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5014 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5015 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5016 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5017 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005018 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005019 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5020 Args.AddAllArgs(CmdArgs, options::OPT_y);
5021 Args.AddLastArg(CmdArgs, options::OPT_w);
5022 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5023 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5024 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5025 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5026 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5027 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5028 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5029 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5030 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5031 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5032 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5033 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5034}
5035
5036void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005037 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005038 const InputInfoList &Inputs,
5039 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005040 const char *LinkingOutput) const {
5041 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005042
Daniel Dunbarc1964212009-03-26 16:23:12 +00005043 // The logic here is derived from gcc's behavior; most of which
5044 // comes from specs (starting with link_command). Consult gcc for
5045 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005046 ArgStringList CmdArgs;
5047
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005048 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5049 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5050 options::OPT_ccc_arcmt_migrate)) {
5051 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
5052 (*I)->claim();
5053 const char *Exec =
5054 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5055 CmdArgs.push_back(Output.getFilename());
5056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5057 return;
5058 }
5059
Daniel Dunbarc1964212009-03-26 16:23:12 +00005060 // I'm not sure why this particular decomposition exists in gcc, but
5061 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005062 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005063
Daniel Dunbarc1964212009-03-26 16:23:12 +00005064 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5065 Args.AddAllArgs(CmdArgs, options::OPT_s);
5066 Args.AddAllArgs(CmdArgs, options::OPT_t);
5067 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5068 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005069 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005070 Args.AddAllArgs(CmdArgs, options::OPT_r);
5071
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005072 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5073 // members of static archive libraries which implement Objective-C classes or
5074 // categories.
5075 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5076 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005077
Daniel Dunbarc1964212009-03-26 16:23:12 +00005078 CmdArgs.push_back("-o");
5079 CmdArgs.push_back(Output.getFilename());
5080
Chad Rosier06fd3c62012-05-16 23:45:12 +00005081 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005082 !Args.hasArg(options::OPT_nostartfiles))
5083 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005084
5085 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005086
Daniel Dunbarc1964212009-03-26 16:23:12 +00005087 if (Args.hasArg(options::OPT_fopenmp))
5088 // This is more complicated in gcc...
5089 CmdArgs.push_back("-lgomp");
5090
Douglas Gregor9295df02012-05-15 21:00:27 +00005091 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5092
Bob Wilson16d93952012-05-15 18:57:39 +00005093 if (isObjCRuntimeLinked(Args) &&
5094 !Args.hasArg(options::OPT_nostdlib) &&
5095 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005096 // We use arclite library for both ARC and subscripting support.
5097 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5098
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005099 CmdArgs.push_back("-framework");
5100 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005101 // Link libobj.
5102 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005103 }
John McCall31168b02011-06-15 23:02:42 +00005104
Daniel Dunbarc1964212009-03-26 16:23:12 +00005105 if (LinkingOutput) {
5106 CmdArgs.push_back("-arch_multiple");
5107 CmdArgs.push_back("-final_output");
5108 CmdArgs.push_back(LinkingOutput);
5109 }
5110
Daniel Dunbarc1964212009-03-26 16:23:12 +00005111 if (Args.hasArg(options::OPT_fnested_functions))
5112 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005113
Daniel Dunbarc1964212009-03-26 16:23:12 +00005114 if (!Args.hasArg(options::OPT_nostdlib) &&
5115 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005116 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005117 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005118
Daniel Dunbarc1964212009-03-26 16:23:12 +00005119 // link_ssp spec is empty.
5120
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005121 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005122 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005123 }
5124
Chad Rosier06fd3c62012-05-16 23:45:12 +00005125 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005126 !Args.hasArg(options::OPT_nostartfiles)) {
5127 // endfile_spec is empty.
5128 }
5129
5130 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5131 Args.AddAllArgs(CmdArgs, options::OPT_F);
5132
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005133 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005134 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005135 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005136}
5137
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005138void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005139 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005140 const InputInfoList &Inputs,
5141 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005142 const char *LinkingOutput) const {
5143 ArgStringList CmdArgs;
5144
5145 CmdArgs.push_back("-create");
5146 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005147
5148 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005149 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005150
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005151 for (InputInfoList::const_iterator
5152 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5153 const InputInfo &II = *it;
5154 assert(II.isFilename() && "Unexpected lipo input.");
5155 CmdArgs.push_back(II.getFilename());
5156 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005157 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005158 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005159 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005160}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005161
Daniel Dunbar88299622010-06-04 18:28:36 +00005162void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005163 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005164 const InputInfoList &Inputs,
5165 const ArgList &Args,
5166 const char *LinkingOutput) const {
5167 ArgStringList CmdArgs;
5168
Daniel Dunbareb86b042011-05-09 17:23:16 +00005169 CmdArgs.push_back("-o");
5170 CmdArgs.push_back(Output.getFilename());
5171
Daniel Dunbar88299622010-06-04 18:28:36 +00005172 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5173 const InputInfo &Input = Inputs[0];
5174 assert(Input.isFilename() && "Unexpected dsymutil input.");
5175 CmdArgs.push_back(Input.getFilename());
5176
Daniel Dunbar88299622010-06-04 18:28:36 +00005177 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005178 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005179 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005180}
5181
Eric Christopher551ef452011-08-23 17:56:55 +00005182void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005183 const InputInfo &Output,
5184 const InputInfoList &Inputs,
5185 const ArgList &Args,
5186 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005187 ArgStringList CmdArgs;
5188 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005189 CmdArgs.push_back("--debug-info");
5190 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005191 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005192
5193 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5194 const InputInfo &Input = Inputs[0];
5195 assert(Input.isFilename() && "Unexpected verify input");
5196
5197 // Grabbing the output of the earlier dsymutil run.
5198 CmdArgs.push_back(Input.getFilename());
5199
5200 const char *Exec =
5201 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5202 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5203}
5204
David Chisnallf571cde2012-02-15 13:39:01 +00005205void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5206 const InputInfo &Output,
5207 const InputInfoList &Inputs,
5208 const ArgList &Args,
5209 const char *LinkingOutput) const {
5210 ArgStringList CmdArgs;
5211
5212 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5213 options::OPT_Xassembler);
5214
5215 CmdArgs.push_back("-o");
5216 CmdArgs.push_back(Output.getFilename());
5217
5218 for (InputInfoList::const_iterator
5219 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5220 const InputInfo &II = *it;
5221 CmdArgs.push_back(II.getFilename());
5222 }
5223
5224 const char *Exec =
5225 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5226 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5227}
5228
5229
5230void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5231 const InputInfo &Output,
5232 const InputInfoList &Inputs,
5233 const ArgList &Args,
5234 const char *LinkingOutput) const {
5235 // FIXME: Find a real GCC, don't hard-code versions here
5236 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5237 const llvm::Triple &T = getToolChain().getTriple();
5238 std::string LibPath = "/usr/lib/";
5239 llvm::Triple::ArchType Arch = T.getArch();
5240 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005241 case llvm::Triple::x86:
5242 GCCLibPath +=
5243 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5244 break;
5245 case llvm::Triple::x86_64:
5246 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5247 GCCLibPath += "/4.5.2/amd64/";
5248 LibPath += "amd64/";
5249 break;
5250 default:
5251 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005252 }
5253
5254 ArgStringList CmdArgs;
5255
David Chisnall272a0712012-02-29 15:06:12 +00005256 // Demangle C++ names in errors
5257 CmdArgs.push_back("-C");
5258
David Chisnallf571cde2012-02-15 13:39:01 +00005259 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5260 (!Args.hasArg(options::OPT_shared))) {
5261 CmdArgs.push_back("-e");
5262 CmdArgs.push_back("_start");
5263 }
5264
5265 if (Args.hasArg(options::OPT_static)) {
5266 CmdArgs.push_back("-Bstatic");
5267 CmdArgs.push_back("-dn");
5268 } else {
5269 CmdArgs.push_back("-Bdynamic");
5270 if (Args.hasArg(options::OPT_shared)) {
5271 CmdArgs.push_back("-shared");
5272 } else {
5273 CmdArgs.push_back("--dynamic-linker");
5274 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5275 }
5276 }
5277
5278 if (Output.isFilename()) {
5279 CmdArgs.push_back("-o");
5280 CmdArgs.push_back(Output.getFilename());
5281 } else {
5282 assert(Output.isNothing() && "Invalid output.");
5283 }
5284
5285 if (!Args.hasArg(options::OPT_nostdlib) &&
5286 !Args.hasArg(options::OPT_nostartfiles)) {
5287 if (!Args.hasArg(options::OPT_shared)) {
5288 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5289 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005290 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005291 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5292 } else {
5293 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005294 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5295 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005296 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005297 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005298 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005299 }
5300
5301 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5302
5303 Args.AddAllArgs(CmdArgs, options::OPT_L);
5304 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5305 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005306 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005307
5308 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5309
5310 if (!Args.hasArg(options::OPT_nostdlib) &&
5311 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005312 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005313 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005314 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005315 if (!Args.hasArg(options::OPT_shared)) {
5316 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005317 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005318 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005319 }
David Chisnallf571cde2012-02-15 13:39:01 +00005320 }
5321
5322 if (!Args.hasArg(options::OPT_nostdlib) &&
5323 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005324 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005325 }
David Chisnall96de9932012-02-16 16:00:47 +00005326 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005327
5328 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5329
5330 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005331 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005332 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5333}
5334
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005335void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005336 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005337 const InputInfoList &Inputs,
5338 const ArgList &Args,
5339 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005340 ArgStringList CmdArgs;
5341
5342 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5343 options::OPT_Xassembler);
5344
5345 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005346 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005347
5348 for (InputInfoList::const_iterator
5349 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5350 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005351 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005352 }
5353
5354 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005355 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005356 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005357}
5358
5359void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005360 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005361 const InputInfoList &Inputs,
5362 const ArgList &Args,
5363 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005364 ArgStringList CmdArgs;
5365
5366 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005367 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005368 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005369 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005370 }
5371
5372 if (Args.hasArg(options::OPT_static)) {
5373 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005374 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005375 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005376// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005377 CmdArgs.push_back("-Bdynamic");
5378 if (Args.hasArg(options::OPT_shared)) {
5379 CmdArgs.push_back("-shared");
5380 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005381 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005382 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5383 }
5384 }
5385
Daniel Dunbarb440f562010-08-02 02:38:21 +00005386 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005387 CmdArgs.push_back("-o");
5388 CmdArgs.push_back(Output.getFilename());
5389 } else {
5390 assert(Output.isNothing() && "Invalid output.");
5391 }
5392
5393 if (!Args.hasArg(options::OPT_nostdlib) &&
5394 !Args.hasArg(options::OPT_nostartfiles)) {
5395 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005396 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005397 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005398 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005399 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005400 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005401 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005402 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005403 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005404 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005405 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005406 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005407 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005408 }
5409
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005410 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5411 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005412 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005413
5414 Args.AddAllArgs(CmdArgs, options::OPT_L);
5415 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5416 Args.AddAllArgs(CmdArgs, options::OPT_e);
5417
Daniel Dunbar54423b22010-09-17 00:24:54 +00005418 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005419
5420 if (!Args.hasArg(options::OPT_nostdlib) &&
5421 !Args.hasArg(options::OPT_nodefaultlibs)) {
5422 // FIXME: For some reason GCC passes -lgcc before adding
5423 // the default system libraries. Just mimic this for now.
5424 CmdArgs.push_back("-lgcc");
5425
5426 if (Args.hasArg(options::OPT_pthread))
5427 CmdArgs.push_back("-pthread");
5428 if (!Args.hasArg(options::OPT_shared))
5429 CmdArgs.push_back("-lc");
5430 CmdArgs.push_back("-lgcc");
5431 }
5432
5433 if (!Args.hasArg(options::OPT_nostdlib) &&
5434 !Args.hasArg(options::OPT_nostartfiles)) {
5435 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005436 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005437 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005438 }
5439
Bill Wendling08760582011-06-27 19:15:03 +00005440 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005441
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005442 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005443 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005444 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005445}
5446
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005447void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005448 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005449 const InputInfoList &Inputs,
5450 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005451 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005452 ArgStringList CmdArgs;
5453
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005454 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5455 // instruct as in the base system to assemble 32-bit code.
5456 if (getToolChain().getArch() == llvm::Triple::x86)
5457 CmdArgs.push_back("--32");
5458 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5459 CmdArgs.push_back("-mppc");
5460 CmdArgs.push_back("-many");
5461 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5462 getToolChain().getArch() == llvm::Triple::mips64el) {
5463 StringRef CPUName;
5464 StringRef ABIName;
5465 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5466
5467 CmdArgs.push_back("-mabi");
5468 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5469
5470 if (getToolChain().getArch() == llvm::Triple::mips64)
5471 CmdArgs.push_back("-EB");
5472 else
5473 CmdArgs.push_back("-EL");
5474
5475 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5476 options::OPT_fpic, options::OPT_fno_pic,
5477 options::OPT_fPIE, options::OPT_fno_PIE,
5478 options::OPT_fpie, options::OPT_fno_pie);
5479 if (LastPICArg &&
5480 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5481 LastPICArg->getOption().matches(options::OPT_fpic) ||
5482 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5483 LastPICArg->getOption().matches(options::OPT_fpie))) {
5484 CmdArgs.push_back("-KPIC");
5485 }
5486 }
5487
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005488 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5489 options::OPT_Xassembler);
5490
5491 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005492 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005493
5494 for (InputInfoList::const_iterator
5495 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5496 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005497 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005498 }
5499
5500 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005501 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005502 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005503}
5504
5505void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005506 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005507 const InputInfoList &Inputs,
5508 const ArgList &Args,
5509 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005510 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005511 ArgStringList CmdArgs;
5512
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005513 // Silence warning for "clang -g foo.o -o foo"
5514 Args.ClaimAllArgs(options::OPT_g_Group);
5515 // and "clang -emit-llvm foo.o -o foo"
5516 Args.ClaimAllArgs(options::OPT_emit_llvm);
5517 // and for "clang -w foo.o -o foo". Other warning options are already
5518 // handled somewhere else.
5519 Args.ClaimAllArgs(options::OPT_w);
5520
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005521 if (getToolChain().getArch() == llvm::Triple::mips64)
5522 CmdArgs.push_back("-EB");
5523 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5524 CmdArgs.push_back("-EL");
5525
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005526 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005527 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005528 CmdArgs.push_back("-e");
5529 CmdArgs.push_back("__start");
5530 }
5531
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005532 if (Args.hasArg(options::OPT_static)) {
5533 CmdArgs.push_back("-Bstatic");
5534 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005535 if (Args.hasArg(options::OPT_rdynamic))
5536 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005537 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005538 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005539 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005540 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005541 } else {
5542 CmdArgs.push_back("-dynamic-linker");
5543 CmdArgs.push_back("/usr/libexec/ld.so");
5544 }
5545 }
5546
Rafael Espindola044f7832013-06-05 04:28:55 +00005547 if (Args.hasArg(options::OPT_nopie))
5548 CmdArgs.push_back("-nopie");
5549
Daniel Dunbarb440f562010-08-02 02:38:21 +00005550 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005551 CmdArgs.push_back("-o");
5552 CmdArgs.push_back(Output.getFilename());
5553 } else {
5554 assert(Output.isNothing() && "Invalid output.");
5555 }
5556
5557 if (!Args.hasArg(options::OPT_nostdlib) &&
5558 !Args.hasArg(options::OPT_nostartfiles)) {
5559 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005560 if (Args.hasArg(options::OPT_pg))
5561 CmdArgs.push_back(Args.MakeArgString(
5562 getToolChain().GetFilePath("gcrt0.o")));
5563 else
5564 CmdArgs.push_back(Args.MakeArgString(
5565 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005566 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005567 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005568 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005569 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005570 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005571 }
5572 }
5573
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005574 std::string Triple = getToolChain().getTripleString();
5575 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005576 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005577 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005578 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005579
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005580 Args.AddAllArgs(CmdArgs, options::OPT_L);
5581 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5582 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005583 Args.AddAllArgs(CmdArgs, options::OPT_s);
5584 Args.AddAllArgs(CmdArgs, options::OPT_t);
5585 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5586 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005587
Daniel Dunbar54423b22010-09-17 00:24:54 +00005588 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005589
5590 if (!Args.hasArg(options::OPT_nostdlib) &&
5591 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005592 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005593 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005594 if (Args.hasArg(options::OPT_pg))
5595 CmdArgs.push_back("-lm_p");
5596 else
5597 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005598 }
5599
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005600 // FIXME: For some reason GCC passes -lgcc before adding
5601 // the default system libraries. Just mimic this for now.
5602 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005603
Eric Christopher17674ec2012-09-13 06:32:34 +00005604 if (Args.hasArg(options::OPT_pthread)) {
5605 if (!Args.hasArg(options::OPT_shared) &&
5606 Args.hasArg(options::OPT_pg))
5607 CmdArgs.push_back("-lpthread_p");
5608 else
5609 CmdArgs.push_back("-lpthread");
5610 }
5611
Chandler Carruth45661652011-12-17 22:32:42 +00005612 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005613 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005614 CmdArgs.push_back("-lc_p");
5615 else
5616 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005617 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005618
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005619 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005620 }
5621
5622 if (!Args.hasArg(options::OPT_nostdlib) &&
5623 !Args.hasArg(options::OPT_nostartfiles)) {
5624 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005625 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005626 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005627 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005628 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005629 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005630 }
5631
5632 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005633 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005634 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005635}
Ed Schoutene33194b2009-04-02 19:13:12 +00005636
Eli Friedman9fa28852012-08-08 23:57:20 +00005637void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5638 const InputInfo &Output,
5639 const InputInfoList &Inputs,
5640 const ArgList &Args,
5641 const char *LinkingOutput) const {
5642 ArgStringList CmdArgs;
5643
5644 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5645 options::OPT_Xassembler);
5646
5647 CmdArgs.push_back("-o");
5648 CmdArgs.push_back(Output.getFilename());
5649
5650 for (InputInfoList::const_iterator
5651 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5652 const InputInfo &II = *it;
5653 CmdArgs.push_back(II.getFilename());
5654 }
5655
5656 const char *Exec =
5657 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5658 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5659}
5660
5661void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5662 const InputInfo &Output,
5663 const InputInfoList &Inputs,
5664 const ArgList &Args,
5665 const char *LinkingOutput) const {
5666 const Driver &D = getToolChain().getDriver();
5667 ArgStringList CmdArgs;
5668
5669 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5670 (!Args.hasArg(options::OPT_shared))) {
5671 CmdArgs.push_back("-e");
5672 CmdArgs.push_back("__start");
5673 }
5674
5675 if (Args.hasArg(options::OPT_static)) {
5676 CmdArgs.push_back("-Bstatic");
5677 } else {
5678 if (Args.hasArg(options::OPT_rdynamic))
5679 CmdArgs.push_back("-export-dynamic");
5680 CmdArgs.push_back("--eh-frame-hdr");
5681 CmdArgs.push_back("-Bdynamic");
5682 if (Args.hasArg(options::OPT_shared)) {
5683 CmdArgs.push_back("-shared");
5684 } else {
5685 CmdArgs.push_back("-dynamic-linker");
5686 CmdArgs.push_back("/usr/libexec/ld.so");
5687 }
5688 }
5689
5690 if (Output.isFilename()) {
5691 CmdArgs.push_back("-o");
5692 CmdArgs.push_back(Output.getFilename());
5693 } else {
5694 assert(Output.isNothing() && "Invalid output.");
5695 }
5696
5697 if (!Args.hasArg(options::OPT_nostdlib) &&
5698 !Args.hasArg(options::OPT_nostartfiles)) {
5699 if (!Args.hasArg(options::OPT_shared)) {
5700 if (Args.hasArg(options::OPT_pg))
5701 CmdArgs.push_back(Args.MakeArgString(
5702 getToolChain().GetFilePath("gcrt0.o")));
5703 else
5704 CmdArgs.push_back(Args.MakeArgString(
5705 getToolChain().GetFilePath("crt0.o")));
5706 CmdArgs.push_back(Args.MakeArgString(
5707 getToolChain().GetFilePath("crtbegin.o")));
5708 } else {
5709 CmdArgs.push_back(Args.MakeArgString(
5710 getToolChain().GetFilePath("crtbeginS.o")));
5711 }
5712 }
5713
5714 Args.AddAllArgs(CmdArgs, options::OPT_L);
5715 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5716 Args.AddAllArgs(CmdArgs, options::OPT_e);
5717
5718 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5719
5720 if (!Args.hasArg(options::OPT_nostdlib) &&
5721 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005722 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005723 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5724 if (Args.hasArg(options::OPT_pg))
5725 CmdArgs.push_back("-lm_p");
5726 else
5727 CmdArgs.push_back("-lm");
5728 }
5729
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005730 if (Args.hasArg(options::OPT_pthread)) {
5731 if (!Args.hasArg(options::OPT_shared) &&
5732 Args.hasArg(options::OPT_pg))
5733 CmdArgs.push_back("-lpthread_p");
5734 else
5735 CmdArgs.push_back("-lpthread");
5736 }
5737
Eli Friedman9fa28852012-08-08 23:57:20 +00005738 if (!Args.hasArg(options::OPT_shared)) {
5739 if (Args.hasArg(options::OPT_pg))
5740 CmdArgs.push_back("-lc_p");
5741 else
5742 CmdArgs.push_back("-lc");
5743 }
5744
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005745 StringRef MyArch;
5746 switch (getToolChain().getTriple().getArch()) {
5747 case llvm::Triple::arm:
5748 MyArch = "arm";
5749 break;
5750 case llvm::Triple::x86:
5751 MyArch = "i386";
5752 break;
5753 case llvm::Triple::x86_64:
5754 MyArch = "amd64";
5755 break;
5756 default:
5757 llvm_unreachable("Unsupported architecture");
5758 }
5759 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00005760 }
5761
5762 if (!Args.hasArg(options::OPT_nostdlib) &&
5763 !Args.hasArg(options::OPT_nostartfiles)) {
5764 if (!Args.hasArg(options::OPT_shared))
5765 CmdArgs.push_back(Args.MakeArgString(
5766 getToolChain().GetFilePath("crtend.o")));
5767 else
5768 CmdArgs.push_back(Args.MakeArgString(
5769 getToolChain().GetFilePath("crtendS.o")));
5770 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005771
5772 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005773 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005774 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005775}
5776
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005777void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005778 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005779 const InputInfoList &Inputs,
5780 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005781 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005782 ArgStringList CmdArgs;
5783
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005784 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5785 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005786 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005787 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005788 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005789 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005790 else if (getToolChain().getArch() == llvm::Triple::mips ||
5791 getToolChain().getArch() == llvm::Triple::mipsel ||
5792 getToolChain().getArch() == llvm::Triple::mips64 ||
5793 getToolChain().getArch() == llvm::Triple::mips64el) {
5794 StringRef CPUName;
5795 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005796 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005797
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005798 CmdArgs.push_back("-march");
5799 CmdArgs.push_back(CPUName.data());
5800
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005801 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005802 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005803
5804 if (getToolChain().getArch() == llvm::Triple::mips ||
5805 getToolChain().getArch() == llvm::Triple::mips64)
5806 CmdArgs.push_back("-EB");
5807 else
5808 CmdArgs.push_back("-EL");
5809
5810 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5811 options::OPT_fpic, options::OPT_fno_pic,
5812 options::OPT_fPIE, options::OPT_fno_PIE,
5813 options::OPT_fpie, options::OPT_fno_pie);
5814 if (LastPICArg &&
5815 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5816 LastPICArg->getOption().matches(options::OPT_fpic) ||
5817 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5818 LastPICArg->getOption().matches(options::OPT_fpie))) {
5819 CmdArgs.push_back("-KPIC");
5820 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005821 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5822 getToolChain().getArch() == llvm::Triple::thumb) {
5823 CmdArgs.push_back("-mfpu=softvfp");
5824 switch(getToolChain().getTriple().getEnvironment()) {
5825 case llvm::Triple::GNUEABI:
5826 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005827 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005828 break;
5829
5830 default:
5831 CmdArgs.push_back("-matpcs");
5832 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00005833 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00005834 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky47f4ff82014-01-02 15:13:18 +00005835 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5836 options::OPT_fpic, options::OPT_fno_pic,
5837 options::OPT_fPIE, options::OPT_fno_PIE,
5838 options::OPT_fpie, options::OPT_fno_pie);
5839 if (LastPICArg &&
5840 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5841 LastPICArg->getOption().matches(options::OPT_fpic) ||
5842 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5843 LastPICArg->getOption().matches(options::OPT_fpie))) {
5844 CmdArgs.push_back("-KPIC");
5845 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005846 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005847
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005848 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5849 options::OPT_Xassembler);
5850
5851 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005852 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005853
5854 for (InputInfoList::const_iterator
5855 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5856 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005857 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005858 }
5859
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005860 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005861 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005862 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005863}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005864
5865void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005866 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005867 const InputInfoList &Inputs,
5868 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005869 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005870 const toolchains::FreeBSD& ToolChain =
5871 static_cast<const toolchains::FreeBSD&>(getToolChain());
5872 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005873 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005874
5875 // Silence warning for "clang -g foo.o -o foo"
5876 Args.ClaimAllArgs(options::OPT_g_Group);
5877 // and "clang -emit-llvm foo.o -o foo"
5878 Args.ClaimAllArgs(options::OPT_emit_llvm);
5879 // and for "clang -w foo.o -o foo". Other warning options are already
5880 // handled somewhere else.
5881 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005882
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005883 if (!D.SysRoot.empty())
5884 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5885
Roman Divackyafe2f232012-08-28 15:09:03 +00005886 if (Args.hasArg(options::OPT_pie))
5887 CmdArgs.push_back("-pie");
5888
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005889 if (Args.hasArg(options::OPT_static)) {
5890 CmdArgs.push_back("-Bstatic");
5891 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005892 if (Args.hasArg(options::OPT_rdynamic))
5893 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005894 CmdArgs.push_back("--eh-frame-hdr");
5895 if (Args.hasArg(options::OPT_shared)) {
5896 CmdArgs.push_back("-Bshareable");
5897 } else {
5898 CmdArgs.push_back("-dynamic-linker");
5899 CmdArgs.push_back("/libexec/ld-elf.so.1");
5900 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005901 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5902 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005903 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5904 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5905 CmdArgs.push_back("--hash-style=both");
5906 }
5907 }
5908 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005909 }
5910
5911 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5912 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005913 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005914 CmdArgs.push_back("-m");
5915 CmdArgs.push_back("elf_i386_fbsd");
5916 }
5917
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005918 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005919 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005920 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005921 }
5922
Daniel Dunbarb440f562010-08-02 02:38:21 +00005923 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005924 CmdArgs.push_back("-o");
5925 CmdArgs.push_back(Output.getFilename());
5926 } else {
5927 assert(Output.isNothing() && "Invalid output.");
5928 }
5929
5930 if (!Args.hasArg(options::OPT_nostdlib) &&
5931 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005932 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005933 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005934 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005935 crt1 = "gcrt1.o";
5936 else if (Args.hasArg(options::OPT_pie))
5937 crt1 = "Scrt1.o";
5938 else
5939 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005940 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005941 if (crt1)
5942 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5943
5944 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5945
5946 const char *crtbegin = NULL;
5947 if (Args.hasArg(options::OPT_static))
5948 crtbegin = "crtbeginT.o";
5949 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5950 crtbegin = "crtbeginS.o";
5951 else
5952 crtbegin = "crtbegin.o";
5953
5954 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005955 }
5956
5957 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005958 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005959 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5960 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005961 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005962 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5963 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005964 Args.AddAllArgs(CmdArgs, options::OPT_s);
5965 Args.AddAllArgs(CmdArgs, options::OPT_t);
5966 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5967 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005968
Alp Tokerce365ca2013-12-02 12:43:03 +00005969 if (D.IsUsingLTO(Args))
5970 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00005971
Roman Divackyafe2f232012-08-28 15:09:03 +00005972 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005973
5974 if (!Args.hasArg(options::OPT_nostdlib) &&
5975 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005976 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005977 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005978 if (Args.hasArg(options::OPT_pg))
5979 CmdArgs.push_back("-lm_p");
5980 else
5981 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005982 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005983 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5984 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005985 if (Args.hasArg(options::OPT_pg))
5986 CmdArgs.push_back("-lgcc_p");
5987 else
5988 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005989 if (Args.hasArg(options::OPT_static)) {
5990 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005991 } else if (Args.hasArg(options::OPT_pg)) {
5992 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005993 } else {
5994 CmdArgs.push_back("--as-needed");
5995 CmdArgs.push_back("-lgcc_s");
5996 CmdArgs.push_back("--no-as-needed");
5997 }
5998
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005999 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006000 if (Args.hasArg(options::OPT_pg))
6001 CmdArgs.push_back("-lpthread_p");
6002 else
6003 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006004 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006005
Roman Divacky66f22762011-02-10 16:59:40 +00006006 if (Args.hasArg(options::OPT_pg)) {
6007 if (Args.hasArg(options::OPT_shared))
6008 CmdArgs.push_back("-lc");
6009 else
6010 CmdArgs.push_back("-lc_p");
6011 CmdArgs.push_back("-lgcc_p");
6012 } else {
6013 CmdArgs.push_back("-lc");
6014 CmdArgs.push_back("-lgcc");
6015 }
6016
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006017 if (Args.hasArg(options::OPT_static)) {
6018 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006019 } else if (Args.hasArg(options::OPT_pg)) {
6020 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006021 } else {
6022 CmdArgs.push_back("--as-needed");
6023 CmdArgs.push_back("-lgcc_s");
6024 CmdArgs.push_back("--no-as-needed");
6025 }
6026 }
6027
6028 if (!Args.hasArg(options::OPT_nostdlib) &&
6029 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00006030 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00006031 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006032 else
6033 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006034 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006035 }
6036
Roman Divackyafe2f232012-08-28 15:09:03 +00006037 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006038
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006039 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006040 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006041 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006042}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006043
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006044void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6045 const InputInfo &Output,
6046 const InputInfoList &Inputs,
6047 const ArgList &Args,
6048 const char *LinkingOutput) const {
6049 ArgStringList CmdArgs;
6050
6051 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6052 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00006053 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006054 CmdArgs.push_back("--32");
6055
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006056 // Pass the target CPU to GNU as for ARM, since the source code might
6057 // not have the correct .cpu annotation.
Joerg Sonnenbergerdc7a23c2014-02-02 22:37:14 +00006058 if (getToolChain().getArch() == llvm::Triple::arm ||
6059 getToolChain().getArch() == llvm::Triple::thumb) {
Bernard Ogden31561762013-12-12 13:27:11 +00006060 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006061 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6062 }
6063
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006064 if (getToolChain().getArch() == llvm::Triple::mips ||
6065 getToolChain().getArch() == llvm::Triple::mipsel ||
6066 getToolChain().getArch() == llvm::Triple::mips64 ||
6067 getToolChain().getArch() == llvm::Triple::mips64el) {
6068 StringRef CPUName;
6069 StringRef ABIName;
6070 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6071
6072 CmdArgs.push_back("-march");
6073 CmdArgs.push_back(CPUName.data());
6074
6075 CmdArgs.push_back("-mabi");
6076 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6077
6078 if (getToolChain().getArch() == llvm::Triple::mips ||
6079 getToolChain().getArch() == llvm::Triple::mips64)
6080 CmdArgs.push_back("-EB");
6081 else
6082 CmdArgs.push_back("-EL");
6083
6084 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6085 options::OPT_fpic, options::OPT_fno_pic,
6086 options::OPT_fPIE, options::OPT_fno_PIE,
6087 options::OPT_fpie, options::OPT_fno_pie);
6088 if (LastPICArg &&
6089 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6090 LastPICArg->getOption().matches(options::OPT_fpic) ||
6091 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6092 LastPICArg->getOption().matches(options::OPT_fpie))) {
6093 CmdArgs.push_back("-KPIC");
6094 }
6095 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006096
6097 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6098 options::OPT_Xassembler);
6099
6100 CmdArgs.push_back("-o");
6101 CmdArgs.push_back(Output.getFilename());
6102
6103 for (InputInfoList::const_iterator
6104 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6105 const InputInfo &II = *it;
6106 CmdArgs.push_back(II.getFilename());
6107 }
6108
David Chisnallddbd68f2011-09-27 22:03:18 +00006109 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6111}
6112
6113void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6114 const InputInfo &Output,
6115 const InputInfoList &Inputs,
6116 const ArgList &Args,
6117 const char *LinkingOutput) const {
6118 const Driver &D = getToolChain().getDriver();
6119 ArgStringList CmdArgs;
6120
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006121 if (!D.SysRoot.empty())
6122 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6123
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006124 if (Args.hasArg(options::OPT_static)) {
6125 CmdArgs.push_back("-Bstatic");
6126 } else {
6127 if (Args.hasArg(options::OPT_rdynamic))
6128 CmdArgs.push_back("-export-dynamic");
6129 CmdArgs.push_back("--eh-frame-hdr");
6130 if (Args.hasArg(options::OPT_shared)) {
6131 CmdArgs.push_back("-Bshareable");
6132 } else {
6133 CmdArgs.push_back("-dynamic-linker");
6134 CmdArgs.push_back("/libexec/ld.elf_so");
6135 }
6136 }
6137
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006138 // Many NetBSD architectures support more than one ABI.
6139 // Determine the correct emulation for ld.
6140 switch (getToolChain().getArch()) {
6141 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006142 CmdArgs.push_back("-m");
6143 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006144 break;
6145 case llvm::Triple::arm:
6146 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006147 CmdArgs.push_back("-m");
6148 switch (getToolChain().getTriple().getEnvironment()) {
6149 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006150 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006151 CmdArgs.push_back("armelf_nbsd_eabi");
6152 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006153 case llvm::Triple::EABIHF:
6154 case llvm::Triple::GNUEABIHF:
6155 CmdArgs.push_back("armelf_nbsd_eabihf");
6156 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006157 default:
6158 CmdArgs.push_back("armelf_nbsd");
6159 break;
6160 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006161 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006162 case llvm::Triple::mips64:
6163 case llvm::Triple::mips64el:
6164 if (hasMipsABIArg(Args, "32")) {
6165 CmdArgs.push_back("-m");
6166 if (getToolChain().getArch() == llvm::Triple::mips64)
6167 CmdArgs.push_back("elf32btsmip");
6168 else
6169 CmdArgs.push_back("elf32ltsmip");
6170 } else if (hasMipsABIArg(Args, "64")) {
6171 CmdArgs.push_back("-m");
6172 if (getToolChain().getArch() == llvm::Triple::mips64)
6173 CmdArgs.push_back("elf64btsmip");
6174 else
6175 CmdArgs.push_back("elf64ltsmip");
6176 }
6177 break;
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006178 default:
6179 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006180 }
6181
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006182 if (Output.isFilename()) {
6183 CmdArgs.push_back("-o");
6184 CmdArgs.push_back(Output.getFilename());
6185 } else {
6186 assert(Output.isNothing() && "Invalid output.");
6187 }
6188
6189 if (!Args.hasArg(options::OPT_nostdlib) &&
6190 !Args.hasArg(options::OPT_nostartfiles)) {
6191 if (!Args.hasArg(options::OPT_shared)) {
6192 CmdArgs.push_back(Args.MakeArgString(
6193 getToolChain().GetFilePath("crt0.o")));
6194 CmdArgs.push_back(Args.MakeArgString(
6195 getToolChain().GetFilePath("crti.o")));
6196 CmdArgs.push_back(Args.MakeArgString(
6197 getToolChain().GetFilePath("crtbegin.o")));
6198 } else {
6199 CmdArgs.push_back(Args.MakeArgString(
6200 getToolChain().GetFilePath("crti.o")));
6201 CmdArgs.push_back(Args.MakeArgString(
6202 getToolChain().GetFilePath("crtbeginS.o")));
6203 }
6204 }
6205
6206 Args.AddAllArgs(CmdArgs, options::OPT_L);
6207 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6208 Args.AddAllArgs(CmdArgs, options::OPT_e);
6209 Args.AddAllArgs(CmdArgs, options::OPT_s);
6210 Args.AddAllArgs(CmdArgs, options::OPT_t);
6211 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6212 Args.AddAllArgs(CmdArgs, options::OPT_r);
6213
6214 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6215
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006216 unsigned Major, Minor, Micro;
6217 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6218 bool useLibgcc = true;
6219 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006220 switch(getToolChain().getArch()) {
6221 case llvm::Triple::x86:
6222 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006223 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006224 break;
6225 default:
6226 break;
6227 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006228 }
6229
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006230 if (!Args.hasArg(options::OPT_nostdlib) &&
6231 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006232 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006233 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6234 CmdArgs.push_back("-lm");
6235 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006236 if (Args.hasArg(options::OPT_pthread))
6237 CmdArgs.push_back("-lpthread");
6238 CmdArgs.push_back("-lc");
6239
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006240 if (useLibgcc) {
6241 if (Args.hasArg(options::OPT_static)) {
6242 // libgcc_eh depends on libc, so resolve as much as possible,
6243 // pull in any new requirements from libc and then get the rest
6244 // of libgcc.
6245 CmdArgs.push_back("-lgcc_eh");
6246 CmdArgs.push_back("-lc");
6247 CmdArgs.push_back("-lgcc");
6248 } else {
6249 CmdArgs.push_back("-lgcc");
6250 CmdArgs.push_back("--as-needed");
6251 CmdArgs.push_back("-lgcc_s");
6252 CmdArgs.push_back("--no-as-needed");
6253 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006254 }
6255 }
6256
6257 if (!Args.hasArg(options::OPT_nostdlib) &&
6258 !Args.hasArg(options::OPT_nostartfiles)) {
6259 if (!Args.hasArg(options::OPT_shared))
6260 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6261 "crtend.o")));
6262 else
6263 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6264 "crtendS.o")));
6265 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6266 "crtn.o")));
6267 }
6268
Bill Wendling08760582011-06-27 19:15:03 +00006269 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006270
Rafael Espindola236db462013-11-09 20:07:19 +00006271 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006272 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6273}
6274
Thomas Schwinge4e555262013-03-28 19:04:25 +00006275void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6276 const InputInfo &Output,
6277 const InputInfoList &Inputs,
6278 const ArgList &Args,
6279 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006280 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006281 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006282
6283 // Add --32/--64 to make sure we get the format we want.
6284 // This is incomplete
6285 if (getToolChain().getArch() == llvm::Triple::x86) {
6286 CmdArgs.push_back("--32");
6287 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6288 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006289 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6290 CmdArgs.push_back("-a32");
6291 CmdArgs.push_back("-mppc");
6292 CmdArgs.push_back("-many");
6293 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6294 CmdArgs.push_back("-a64");
6295 CmdArgs.push_back("-mppc64");
6296 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006297 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6298 CmdArgs.push_back("-a64");
6299 CmdArgs.push_back("-mppc64le");
6300 CmdArgs.push_back("-many");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006301 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6302 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006303 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006304 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006305 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6306 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006307 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006308 NeedsKPIC = true;
Rafael Espindola92b00932010-08-10 00:25:48 +00006309 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006310 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006311 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6312 CmdArgs.push_back("-mfpu=neon");
Bernard Ogdena58ef052013-10-24 18:32:41 +00006313 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6314 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006315
Tim Northover9c7e0352013-12-12 11:55:52 +00006316 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6317 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006318 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006319
6320 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006321
6322 // FIXME: remove krait check when GNU tools support krait cpu
6323 // for now replace it with -march=armv7-a to avoid a lower
6324 // march from being picked in the absence of a cpu flag.
6325 Arg *A;
6326 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6327 StringRef(A->getValue()) == "krait")
6328 CmdArgs.push_back("-march=armv7-a");
6329 else
6330 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006331 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006332 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6333 getToolChain().getArch() == llvm::Triple::mipsel ||
6334 getToolChain().getArch() == llvm::Triple::mips64 ||
6335 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006336 StringRef CPUName;
6337 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006338 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006339
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006340 CmdArgs.push_back("-march");
6341 CmdArgs.push_back(CPUName.data());
6342
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006343 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006344 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006345
6346 if (getToolChain().getArch() == llvm::Triple::mips ||
6347 getToolChain().getArch() == llvm::Triple::mips64)
6348 CmdArgs.push_back("-EB");
6349 else
6350 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006351
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006352 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6353 if (StringRef(A->getValue()) == "2008")
6354 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6355 }
6356
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006357 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006358 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6359 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6360 options::OPT_mno_micromips);
6361 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6362 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6363
Simon Atanasyanbd986632013-11-26 11:58:04 +00006364 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6365 // Do not use AddLastArg because not all versions of MIPS assembler
6366 // support -mmsa / -mno-msa options.
6367 if (A->getOption().matches(options::OPT_mmsa))
6368 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6369 }
6370
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006371 NeedsKPIC = true;
6372 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6373 // Always pass an -march option, since our default of z10 is later
6374 // than the GNU assembler's default.
6375 StringRef CPUName = getSystemZTargetCPU(Args);
6376 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6377 }
6378
6379 if (NeedsKPIC) {
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006380 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6381 options::OPT_fpic, options::OPT_fno_pic,
6382 options::OPT_fPIE, options::OPT_fno_PIE,
6383 options::OPT_fpie, options::OPT_fno_pie);
6384 if (LastPICArg &&
6385 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6386 LastPICArg->getOption().matches(options::OPT_fpic) ||
6387 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6388 LastPICArg->getOption().matches(options::OPT_fpie))) {
6389 CmdArgs.push_back("-KPIC");
6390 }
Rafael Espindola92b00932010-08-10 00:25:48 +00006391 }
6392
6393 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6394 options::OPT_Xassembler);
6395
6396 CmdArgs.push_back("-o");
6397 CmdArgs.push_back(Output.getFilename());
6398
6399 for (InputInfoList::const_iterator
6400 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6401 const InputInfo &II = *it;
6402 CmdArgs.push_back(II.getFilename());
6403 }
6404
6405 const char *Exec =
6406 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6407 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006408
6409 // Handle the debug info splitting at object creation time if we're
6410 // creating an object.
6411 // TODO: Currently only works on linux with newer objcopy.
6412 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006413 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006414 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6415 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006416}
6417
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006418static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6419 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006420 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006421 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6422 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006423 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006424 CmdArgs.push_back("-lgcc");
6425
Logan Chien3d3373c2012-11-19 12:04:11 +00006426 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006427 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006428 CmdArgs.push_back("-lgcc");
6429 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006430 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006431 CmdArgs.push_back("--as-needed");
6432 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006433 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006434 CmdArgs.push_back("--no-as-needed");
6435 }
6436
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006437 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006438 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006439 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006440 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006441
6442 // According to Android ABI, we have to link with libdl if we are
6443 // linking with non-static libgcc.
6444 //
6445 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6446 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6447 if (isAndroid && !StaticLibgcc)
6448 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006449}
6450
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006451static StringRef getLinuxDynamicLinker(const ArgList &Args,
6452 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006453 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6454 if (ToolChain.getTriple().isArch64Bit())
6455 return "/system/bin/linker64";
6456 else
6457 return "/system/bin/linker";
6458 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6459 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006460 return "/lib/ld-linux.so.2";
6461 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6462 return "/lib/ld-linux-aarch64.so.1";
6463 else if (ToolChain.getArch() == llvm::Triple::arm ||
6464 ToolChain.getArch() == llvm::Triple::thumb) {
6465 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6466 return "/lib/ld-linux-armhf.so.3";
6467 else
6468 return "/lib/ld-linux.so.3";
6469 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6470 ToolChain.getArch() == llvm::Triple::mipsel)
6471 return "/lib/ld.so.1";
6472 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6473 ToolChain.getArch() == llvm::Triple::mips64el) {
Joerg Sonnenbergerd11c4782014-02-02 22:40:33 +00006474 if (hasMipsABIArg(Args, "n32"))
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006475 return "/lib32/ld.so.1";
6476 else
6477 return "/lib64/ld.so.1";
6478 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6479 return "/lib/ld.so.1";
6480 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006481 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006482 ToolChain.getArch() == llvm::Triple::systemz)
6483 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006484 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6485 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006486 else
6487 return "/lib64/ld-linux-x86-64.so.2";
6488}
6489
Thomas Schwinge4e555262013-03-28 19:04:25 +00006490void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6491 const InputInfo &Output,
6492 const InputInfoList &Inputs,
6493 const ArgList &Args,
6494 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006495 const toolchains::Linux& ToolChain =
6496 static_cast<const toolchains::Linux&>(getToolChain());
6497 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006498 const bool isAndroid =
6499 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne32701642013-11-01 18:16:25 +00006500 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006501 const bool IsPIE =
6502 !Args.hasArg(options::OPT_shared) &&
Peter Collingbourne32701642013-11-01 18:16:25 +00006503 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006504
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006505 ArgStringList CmdArgs;
6506
Rafael Espindolad1002f62010-11-15 18:28:16 +00006507 // Silence warning for "clang -g foo.o -o foo"
6508 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006509 // and "clang -emit-llvm foo.o -o foo"
6510 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006511 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006512 // handled somewhere else.
6513 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006514
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006515 if (!D.SysRoot.empty())
6516 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006517
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006518 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006519 CmdArgs.push_back("-pie");
6520
Rafael Espindola1c76c592010-11-07 22:57:16 +00006521 if (Args.hasArg(options::OPT_rdynamic))
6522 CmdArgs.push_back("-export-dynamic");
6523
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006524 if (Args.hasArg(options::OPT_s))
6525 CmdArgs.push_back("-s");
6526
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006527 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6528 e = ToolChain.ExtraOpts.end();
6529 i != e; ++i)
6530 CmdArgs.push_back(i->c_str());
6531
6532 if (!Args.hasArg(options::OPT_static)) {
6533 CmdArgs.push_back("--eh-frame-hdr");
6534 }
6535
6536 CmdArgs.push_back("-m");
6537 if (ToolChain.getArch() == llvm::Triple::x86)
6538 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006539 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6540 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006541 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006542 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006543 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006544 else if (ToolChain.getArch() == llvm::Triple::ppc)
6545 CmdArgs.push_back("elf32ppclinux");
6546 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6547 CmdArgs.push_back("elf64ppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00006548 else if (ToolChain.getArch() == llvm::Triple::sparc)
6549 CmdArgs.push_back("elf32_sparc");
6550 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6551 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006552 else if (ToolChain.getArch() == llvm::Triple::mips)
6553 CmdArgs.push_back("elf32btsmip");
6554 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6555 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006556 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Joerg Sonnenbergerd11c4782014-02-02 22:40:33 +00006557 if (hasMipsABIArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006558 CmdArgs.push_back("elf32btsmipn32");
6559 else
6560 CmdArgs.push_back("elf64btsmip");
6561 }
6562 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Joerg Sonnenbergerd11c4782014-02-02 22:40:33 +00006563 if (hasMipsABIArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006564 CmdArgs.push_back("elf32ltsmipn32");
6565 else
6566 CmdArgs.push_back("elf64ltsmip");
6567 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006568 else if (ToolChain.getArch() == llvm::Triple::systemz)
6569 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006570 else
6571 CmdArgs.push_back("elf_x86_64");
6572
6573 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00006574 if (ToolChain.getArch() == llvm::Triple::arm ||
6575 ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006576 CmdArgs.push_back("-Bstatic");
6577 else
6578 CmdArgs.push_back("-static");
6579 } else if (Args.hasArg(options::OPT_shared)) {
6580 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006581 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006582 CmdArgs.push_back("-Bsymbolic");
6583 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006584 }
6585
6586 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006587 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006588 (!Args.hasArg(options::OPT_static) &&
6589 !Args.hasArg(options::OPT_shared))) {
6590 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006591 CmdArgs.push_back(Args.MakeArgString(
6592 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006593 }
6594
6595 CmdArgs.push_back("-o");
6596 CmdArgs.push_back(Output.getFilename());
6597
Rafael Espindola81937ec2010-12-01 01:52:43 +00006598 if (!Args.hasArg(options::OPT_nostdlib) &&
6599 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006600 if (!isAndroid) {
6601 const char *crt1 = NULL;
6602 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006603 if (Args.hasArg(options::OPT_pg))
6604 crt1 = "gcrt1.o";
6605 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006606 crt1 = "Scrt1.o";
6607 else
6608 crt1 = "crt1.o";
6609 }
6610 if (crt1)
6611 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006612
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006613 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6614 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006615
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006616 const char *crtbegin;
6617 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006618 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006619 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006620 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006621 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006622 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006623 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006624 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006625 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006626
6627 // Add crtfastmath.o if available and fast math is enabled.
6628 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006629 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006630
6631 Args.AddAllArgs(CmdArgs, options::OPT_L);
6632
6633 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6634
Roman Divackyee8188a2011-03-01 17:53:14 +00006635 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6636 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006637 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006638
Alp Tokerce365ca2013-12-02 12:43:03 +00006639 if (D.IsUsingLTO(Args))
6640 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006641
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006642 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6643 CmdArgs.push_back("--no-demangle");
6644
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006645 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6646
Eric Christopher04997782012-11-29 18:51:05 +00006647 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006648 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006649 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006650 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006651 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006652 if (Sanitize.needsAsanRt())
6653 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6654 if (Sanitize.needsTsanRt())
6655 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006656 if (Sanitize.needsMsanRt())
6657 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006658 if (Sanitize.needsLsanRt())
6659 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00006660 if (Sanitize.needsDfsanRt())
6661 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006662
Chandler Carruthe4458b32013-06-24 09:38:45 +00006663 // The profile runtime also needs access to system libraries.
6664 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6665
Hans Wennborg70850d82013-07-18 20:29:38 +00006666 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006667 !Args.hasArg(options::OPT_nostdlib) &&
6668 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006669 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6670 !Args.hasArg(options::OPT_static);
6671 if (OnlyLibstdcxxStatic)
6672 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006673 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006674 if (OnlyLibstdcxxStatic)
6675 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006676 CmdArgs.push_back("-lm");
6677 }
6678
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006679 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006680 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6681 if (Args.hasArg(options::OPT_static))
6682 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006683
Chandler Carruth01538002013-01-17 13:19:29 +00006684 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6685 if (OpenMP) {
6686 CmdArgs.push_back("-lgomp");
6687
Alp Tokerf6a24ce2013-12-05 16:25:25 +00006688 // FIXME: Exclude this for platforms with libgomp that don't require
6689 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00006690 CmdArgs.push_back("-lrt");
6691 }
6692
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006693 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006694
Chandler Carruth94a32012012-05-14 18:31:18 +00006695 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006696 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006697 CmdArgs.push_back("-lpthread");
6698
6699 CmdArgs.push_back("-lc");
6700
6701 if (Args.hasArg(options::OPT_static))
6702 CmdArgs.push_back("--end-group");
6703 else
6704 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6705 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006706
Rafael Espindola81937ec2010-12-01 01:52:43 +00006707 if (!Args.hasArg(options::OPT_nostartfiles)) {
6708 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006709 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006710 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006711 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006712 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006713 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006714 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006715
Rafael Espindola81937ec2010-12-01 01:52:43 +00006716 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006717 if (!isAndroid)
6718 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006719 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006720 }
6721
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006722 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6723}
Rafael Espindola92b00932010-08-10 00:25:48 +00006724
Chris Lattner3e2ee142010-07-07 16:01:42 +00006725void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006726 const InputInfo &Output,
6727 const InputInfoList &Inputs,
6728 const ArgList &Args,
6729 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006730 ArgStringList CmdArgs;
6731
6732 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6733 options::OPT_Xassembler);
6734
6735 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006736 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006737
6738 for (InputInfoList::const_iterator
6739 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6740 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006741 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006742 }
6743
6744 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006745 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006746 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006747}
6748
6749void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006750 const InputInfo &Output,
6751 const InputInfoList &Inputs,
6752 const ArgList &Args,
6753 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006754 const Driver &D = getToolChain().getDriver();
6755 ArgStringList CmdArgs;
6756
Daniel Dunbarb440f562010-08-02 02:38:21 +00006757 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006758 CmdArgs.push_back("-o");
6759 CmdArgs.push_back(Output.getFilename());
6760 } else {
6761 assert(Output.isNothing() && "Invalid output.");
6762 }
6763
6764 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006765 !Args.hasArg(options::OPT_nostartfiles)) {
6766 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6767 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6768 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6769 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6770 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006771
6772 Args.AddAllArgs(CmdArgs, options::OPT_L);
6773 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6774 Args.AddAllArgs(CmdArgs, options::OPT_e);
6775
Daniel Dunbar54423b22010-09-17 00:24:54 +00006776 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006777
Eli Friedman83de5132011-12-08 23:54:21 +00006778 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6779
Chris Lattner3e2ee142010-07-07 16:01:42 +00006780 if (!Args.hasArg(options::OPT_nostdlib) &&
6781 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006782 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006783 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006784 CmdArgs.push_back("-lm");
6785 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006786 }
6787
6788 if (!Args.hasArg(options::OPT_nostdlib) &&
6789 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006790 if (Args.hasArg(options::OPT_pthread))
6791 CmdArgs.push_back("-lpthread");
6792 CmdArgs.push_back("-lc");
6793 CmdArgs.push_back("-lCompilerRT-Generic");
6794 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6795 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006796 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006797 }
6798
Rafael Espindola236db462013-11-09 20:07:19 +00006799 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006800 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006801}
6802
Daniel Dunbarcc912342009-05-02 18:28:39 +00006803/// DragonFly Tools
6804
6805// For now, DragonFly Assemble does just about the same as for
6806// FreeBSD, but this may change soon.
6807void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006808 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006809 const InputInfoList &Inputs,
6810 const ArgList &Args,
6811 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006812 ArgStringList CmdArgs;
6813
6814 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6815 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006816 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006817 CmdArgs.push_back("--32");
6818
6819 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6820 options::OPT_Xassembler);
6821
6822 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006823 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006824
6825 for (InputInfoList::const_iterator
6826 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6827 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006828 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006829 }
6830
6831 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006832 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006833 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006834}
6835
6836void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006837 const InputInfo &Output,
6838 const InputInfoList &Inputs,
6839 const ArgList &Args,
6840 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006841 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006842 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006843 ArgStringList CmdArgs;
6844
John McCall65b8da02013-04-11 22:55:55 +00006845 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6846 UseGCC47 = false;
6847
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006848 if (!D.SysRoot.empty())
6849 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6850
John McCall65b8da02013-04-11 22:55:55 +00006851 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006852 if (Args.hasArg(options::OPT_static)) {
6853 CmdArgs.push_back("-Bstatic");
6854 } else {
John McCall65b8da02013-04-11 22:55:55 +00006855 if (Args.hasArg(options::OPT_rdynamic))
6856 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006857 if (Args.hasArg(options::OPT_shared))
6858 CmdArgs.push_back("-Bshareable");
6859 else {
6860 CmdArgs.push_back("-dynamic-linker");
6861 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6862 }
John McCall65b8da02013-04-11 22:55:55 +00006863 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006864 }
6865
6866 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6867 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006868 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006869 CmdArgs.push_back("-m");
6870 CmdArgs.push_back("elf_i386");
6871 }
6872
Daniel Dunbarb440f562010-08-02 02:38:21 +00006873 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006874 CmdArgs.push_back("-o");
6875 CmdArgs.push_back(Output.getFilename());
6876 } else {
6877 assert(Output.isNothing() && "Invalid output.");
6878 }
6879
6880 if (!Args.hasArg(options::OPT_nostdlib) &&
6881 !Args.hasArg(options::OPT_nostartfiles)) {
6882 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006883 if (Args.hasArg(options::OPT_pg))
6884 CmdArgs.push_back(Args.MakeArgString(
6885 getToolChain().GetFilePath("gcrt1.o")));
6886 else {
6887 if (Args.hasArg(options::OPT_pie))
6888 CmdArgs.push_back(Args.MakeArgString(
6889 getToolChain().GetFilePath("Scrt1.o")));
6890 else
6891 CmdArgs.push_back(Args.MakeArgString(
6892 getToolChain().GetFilePath("crt1.o")));
6893 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006894 }
John McCall65b8da02013-04-11 22:55:55 +00006895 CmdArgs.push_back(Args.MakeArgString(
6896 getToolChain().GetFilePath("crti.o")));
6897 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6898 CmdArgs.push_back(Args.MakeArgString(
6899 getToolChain().GetFilePath("crtbeginS.o")));
6900 else
6901 CmdArgs.push_back(Args.MakeArgString(
6902 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006903 }
6904
6905 Args.AddAllArgs(CmdArgs, options::OPT_L);
6906 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6907 Args.AddAllArgs(CmdArgs, options::OPT_e);
6908
Daniel Dunbar54423b22010-09-17 00:24:54 +00006909 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006910
6911 if (!Args.hasArg(options::OPT_nostdlib) &&
6912 !Args.hasArg(options::OPT_nodefaultlibs)) {
6913 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6914 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006915 if (UseGCC47)
6916 CmdArgs.push_back("-L/usr/lib/gcc47");
6917 else
6918 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006919
6920 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006921 if (UseGCC47) {
6922 CmdArgs.push_back("-rpath");
6923 CmdArgs.push_back("/usr/lib/gcc47");
6924 } else {
6925 CmdArgs.push_back("-rpath");
6926 CmdArgs.push_back("/usr/lib/gcc44");
6927 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006928 }
6929
Hans Wennborg70850d82013-07-18 20:29:38 +00006930 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006931 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006932 CmdArgs.push_back("-lm");
6933 }
6934
Daniel Dunbarcc912342009-05-02 18:28:39 +00006935 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006936 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006937
6938 if (!Args.hasArg(options::OPT_nolibc)) {
6939 CmdArgs.push_back("-lc");
6940 }
6941
John McCall65b8da02013-04-11 22:55:55 +00006942 if (UseGCC47) {
6943 if (Args.hasArg(options::OPT_static) ||
6944 Args.hasArg(options::OPT_static_libgcc)) {
6945 CmdArgs.push_back("-lgcc");
6946 CmdArgs.push_back("-lgcc_eh");
6947 } else {
6948 if (Args.hasArg(options::OPT_shared_libgcc)) {
6949 CmdArgs.push_back("-lgcc_pic");
6950 if (!Args.hasArg(options::OPT_shared))
6951 CmdArgs.push_back("-lgcc");
6952 } else {
6953 CmdArgs.push_back("-lgcc");
6954 CmdArgs.push_back("--as-needed");
6955 CmdArgs.push_back("-lgcc_pic");
6956 CmdArgs.push_back("--no-as-needed");
6957 }
6958 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006959 } else {
John McCall65b8da02013-04-11 22:55:55 +00006960 if (Args.hasArg(options::OPT_shared)) {
6961 CmdArgs.push_back("-lgcc_pic");
6962 } else {
6963 CmdArgs.push_back("-lgcc");
6964 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006965 }
6966 }
6967
6968 if (!Args.hasArg(options::OPT_nostdlib) &&
6969 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006970 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006971 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006972 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006973 else
6974 CmdArgs.push_back(Args.MakeArgString(
6975 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006976 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006977 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006978 }
6979
Bill Wendling08760582011-06-27 19:15:03 +00006980 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006981
Daniel Dunbarcc912342009-05-02 18:28:39 +00006982 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006983 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006984 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006985}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006986
6987void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6988 const InputInfo &Output,
6989 const InputInfoList &Inputs,
6990 const ArgList &Args,
6991 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006992 ArgStringList CmdArgs;
6993
6994 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006995 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6996 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006997 } else {
6998 assert(Output.isNothing() && "Invalid output.");
6999 }
7000
7001 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007002 !Args.hasArg(options::OPT_nostartfiles) &&
7003 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007004 CmdArgs.push_back("-defaultlib:libcmt");
7005 }
7006
7007 CmdArgs.push_back("-nologo");
7008
Hans Wennborgf1a74252013-09-10 20:18:04 +00007009 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7010
7011 if (DLL) {
7012 CmdArgs.push_back(Args.MakeArgString("-dll"));
7013
7014 SmallString<128> ImplibName(Output.getFilename());
7015 llvm::sys::path::replace_extension(ImplibName, "lib");
7016 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7017 ImplibName.str()));
7018 }
7019
Peter Collingbourne32701642013-11-01 18:16:25 +00007020 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007021 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007022 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00007023 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00007024 llvm::sys::path::append(LibSanitizer, "lib", "windows");
7025 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00007026 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00007027 } else {
7028 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
7029 }
7030 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00007031 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7032 }
7033
Michael J. Spencere2f49362012-06-18 16:56:04 +00007034 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007035 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007036
7037 // Add filenames immediately.
7038 for (InputInfoList::const_iterator
7039 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7040 if (it->isFilename())
7041 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007042 else
7043 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007044 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007045
7046 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007047 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007048 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7049}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007050
7051void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7052 const InputInfo &Output,
7053 const InputInfoList &Inputs,
7054 const ArgList &Args,
7055 const char *LinkingOutput) const {
7056 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7057}
7058
Hans Wennborg188382e2013-09-20 18:16:35 +00007059// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7060// If one cannot be found, return FallbackName.
7061// We do this special search to prevent clang-cl from falling back onto itself
7062// if it's available as cl.exe on the path.
7063static std::string FindFallback(const char *FallbackName,
7064 const char *ClangProgramPath) {
7065 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7066 if (!OptPath.hasValue())
7067 return FallbackName;
7068
7069#ifdef LLVM_ON_WIN32
7070 const StringRef PathSeparators = ";";
7071#else
7072 const StringRef PathSeparators = ":";
7073#endif
7074
7075 SmallVector<StringRef, 8> PathSegments;
7076 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7077
7078 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7079 const StringRef &PathSegment = PathSegments[i];
7080 if (PathSegment.empty())
7081 continue;
7082
7083 SmallString<128> FilePath(PathSegment);
7084 llvm::sys::path::append(FilePath, FallbackName);
7085 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7086 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7087 return FilePath.str();
7088 }
7089
7090 return FallbackName;
7091}
7092
Hans Wennborg87cfa712013-09-19 20:32:16 +00007093Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7094 const InputInfo &Output,
7095 const InputInfoList &Inputs,
7096 const ArgList &Args,
7097 const char *LinkingOutput) const {
7098 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007099 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007100 CmdArgs.push_back("/c"); // Compile only.
7101 CmdArgs.push_back("/W0"); // No warnings.
7102
7103 // The goal is to be able to invoke this tool correctly based on
7104 // any flag accepted by clang-cl.
7105
7106 // These are spelled the same way in clang and cl.exe,.
7107 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7108 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007109
7110 // Optimization level.
7111 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7112 if (A->getOption().getID() == options::OPT_O0) {
7113 CmdArgs.push_back("/Od");
7114 } else {
7115 StringRef OptLevel = A->getValue();
7116 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7117 A->render(Args, CmdArgs);
7118 else if (OptLevel == "3")
7119 CmdArgs.push_back("/Ox");
7120 }
7121 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007122
7123 // Flags for which clang-cl have an alias.
7124 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7125
7126 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7127 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7128 : "/GR-");
7129 if (Args.hasArg(options::OPT_fsyntax_only))
7130 CmdArgs.push_back("/Zs");
7131
Hans Wennborg260ff402013-09-27 17:54:18 +00007132 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7133 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7134 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7135
Hans Wennborg87cfa712013-09-19 20:32:16 +00007136 // Flags that can simply be passed through.
7137 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7138 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7139
7140 // The order of these flags is relevant, so pick the last one.
7141 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7142 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7143 A->render(Args, CmdArgs);
7144
7145
7146 // Input filename.
7147 assert(Inputs.size() == 1);
7148 const InputInfo &II = Inputs[0];
7149 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7150 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7151 if (II.isFilename())
7152 CmdArgs.push_back(II.getFilename());
7153 else
7154 II.getInputArg().renderAsInput(Args, CmdArgs);
7155
7156 // Output filename.
7157 assert(Output.getType() == types::TY_Object);
7158 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7159 Output.getFilename());
7160 CmdArgs.push_back(Fo);
7161
Hans Wennborg188382e2013-09-20 18:16:35 +00007162 const Driver &D = getToolChain().getDriver();
7163 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007164
Hans Wennborg188382e2013-09-20 18:16:35 +00007165 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007166}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007167
7168
7169/// XCore Tools
7170// We pass assemble and link construction to the xcc tool.
7171
7172void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7173 const InputInfo &Output,
7174 const InputInfoList &Inputs,
7175 const ArgList &Args,
7176 const char *LinkingOutput) const {
7177 ArgStringList CmdArgs;
7178
7179 CmdArgs.push_back("-o");
7180 CmdArgs.push_back(Output.getFilename());
7181
7182 CmdArgs.push_back("-c");
7183
7184 if (Args.hasArg(options::OPT_g_Group)) {
7185 CmdArgs.push_back("-g");
7186 }
7187
7188 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7189 options::OPT_Xassembler);
7190
7191 for (InputInfoList::const_iterator
7192 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7193 const InputInfo &II = *it;
7194 CmdArgs.push_back(II.getFilename());
7195 }
7196
7197 const char *Exec =
7198 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7199 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7200}
7201
7202void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7203 const InputInfo &Output,
7204 const InputInfoList &Inputs,
7205 const ArgList &Args,
7206 const char *LinkingOutput) const {
7207 ArgStringList CmdArgs;
7208
7209 if (Output.isFilename()) {
7210 CmdArgs.push_back("-o");
7211 CmdArgs.push_back(Output.getFilename());
7212 } else {
7213 assert(Output.isNothing() && "Invalid output.");
7214 }
7215
7216 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7217
7218 const char *Exec =
7219 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7220 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7221}