blob: 8afab2f23b0c00f5a0966138045c3079ba751395 [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"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Daniel Dunbar64198ef2009-09-10 01:21:05 +000055/// CheckPreprocessingOptions - Perform some validation of preprocessing
56/// arguments that is shared with gcc.
57static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000058 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
59 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
60 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000061 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000062 << A->getBaseArg().getAsString(Args)
63 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
64 }
65 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000066}
67
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068/// CheckCodeGenerationOptions - Perform some validation of code generation
69/// arguments that is shared with gcc.
70static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
71 // In gcc, only ARM checks this, but it seems reasonable to check universally.
72 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000073 if (const Arg *A =
74 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
75 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
76 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000077}
78
Bob Wilsond5aad2a2014-11-04 22:28:48 +000079// Add backslashes to escape spaces and other backslashes.
80// This is used for the space-separated argument list specified with
81// the -dwarf-debug-flags option.
82static void EscapeSpacesAndBackslashes(const char *Arg,
83 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000084 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000085 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000086 default:
87 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +000088 case ' ':
89 case '\\':
90 Res.push_back('\\');
91 break;
92 }
93 Res.push_back(*Arg);
94 }
95}
96
Chris Lattnerbf2803f2010-03-29 17:55:58 +000097// Quote target names for inclusion in GNU Make dependency files.
98// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +000099static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000100 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
101 switch (Target[i]) {
102 case ' ':
103 case '\t':
104 // Escape the preceding backslashes
105 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
106 Res.push_back('\\');
107
108 // Escape the space/tab
109 Res.push_back('\\');
110 break;
111 case '$':
112 Res.push_back('$');
113 break;
114 case '#':
115 Res.push_back('\\');
116 break;
117 default:
118 break;
119 }
120
121 Res.push_back(Target[i]);
122 }
123}
124
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000125static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
126 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000127 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 bool CombinedArg = false;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 if (!DirList)
131 return; // Nothing to do.
132
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 StringRef Name(ArgName);
134 if (Name.equals("-I") || Name.equals("-L"))
135 CombinedArg = true;
136
Bill Wendling281ca292012-03-12 21:22:35 +0000137 StringRef Dirs(DirList);
138 if (Dirs.empty()) // Empty string should not add '.'.
139 return;
140
141 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000142 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000143 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(".");
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000152 CmdArgs.push_back(
153 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 } else {
155 CmdArgs.push_back(ArgName);
156 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
157 }
Bill Wendling281ca292012-03-12 21:22:35 +0000158 }
Nico Weber89355782012-03-19 15:00:03 +0000159 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000160 }
161
162 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 if (CombinedArg) {
164 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
165 } else {
166 CmdArgs.push_back(ArgName);
167 CmdArgs.push_back(".");
168 }
Bill Wendling281ca292012-03-12 21:22:35 +0000169 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000170 if (CombinedArg) {
171 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
172 } else {
173 CmdArgs.push_back(ArgName);
174 CmdArgs.push_back(Args.MakeArgString(Dirs));
175 }
Bill Wendling281ca292012-03-12 21:22:35 +0000176 }
177}
178
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
180 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 const Driver &D = TC.getDriver();
182
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000183 // Add extra linker input arguments which are not treated as inputs
184 // (constructed via -Xarch_).
185 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
186
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000187 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 if (!TC.HasNativeLLVMSupport()) {
189 // Don't try to pass LLVM inputs unless we have native support.
190 if (II.getType() == types::TY_LLVM_IR ||
191 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000192 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
193 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
195
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000196 // Add filenames immediately.
197 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000199 continue;
200 }
201
202 // Otherwise, this is a linker input argument.
203 const Arg &A = II.getInputArg();
204
205 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000206 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000207 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000208 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000209 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000210 else if (A.getOption().matches(options::OPT_z)) {
211 // Pass -z prefix for gcc linker compatibility.
212 A.claim();
213 A.render(Args, CmdArgs);
214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000215 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000216 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217 }
Bill Wendling281ca292012-03-12 21:22:35 +0000218
219 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000220 // and only supported on native toolchains.
221 if (!TC.isCrossCompiling())
222 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000223}
224
John McCall31168b02011-06-15 23:02:42 +0000225/// \brief Determine whether Objective-C automated reference counting is
226/// enabled.
227static bool isObjCAutoRefCount(const ArgList &Args) {
228 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
229}
230
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231/// \brief Determine whether we are linking the ObjC runtime.
232static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000233 if (isObjCAutoRefCount(Args)) {
234 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000235 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000236 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000237 return Args.hasArg(options::OPT_fobjc_link_runtime);
238}
239
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000240static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000241 // Don't forward inputs from the original command line. They are added from
242 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000243 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000244 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000245}
246
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000247void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
248 const Driver &D, 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");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000307 if ((isa<PrecompileJobAction>(JA) &&
308 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
309 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000310 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 if (Args.hasArg(options::OPT_MG)) {
314 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000315 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000316 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000317 CmdArgs.push_back("-MG");
318 }
319
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000321 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322
323 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000324 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000330 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 CmdArgs.push_back(Args.MakeArgString(Quoted));
332
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000333 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000335 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336 }
337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
Douglas Gregor111af7d2009-04-18 00:34:01 +0000339 // Add -i* options, and automatically translate to
340 // -include-pch/-include-pth for transparent PCH support. It's
341 // wonky, but we include looking for .gch so we can support seamless
342 // replacement into a build system already set up to be generating
343 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000347 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
348 RenderedImplicitInclude = true;
349
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000350 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 SmallString<128> P(A->getValue());
356 // We want the files to have a name like foo.h.pch. Add a dummy extension
357 // so that replace_extension does the right thing.
358 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000359 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000361 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000367 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000369 }
370
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000372 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000373 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000374 FoundPCH = UsePCH;
375 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
378
379 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000380 if (IsFirstImplicitInclude) {
381 A->claim();
382 if (UsePCH)
383 CmdArgs.push_back("-include-pch");
384 else
385 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 continue;
388 } else {
389 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 D.Diag(diag::warn_drv_pch_not_first_include) << P
391 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394 }
395
396 // Not translated, render as usual.
397 A->claim();
398 A->render(Args, CmdArgs);
399 }
400
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000401 Args.AddAllArgs(CmdArgs,
402 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
403 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000404
405 // Add -Wp, and -Xassembler if using the preprocessor.
406
407 // FIXME: There is a very unfortunate problem here, some troubled
408 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
409 // really support that we would have to parse and then translate
410 // those options. :(
411 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
412 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000413
414 // -I- is a deprecated GCC feature, reject it.
415 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417
418 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
419 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 StringRef sysroot = C.getSysRoot();
421 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 if (!Args.hasArg(options::OPT_isysroot)) {
423 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000424 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000425 }
426 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000427
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000429 // FIXME: We should probably sink the logic for handling these from the
430 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPATH - included following the user specified includes (but prior to
432 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000442
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000444 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000445 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000446
447 // Add system include arguments.
448 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449}
450
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000451// FIXME: Move to target hook.
452static bool isSignedCharDefault(const llvm::Triple &Triple) {
453 switch (Triple.getArch()) {
454 default:
455 return true;
456
Tim Northover9bb857a2013-01-31 12:13:10 +0000457 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000458 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000459 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000460 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000461 case llvm::Triple::thumb:
462 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000463 if (Triple.isOSDarwin() || Triple.isOSWindows())
464 return true;
465 return false;
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 case llvm::Triple::ppc:
468 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000469 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470 return true;
471 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000472
David Majnemerdcecd932015-05-23 19:23:55 +0000473 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000474 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000476 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000477 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 }
479}
480
Robert Lytton0e076492013-08-13 09:43:10 +0000481static bool isNoCommonDefault(const llvm::Triple &Triple) {
482 switch (Triple.getArch()) {
483 default:
484 return false;
485
486 case llvm::Triple::xcore:
487 return true;
488 }
489}
490
Renato Goline17c5802015-07-27 23:44:42 +0000491// ARM tools start.
492
493// Get SubArch (vN).
494static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
495 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000496 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000497}
498
499// True if M-profile.
500static bool isARMMProfile(const llvm::Triple &Triple) {
501 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000502 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000503 return Profile == llvm::ARM::PK_M;
504}
505
506// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000507static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
508 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000509 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
510 CPU = A->getValue();
511 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
512 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000513 if (!FromAs)
514 return;
515
516 for (const Arg *A :
517 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
518 StringRef Value = A->getValue();
519 if (Value.startswith("-mcpu="))
520 CPU = Value.substr(6);
521 if (Value.startswith("-march="))
522 Arch = Value.substr(7);
523 }
Renato Goline17c5802015-07-27 23:44:42 +0000524}
525
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000526// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000527// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000529 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000530 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000531 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
532 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000533 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
534}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000535
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000536// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000537static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000538 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000540 unsigned FPUID = llvm::ARM::parseFPU(FPU);
541 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000542 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
543}
544
Renato Golin7c542b42015-07-27 23:44:45 +0000545// Check if -march is valid by checking if it can be canonicalised and parsed.
546// getARMArch is used here instead of just checking the -march value in order
547// to handle -march=native correctly.
548static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000549 llvm::StringRef ArchName,
550 const llvm::Triple &Triple) {
551 std::string MArch = arm::getARMArch(ArchName, Triple);
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000552 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID)
Renato Goline17c5802015-07-27 23:44:42 +0000553 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000554}
555
Renato Golin7c542b42015-07-27 23:44:45 +0000556// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
557static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
558 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000559 const llvm::Triple &Triple) {
560 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
561 std::string Arch = arm::getARMArch(ArchName, Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000562 if (arm::getLLVMArchSuffixForARM(CPU, Arch).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000563 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000564}
565
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000566static bool useAAPCSForMachO(const llvm::Triple &T) {
567 // The backend is hardwired to assume AAPCS for M-class processors, ensure
568 // the frontend matches that.
569 return T.getEnvironment() == llvm::Triple::EABI ||
570 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
571}
572
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000573// Select the float ABI as determined by -msoft-float, -mhard-float, and
574// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000575StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000576 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000577 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000578 if (Arg *A =
579 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
580 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000581 if (A->getOption().matches(options::OPT_msoft_float))
582 FloatABI = "soft";
583 else if (A->getOption().matches(options::OPT_mhard_float))
584 FloatABI = "hard";
585 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000586 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000587 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000588 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000589 FloatABI = "soft";
590 }
591 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000592
593 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
594 // "apcs-gnu".
595 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
596 FloatABI == "hard")
597 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
598 << Triple.getArchName();
Daniel Dunbar78485922009-09-10 23:00:09 +0000599 }
600
601 // If unspecified, choose the default based on the platform.
602 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000603 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000604 case llvm::Triple::Darwin:
605 case llvm::Triple::MacOSX:
606 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 // Darwin defaults to "softfp" for v6 and v7.
608 //
John Brawn94fd9632015-05-21 12:19:49 +0000609 if (getARMSubArchVersionNumber(Triple) == 6 ||
610 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000611 FloatABI = "softfp";
612 else
613 FloatABI = "soft";
614 break;
615 }
616
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000617 // FIXME: this is invalid for WindowsCE
618 case llvm::Triple::Win32:
619 FloatABI = "hard";
620 break;
621
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000622 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000623 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000624 case llvm::Triple::GNUEABIHF:
625 FloatABI = "hard";
626 break;
627 default:
628 // FreeBSD defaults to soft float
629 FloatABI = "soft";
630 break;
631 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000632 break;
633
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000635 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000642 case llvm::Triple::EABIHF:
643 FloatABI = "hard";
644 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000645 case llvm::Triple::EABI:
646 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
647 FloatABI = "softfp";
648 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000649 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000650 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000656 default:
657 // Assume "soft", but warn the user we are guessing.
658 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000659 if (Triple.getOS() != llvm::Triple::UnknownOS ||
660 !Triple.isOSBinFormatMachO())
661 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000662 break;
663 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 }
665 }
666
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000667 return FloatABI;
668}
669
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000670static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
671 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000672 std::vector<const char *> &Features,
673 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000674 bool KernelOrKext =
675 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000676 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000677 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
678 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
679
Nico Weber6e0ebae2015-04-29 21:16:40 +0000680 if (!ForAS) {
681 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
682 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
683 // stripped out by the ARM target. We should probably pass this a new
684 // -target-option, which is handled by the -cc1/-cc1as invocation.
685 //
686 // FIXME2: For consistency, it would be ideal if we set up the target
687 // machine state the same when using the frontend or the assembler. We don't
688 // currently do that for the assembler, we pass the options directly to the
689 // backend and never even instantiate the frontend TargetInfo. If we did,
690 // and used its handleTargetFeatures hook, then we could ensure the
691 // assembler and the frontend behave the same.
692
693 // Use software floating point operations?
694 if (FloatABI == "soft")
695 Features.push_back("+soft-float");
696
697 // Use software floating point argument passing?
698 if (FloatABI != "hard")
699 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000700 } else {
701 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
702 // to the assembler correctly.
703 for (const Arg *A :
704 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
705 StringRef Value = A->getValue();
706 if (Value.startswith("-mfpu=")) {
707 WaFPU = A;
708 } else if (Value.startswith("-mcpu=")) {
709 WaCPU = A;
710 } else if (Value.startswith("-mhwdiv=")) {
711 WaHDiv = A;
712 } else if (Value.startswith("-march=")) {
713 WaArch = A;
714 }
715 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000716 }
717
Renato Golin7c542b42015-07-27 23:44:45 +0000718 // Check -march. ClangAs gives preference to -Wa,-march=.
719 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000720 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000721 if (WaArch) {
722 if (ArchArg)
723 D.Diag(clang::diag::warn_drv_unused_argument)
724 << ArchArg->getAsString(Args);
725 ArchName = StringRef(WaArch->getValue()).substr(7);
726 checkARMArchName(D, WaArch, Args, ArchName, Triple);
727 // FIXME: Set Arch.
728 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
729 } else if (ArchArg) {
730 ArchName = ArchArg->getValue();
731 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000732 }
733
Renato Golin7c542b42015-07-27 23:44:45 +0000734 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
735 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000736 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000737 if (WaCPU) {
738 if (CPUArg)
739 D.Diag(clang::diag::warn_drv_unused_argument)
740 << CPUArg->getAsString(Args);
741 CPUName = StringRef(WaCPU->getValue()).substr(6);
742 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
743 } else if (CPUArg) {
744 CPUName = CPUArg->getValue();
745 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000746 }
John Brawna95c1a82015-05-08 12:52:18 +0000747
Renato Golin23459c62015-07-30 16:40:17 +0000748 // Add CPU features for generic CPUs
749 if (CPUName == "native") {
750 llvm::StringMap<bool> HostFeatures;
751 if (llvm::sys::getHostCPUFeatures(HostFeatures))
752 for (auto &F : HostFeatures)
753 Features.push_back(
754 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
755 }
756
757 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
758 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
759 if (WaFPU) {
760 if (FPUArg)
761 D.Diag(clang::diag::warn_drv_unused_argument)
762 << FPUArg->getAsString(Args);
763 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
764 Features);
765 } else if (FPUArg) {
766 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
767 }
768
769 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
770 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
771 if (WaHDiv) {
772 if (HDivArg)
773 D.Diag(clang::diag::warn_drv_unused_argument)
774 << HDivArg->getAsString(Args);
775 getARMHWDivFeatures(D, WaHDiv, Args,
776 StringRef(WaHDiv->getValue()).substr(8), Features);
777 } else if (HDivArg)
778 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
779
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000780 // Setting -msoft-float effectively disables NEON because of the GCC
781 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000782 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000783 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000784 // Also need to explicitly disable features which imply NEON.
785 Features.push_back("-crypto");
786 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000787
Eric Christopher269c2a22015-04-04 03:34:43 +0000788 // En/disable crc code generation.
789 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000790 if (A->getOption().matches(options::OPT_mcrc))
791 Features.push_back("+crc");
792 else
793 Features.push_back("-crc");
794 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000795
796 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
797 Features.insert(Features.begin(), "+v8.1a");
798 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000799
Akira Hatanakac2694822015-07-07 08:28:42 +0000800 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
801 // neither options are specified, see if we are compiling for kernel/kext and
802 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000803 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
804 options::OPT_mno_long_calls)) {
805 if (A->getOption().matches(options::OPT_mlong_calls))
806 Features.push_back("+long-calls");
807 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
808 Features.push_back("+long-calls");
809 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000810
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000811 // Kernel code has more strict alignment requirements.
812 if (KernelOrKext)
813 Features.push_back("+strict-align");
814 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
815 options::OPT_munaligned_access)) {
816 if (A->getOption().matches(options::OPT_munaligned_access)) {
817 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
818 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
819 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
820 } else
821 Features.push_back("+strict-align");
822 } else {
823 // Assume pre-ARMv6 doesn't support unaligned accesses.
824 //
825 // ARMv6 may or may not support unaligned accesses depending on the
826 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
827 // Darwin and NetBSD targets support unaligned accesses, and others don't.
828 //
829 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
830 // which raises an alignment fault on unaligned accesses. Linux
831 // defaults this bit to 0 and handles it as a system-wide (not
832 // per-process) setting. It is therefore safe to assume that ARMv7+
833 // Linux targets support unaligned accesses. The same goes for NaCl.
834 //
835 // The above behavior is consistent with GCC.
836 int VersionNum = getARMSubArchVersionNumber(Triple);
837 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
838 if (VersionNum < 6)
839 Features.push_back("+strict-align");
840 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
841 if (VersionNum < 7)
842 Features.push_back("+strict-align");
843 } else
844 Features.push_back("+strict-align");
845 }
846
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000847 // llvm does not support reserving registers in general. There is support
848 // for reserving r9 on ARM though (defined as a platform-specific register
849 // in ARM EABI).
850 if (Args.hasArg(options::OPT_ffixed_r9))
851 Features.push_back("+reserve-r9");
852
Akira Hatanaka580efb22015-07-16 00:43:00 +0000853 // The kext linker doesn't know how to deal with movw/movt.
854 if (KernelOrKext)
855 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000856}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000857
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000858void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859 bool KernelOrKext) const {
860 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000861 // Get the effective triple, which takes into account the deployment target.
862 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
863 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000864
865 // Select the ABI to use.
866 //
867 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000868 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000869 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000870 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000871 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000872 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000873 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000874 ABIName = "aapcs";
875 } else {
876 ABIName = "apcs-gnu";
877 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000878 } else if (Triple.isOSWindows()) {
879 // FIXME: this is invalid for WindowsCE
880 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000881 } else {
882 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000883 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000884 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000885 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000886 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000887 ABIName = "aapcs-linux";
888 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000889 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000890 case llvm::Triple::EABI:
891 ABIName = "aapcs";
892 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000893 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000894 if (Triple.getOS() == llvm::Triple::NetBSD)
895 ABIName = "apcs-gnu";
896 else
897 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000898 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000899 }
900 }
901 CmdArgs.push_back("-target-abi");
902 CmdArgs.push_back(ABIName);
903
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000904 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000905 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000906 if (FloatABI == "soft") {
907 // Floating point operations and argument passing are soft.
908 //
909 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000910 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000911 CmdArgs.push_back("-mfloat-abi");
912 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000913 } else if (FloatABI == "softfp") {
914 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000917 } else {
918 // Floating point operations and argument passing are hard.
919 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000920 CmdArgs.push_back("-mfloat-abi");
921 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000922 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000923
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000924 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000925 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
926 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000927 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000928 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000929 CmdArgs.push_back("-arm-global-merge=false");
930 else
931 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000932 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000933
Bob Wilson9c8af452013-04-11 18:53:25 +0000934 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000935 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000936 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000937}
Renato Goline17c5802015-07-27 23:44:42 +0000938// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000939
Tim Northover573cbee2014-05-24 12:52:07 +0000940/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
941/// targeting.
942static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000943 Arg *A;
944 std::string CPU;
945 // If we have -mtune or -mcpu, use that.
946 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000947 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000948 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000949 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000950 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000951 }
952
Kevin Qin110db6f2014-07-18 07:03:22 +0000953 // Handle CPU name is 'native'.
954 if (CPU == "native")
955 return llvm::sys::getHostCPUName();
956 else if (CPU.size())
957 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000958
James Molloy9b1586b2014-04-17 12:51:17 +0000959 // Make sure we pick "cyclone" if -arch is used.
960 // FIXME: Should this be picked by checking the target triple instead?
961 if (Args.getLastArg(options::OPT_arch))
962 return "cyclone";
963
964 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000965}
966
Tim Northover573cbee2014-05-24 12:52:07 +0000967void Clang::AddAArch64TargetArgs(const ArgList &Args,
968 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000969 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
970 llvm::Triple Triple(TripleStr);
971
972 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
973 Args.hasArg(options::OPT_mkernel) ||
974 Args.hasArg(options::OPT_fapple_kext))
975 CmdArgs.push_back("-disable-red-zone");
976
977 if (!Args.hasFlag(options::OPT_mimplicit_float,
978 options::OPT_mno_implicit_float, true))
979 CmdArgs.push_back("-no-implicit-float");
980
Craig Topper92fc2df2014-05-17 16:56:41 +0000981 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000982 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
983 ABIName = A->getValue();
984 else if (Triple.isOSDarwin())
985 ABIName = "darwinpcs";
986 else
987 ABIName = "aapcs";
988
989 CmdArgs.push_back("-target-abi");
990 CmdArgs.push_back(ABIName);
991
Bradley Smith9ff64332014-10-13 10:16:06 +0000992 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
993 options::OPT_mno_fix_cortex_a53_835769)) {
994 CmdArgs.push_back("-backend-option");
995 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
996 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
997 else
998 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000999 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
1000 // Enabled A53 errata (835769) workaround by default on android
1001 CmdArgs.push_back("-backend-option");
1002 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001003 }
1004
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001005 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001006 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1007 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001008 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001009 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-aarch64-global-merge=false");
1011 else
1012 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001013 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001014}
1015
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001016// Get CPU and ABI names. They are not independent
1017// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1019 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001020 const char *DefMips32CPU = "mips32r2";
1021 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001022
Daniel Sanders2bf13662014-07-10 14:40:57 +00001023 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1024 // default for mips64(el)?-img-linux-gnu.
1025 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1026 Triple.getEnvironment() == llvm::Triple::GNU) {
1027 DefMips32CPU = "mips32r6";
1028 DefMips64CPU = "mips64r6";
1029 }
Renato Golin7c542b42015-07-27 23:44:45 +00001030
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001031 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1032 if (Triple.getEnvironment() == llvm::Triple::Android)
1033 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001034
Brad Smithba26f582015-01-06 02:53:17 +00001035 // MIPS3 is the default for mips64*-unknown-openbsd.
1036 if (Triple.getOS() == llvm::Triple::OpenBSD)
1037 DefMips64CPU = "mips3";
1038
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001039 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001040 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001041
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001042 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001043 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001044 // Convert a GNU style Mips ABI name to the name
1045 // accepted by LLVM Mips backend.
1046 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001047 .Case("32", "o32")
1048 .Case("64", "n64")
1049 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001050 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001051
1052 // Setup default CPU and ABI names.
1053 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001054 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001055 default:
1056 llvm_unreachable("Unexpected triple arch name");
1057 case llvm::Triple::mips:
1058 case llvm::Triple::mipsel:
1059 CPUName = DefMips32CPU;
1060 break;
1061 case llvm::Triple::mips64:
1062 case llvm::Triple::mips64el:
1063 CPUName = DefMips64CPU;
1064 break;
1065 }
1066 }
1067
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001068 if (ABIName.empty()) {
1069 // Deduce ABI name from the target triple.
1070 if (Triple.getArch() == llvm::Triple::mips ||
1071 Triple.getArch() == llvm::Triple::mipsel)
1072 ABIName = "o32";
1073 else
1074 ABIName = "n64";
1075 }
1076
1077 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001078 // Deduce CPU name from ABI name.
1079 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001080 .Cases("o32", "eabi", DefMips32CPU)
1081 .Cases("n32", "n64", DefMips64CPU)
1082 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001083 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001084
1085 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001086}
1087
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001088// Convert ABI name to the GNU tools acceptable variant.
1089static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1090 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001091 .Case("o32", "32")
1092 .Case("n64", "64")
1093 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001094}
1095
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001096// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1097// and -mfloat-abi=.
1098static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001099 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001100 if (Arg *A =
1101 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1102 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001103 if (A->getOption().matches(options::OPT_msoft_float))
1104 FloatABI = "soft";
1105 else if (A->getOption().matches(options::OPT_mhard_float))
1106 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001107 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001108 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001109 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001110 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001111 FloatABI = "hard";
1112 }
1113 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001114 }
1115
1116 // If unspecified, choose the default based on the platform.
1117 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001118 // Assume "hard", because it's a default value used by gcc.
1119 // When we start to recognize specific target MIPS processors,
1120 // we will be able to select the default more correctly.
1121 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001122 }
1123
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001124 return FloatABI;
1125}
1126
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001127static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001128 std::vector<const char *> &Features,
1129 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130 StringRef FeatureName) {
1131 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001132 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001133 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001134 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001135 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001136 }
1137}
1138
Daniel Sanders379d44b2014-07-16 11:52:23 +00001139static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1140 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001141 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001142 StringRef CPUName;
1143 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001144 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001145 ABIName = getGnuCompatibleMipsABIName(ABIName);
1146
Daniel Sandersfeb61302014-08-08 15:47:17 +00001147 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1148 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001149
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001150 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001151 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001152 // FIXME: Note, this is a hack. We need to pass the selected float
1153 // mode to the MipsTargetInfoBase to define appropriate macros there.
1154 // Now it is the only method.
1155 Features.push_back("+soft-float");
1156 }
1157
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001158 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001159 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001160 if (Val == "2008") {
1161 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1162 Features.push_back("+nan2008");
1163 else {
1164 Features.push_back("-nan2008");
1165 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1166 }
1167 } else if (Val == "legacy") {
1168 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1169 Features.push_back("-nan2008");
1170 else {
1171 Features.push_back("+nan2008");
1172 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1173 }
1174 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001175 D.Diag(diag::err_drv_unsupported_option_argument)
1176 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001177 }
1178
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001179 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1180 options::OPT_mdouble_float, "single-float");
1181 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1182 "mips16");
1183 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1184 options::OPT_mno_micromips, "micromips");
1185 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1186 "dsp");
1187 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1188 "dspr2");
1189 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1190 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001191
1192 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1193 // pass -mfpxx
1194 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1195 options::OPT_mfp64)) {
1196 if (A->getOption().matches(options::OPT_mfp32))
1197 Features.push_back(Args.MakeArgString("-fp64"));
1198 else if (A->getOption().matches(options::OPT_mfpxx)) {
1199 Features.push_back(Args.MakeArgString("+fpxx"));
1200 Features.push_back(Args.MakeArgString("+nooddspreg"));
1201 } else
1202 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001203 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001204 Features.push_back(Args.MakeArgString("+fpxx"));
1205 Features.push_back(Args.MakeArgString("+nooddspreg"));
1206 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001207
Daniel Sanders28e5d392014-07-10 10:39:51 +00001208 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1209 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001210}
1211
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001212void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001213 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001214 const Driver &D = getToolChain().getDriver();
1215 StringRef CPUName;
1216 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001217 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001218 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001219
1220 CmdArgs.push_back("-target-abi");
1221 CmdArgs.push_back(ABIName.data());
1222
1223 StringRef FloatABI = getMipsFloatABI(D, Args);
1224
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001225 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001226 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001227 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001228 CmdArgs.push_back("-mfloat-abi");
1229 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001230 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001231 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001232 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001233 CmdArgs.push_back("-mfloat-abi");
1234 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001235 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001236
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001237 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1238 if (A->getOption().matches(options::OPT_mxgot)) {
1239 CmdArgs.push_back("-mllvm");
1240 CmdArgs.push_back("-mxgot");
1241 }
1242 }
1243
Simon Atanasyanc580b322013-05-11 06:33:44 +00001244 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1245 options::OPT_mno_ldc1_sdc1)) {
1246 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1247 CmdArgs.push_back("-mllvm");
1248 CmdArgs.push_back("-mno-ldc1-sdc1");
1249 }
1250 }
1251
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001252 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1253 options::OPT_mno_check_zero_division)) {
1254 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1255 CmdArgs.push_back("-mllvm");
1256 CmdArgs.push_back("-mno-check-zero-division");
1257 }
1258 }
1259
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001260 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001261 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001262 CmdArgs.push_back("-mllvm");
1263 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1264 A->claim();
1265 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001266}
1267
Hal Finkel8eb59282012-06-11 22:35:19 +00001268/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1269static std::string getPPCTargetCPU(const ArgList &Args) {
1270 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001271 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001272
1273 if (CPUName == "native") {
1274 std::string CPU = llvm::sys::getHostCPUName();
1275 if (!CPU.empty() && CPU != "generic")
1276 return CPU;
1277 else
1278 return "";
1279 }
1280
1281 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001282 .Case("common", "generic")
1283 .Case("440", "440")
1284 .Case("440fp", "440")
1285 .Case("450", "450")
1286 .Case("601", "601")
1287 .Case("602", "602")
1288 .Case("603", "603")
1289 .Case("603e", "603e")
1290 .Case("603ev", "603ev")
1291 .Case("604", "604")
1292 .Case("604e", "604e")
1293 .Case("620", "620")
1294 .Case("630", "pwr3")
1295 .Case("G3", "g3")
1296 .Case("7400", "7400")
1297 .Case("G4", "g4")
1298 .Case("7450", "7450")
1299 .Case("G4+", "g4+")
1300 .Case("750", "750")
1301 .Case("970", "970")
1302 .Case("G5", "g5")
1303 .Case("a2", "a2")
1304 .Case("a2q", "a2q")
1305 .Case("e500mc", "e500mc")
1306 .Case("e5500", "e5500")
1307 .Case("power3", "pwr3")
1308 .Case("power4", "pwr4")
1309 .Case("power5", "pwr5")
1310 .Case("power5x", "pwr5x")
1311 .Case("power6", "pwr6")
1312 .Case("power6x", "pwr6x")
1313 .Case("power7", "pwr7")
1314 .Case("power8", "pwr8")
1315 .Case("pwr3", "pwr3")
1316 .Case("pwr4", "pwr4")
1317 .Case("pwr5", "pwr5")
1318 .Case("pwr5x", "pwr5x")
1319 .Case("pwr6", "pwr6")
1320 .Case("pwr6x", "pwr6x")
1321 .Case("pwr7", "pwr7")
1322 .Case("pwr8", "pwr8")
1323 .Case("powerpc", "ppc")
1324 .Case("powerpc64", "ppc64")
1325 .Case("powerpc64le", "ppc64le")
1326 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001327 }
1328
1329 return "";
1330}
1331
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001332static void getPPCTargetFeatures(const ArgList &Args,
1333 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001334 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1335 StringRef Name = A->getOption().getName();
1336 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001337
1338 // Skip over "-m".
1339 assert(Name.startswith("m") && "Invalid feature name.");
1340 Name = Name.substr(1);
1341
1342 bool IsNegative = Name.startswith("no-");
1343 if (IsNegative)
1344 Name = Name.substr(3);
1345
1346 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1347 // pass the correct option to the backend while calling the frontend
1348 // option the same.
1349 // TODO: Change the LLVM backend option maybe?
1350 if (Name == "mfcrf")
1351 Name = "mfocrf";
1352
1353 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1354 }
1355
1356 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001357 AddTargetFeature(Args, Features, options::OPT_faltivec,
1358 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001359}
1360
Ulrich Weigand8afad612014-07-28 13:17:52 +00001361void Clang::AddPPCTargetArgs(const ArgList &Args,
1362 ArgStringList &CmdArgs) const {
1363 // Select the ABI to use.
1364 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001365 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001366 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001367 case llvm::Triple::ppc64: {
1368 // When targeting a processor that supports QPX, or if QPX is
1369 // specifically enabled, default to using the ABI that supports QPX (so
1370 // long as it is not specifically disabled).
1371 bool HasQPX = false;
1372 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1373 HasQPX = A->getValue() == StringRef("a2q");
1374 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1375 if (HasQPX) {
1376 ABIName = "elfv1-qpx";
1377 break;
1378 }
1379
Ulrich Weigand8afad612014-07-28 13:17:52 +00001380 ABIName = "elfv1";
1381 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001382 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001383 case llvm::Triple::ppc64le:
1384 ABIName = "elfv2";
1385 break;
1386 default:
1387 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001388 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001389
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001390 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1391 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1392 // the option if given as we don't have backend support for any targets
1393 // that don't use the altivec abi.
1394 if (StringRef(A->getValue()) != "altivec")
1395 ABIName = A->getValue();
1396
Ulrich Weigand8afad612014-07-28 13:17:52 +00001397 if (ABIName) {
1398 CmdArgs.push_back("-target-abi");
1399 CmdArgs.push_back(ABIName);
1400 }
1401}
1402
1403bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1404 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1405 return A && (A->getValue() == StringRef(Value));
1406}
1407
Tom Stellard6674c702013-04-01 20:56:53 +00001408/// Get the (LLVM) name of the R600 gpu we are targeting.
1409static std::string getR600TargetGPU(const ArgList &Args) {
1410 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001411 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001412 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001413 .Cases("rv630", "rv635", "r600")
1414 .Cases("rv610", "rv620", "rs780", "rs880")
1415 .Case("rv740", "rv770")
1416 .Case("palm", "cedar")
1417 .Cases("sumo", "sumo2", "sumo")
1418 .Case("hemlock", "cypress")
1419 .Case("aruba", "cayman")
1420 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001421 }
1422 return "";
1423}
1424
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001425void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001426 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001427 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001428 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429
James Y Knightb2406522015-06-15 20:51:24 +00001430 bool SoftFloatABI = false;
1431 if (Arg *A =
1432 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001433 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001434 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001435 }
1436
James Y Knightb2406522015-06-15 20:51:24 +00001437 // Only the hard-float ABI on Sparc is standardized, and it is the
1438 // default. GCC also supports a nonstandard soft-float ABI mode, and
1439 // perhaps LLVM should implement that, too. However, since llvm
1440 // currently does not support Sparc soft-float, at all, display an
1441 // error if it's requested.
1442 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001443 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1444 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001445 }
1446}
1447
Richard Sandiford4652d892013-07-19 16:51:51 +00001448static const char *getSystemZTargetCPU(const ArgList &Args) {
1449 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1450 return A->getValue();
1451 return "z10";
1452}
1453
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001454static void getSystemZTargetFeatures(const ArgList &Args,
1455 std::vector<const char *> &Features) {
1456 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001457 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001458 if (A->getOption().matches(options::OPT_mhtm))
1459 Features.push_back("+transactional-execution");
1460 else
1461 Features.push_back("-transactional-execution");
1462 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001463 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001464 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001465 if (A->getOption().matches(options::OPT_mvx))
1466 Features.push_back("+vector");
1467 else
1468 Features.push_back("-vector");
1469 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001470}
1471
Chandler Carruth953fb082013-01-13 11:46:33 +00001472static const char *getX86TargetCPU(const ArgList &Args,
1473 const llvm::Triple &Triple) {
1474 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001475 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001476 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001477 return "core-avx2";
1478
Chandler Carruth953fb082013-01-13 11:46:33 +00001479 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001480 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001481
1482 // FIXME: Reject attempts to use -march=native unless the target matches
1483 // the host.
1484 //
1485 // FIXME: We should also incorporate the detected target features for use
1486 // with -native.
1487 std::string CPU = llvm::sys::getHostCPUName();
1488 if (!CPU.empty() && CPU != "generic")
1489 return Args.MakeArgString(CPU);
1490 }
1491
Reid Kleckner3123eff2015-06-30 16:32:04 +00001492 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1493 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1494 StringRef Arch = A->getValue();
1495 const char *CPU;
1496 if (Triple.getArch() == llvm::Triple::x86) {
1497 CPU = llvm::StringSwitch<const char *>(Arch)
1498 .Case("IA32", "i386")
1499 .Case("SSE", "pentium3")
1500 .Case("SSE2", "pentium4")
1501 .Case("AVX", "sandybridge")
1502 .Case("AVX2", "haswell")
1503 .Default(nullptr);
1504 } else {
1505 CPU = llvm::StringSwitch<const char *>(Arch)
1506 .Case("AVX", "sandybridge")
1507 .Case("AVX2", "haswell")
1508 .Default(nullptr);
1509 }
1510 if (CPU)
1511 return CPU;
1512 }
1513
Chandler Carruth953fb082013-01-13 11:46:33 +00001514 // Select the default CPU if none was given (or detection failed).
1515
1516 if (Triple.getArch() != llvm::Triple::x86_64 &&
1517 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001518 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001519
1520 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1521
1522 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001523 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001524 if (Triple.getArchName() == "x86_64h")
1525 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001526 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001527 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001528
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001529 // Set up default CPU name for PS4 compilers.
1530 if (Triple.isPS4CPU())
1531 return "btver2";
1532
Alexey Bataev286d1b92014-01-31 04:07:13 +00001533 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001534 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001535 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001536
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001537 // Everything else goes to x86-64 in 64-bit mode.
1538 if (Is64Bit)
1539 return "x86-64";
1540
1541 switch (Triple.getOS()) {
1542 case llvm::Triple::FreeBSD:
1543 case llvm::Triple::NetBSD:
1544 case llvm::Triple::OpenBSD:
1545 return "i486";
1546 case llvm::Triple::Haiku:
1547 return "i586";
1548 case llvm::Triple::Bitrig:
1549 return "i686";
1550 default:
1551 // Fallback to p4.
1552 return "pentium4";
1553 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001554}
1555
Renato Golin7c542b42015-07-27 23:44:45 +00001556static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1557 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001559 default:
1560 return "";
1561
Amara Emerson703da2e2013-10-31 09:32:33 +00001562 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001563 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001564 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001565
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001566 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001567 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001568 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001569 case llvm::Triple::thumbeb: {
1570 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001571 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001572 return arm::getARMTargetCPU(MCPU, MArch, T);
1573 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001574 case llvm::Triple::mips:
1575 case llvm::Triple::mipsel:
1576 case llvm::Triple::mips64:
1577 case llvm::Triple::mips64el: {
1578 StringRef CPUName;
1579 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001580 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001581 return CPUName;
1582 }
1583
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001584 case llvm::Triple::nvptx:
1585 case llvm::Triple::nvptx64:
1586 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1587 return A->getValue();
1588 return "";
1589
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001590 case llvm::Triple::ppc:
1591 case llvm::Triple::ppc64:
1592 case llvm::Triple::ppc64le: {
1593 std::string TargetCPUName = getPPCTargetCPU(Args);
1594 // LLVM may default to generating code for the native CPU,
1595 // but, like gcc, we default to a more generic option for
1596 // each architecture. (except on Darwin)
1597 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1598 if (T.getArch() == llvm::Triple::ppc64)
1599 TargetCPUName = "ppc64";
1600 else if (T.getArch() == llvm::Triple::ppc64le)
1601 TargetCPUName = "ppc64le";
1602 else
1603 TargetCPUName = "ppc";
1604 }
1605 return TargetCPUName;
1606 }
1607
1608 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001609 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001610 case llvm::Triple::sparcv9:
1611 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001612 return A->getValue();
1613 return "";
1614
1615 case llvm::Triple::x86:
1616 case llvm::Triple::x86_64:
1617 return getX86TargetCPU(Args, T);
1618
1619 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001620 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001621
1622 case llvm::Triple::systemz:
1623 return getSystemZTargetCPU(Args);
1624
1625 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001626 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001627 return getR600TargetGPU(Args);
1628 }
1629}
1630
Alp Tokerce365ca2013-12-02 12:43:03 +00001631static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1632 ArgStringList &CmdArgs) {
1633 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1634 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1635 // forward.
1636 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001637 std::string Plugin =
1638 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001639 CmdArgs.push_back(Args.MakeArgString(Plugin));
1640
1641 // Try to pass driver level flags relevant to LTO code generation down to
1642 // the plugin.
1643
1644 // Handle flags for selecting CPU variants.
1645 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1646 if (!CPU.empty())
1647 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1648}
1649
Sanjay Patel2987c292015-06-11 14:53:41 +00001650/// This is a helper function for validating the optional refinement step
1651/// parameter in reciprocal argument strings. Return false if there is an error
1652/// parsing the refinement step. Otherwise, return true and set the Position
1653/// of the refinement step in the input string.
1654static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001656 const char RefinementStepToken = ':';
1657 Position = In.find(RefinementStepToken);
1658 if (Position != StringRef::npos) {
1659 StringRef Option = A.getOption().getName();
1660 StringRef RefStep = In.substr(Position + 1);
1661 // Allow exactly one numeric character for the additional refinement
1662 // step parameter. This is reasonable for all currently-supported
1663 // operations and architectures because we would expect that a larger value
1664 // of refinement steps would cause the estimate "optimization" to
1665 // under-perform the native operation. Also, if the estimate does not
1666 // converge quickly, it probably will not ever converge, so further
1667 // refinement steps will not produce a better answer.
1668 if (RefStep.size() != 1) {
1669 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1670 return false;
1671 }
1672 char RefStepChar = RefStep[0];
1673 if (RefStepChar < '0' || RefStepChar > '9') {
1674 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1675 return false;
1676 }
1677 }
1678 return true;
1679}
1680
1681/// The -mrecip flag requires processing of many optional parameters.
1682static void ParseMRecip(const Driver &D, const ArgList &Args,
1683 ArgStringList &OutStrings) {
1684 StringRef DisabledPrefixIn = "!";
1685 StringRef DisabledPrefixOut = "!";
1686 StringRef EnabledPrefixOut = "";
1687 StringRef Out = "-mrecip=";
1688
1689 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1690 if (!A)
1691 return;
1692
1693 unsigned NumOptions = A->getNumValues();
1694 if (NumOptions == 0) {
1695 // No option is the same as "all".
1696 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1697 return;
1698 }
1699
1700 // Pass through "all", "none", or "default" with an optional refinement step.
1701 if (NumOptions == 1) {
1702 StringRef Val = A->getValue(0);
1703 size_t RefStepLoc;
1704 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1705 return;
1706 StringRef ValBase = Val.slice(0, RefStepLoc);
1707 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1708 OutStrings.push_back(Args.MakeArgString(Out + Val));
1709 return;
1710 }
1711 }
1712
1713 // Each reciprocal type may be enabled or disabled individually.
1714 // Check each input value for validity, concatenate them all back together,
1715 // and pass through.
1716
1717 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001718 OptionStrings.insert(std::make_pair("divd", false));
1719 OptionStrings.insert(std::make_pair("divf", false));
1720 OptionStrings.insert(std::make_pair("vec-divd", false));
1721 OptionStrings.insert(std::make_pair("vec-divf", false));
1722 OptionStrings.insert(std::make_pair("sqrtd", false));
1723 OptionStrings.insert(std::make_pair("sqrtf", false));
1724 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1725 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001726
1727 for (unsigned i = 0; i != NumOptions; ++i) {
1728 StringRef Val = A->getValue(i);
1729
1730 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1731 // Ignore the disablement token for string matching.
1732 if (IsDisabled)
1733 Val = Val.substr(1);
1734
1735 size_t RefStep;
1736 if (!getRefinementStep(Val, D, *A, RefStep))
1737 return;
1738
1739 StringRef ValBase = Val.slice(0, RefStep);
1740 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1741 if (OptionIter == OptionStrings.end()) {
1742 // Try again specifying float suffix.
1743 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1744 if (OptionIter == OptionStrings.end()) {
1745 // The input name did not match any known option string.
1746 D.Diag(diag::err_drv_unknown_argument) << Val;
1747 return;
1748 }
1749 // The option was specified without a float or double suffix.
1750 // Make sure that the double entry was not already specified.
1751 // The float entry will be checked below.
1752 if (OptionStrings[ValBase.str() + 'd']) {
1753 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1754 return;
1755 }
1756 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001757
Sanjay Patel2987c292015-06-11 14:53:41 +00001758 if (OptionIter->second == true) {
1759 // Duplicate option specified.
1760 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1761 return;
1762 }
1763
1764 // Mark the matched option as found. Do not allow duplicate specifiers.
1765 OptionIter->second = true;
1766
1767 // If the precision was not specified, also mark the double entry as found.
1768 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1769 OptionStrings[ValBase.str() + 'd'] = true;
1770
1771 // Build the output string.
1772 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1773 Out = Args.MakeArgString(Out + Prefix + Val);
1774 if (i != NumOptions - 1)
1775 Out = Args.MakeArgString(Out + ",");
1776 }
1777
1778 OutStrings.push_back(Args.MakeArgString(Out));
1779}
1780
Eric Christopherc54920a2015-03-23 19:26:05 +00001781static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001782 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001783 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001784 // If -march=native, autodetect the feature list.
1785 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1786 if (StringRef(A->getValue()) == "native") {
1787 llvm::StringMap<bool> HostFeatures;
1788 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1789 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 Features.push_back(
1791 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001792 }
1793 }
1794
Jim Grosbach82eee262013-11-16 00:53:35 +00001795 if (Triple.getArchName() == "x86_64h") {
1796 // x86_64h implies quite a few of the more modern subtarget features
1797 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1798 Features.push_back("-rdrnd");
1799 Features.push_back("-aes");
1800 Features.push_back("-pclmul");
1801 Features.push_back("-rtm");
1802 Features.push_back("-hle");
1803 Features.push_back("-fsgsbase");
1804 }
1805
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001806 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001807 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001808 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001809 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001810 Features.push_back("+sse4.2");
1811 Features.push_back("+popcnt");
1812 } else
1813 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001814 }
1815
Eric Christopherc54920a2015-03-23 19:26:05 +00001816 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001817 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1818 StringRef Arch = A->getValue();
1819 bool ArchUsed = false;
1820 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001821 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001822 if (Arch == "AVX" || Arch == "AVX2") {
1823 ArchUsed = true;
1824 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1825 }
1826 }
1827 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001828 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001829 if (Arch == "IA32") {
1830 ArchUsed = true;
1831 } else if (Arch == "SSE" || Arch == "SSE2") {
1832 ArchUsed = true;
1833 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1834 }
1835 }
1836 if (!ArchUsed)
1837 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1838 }
1839
Jim Grosbach82eee262013-11-16 00:53:35 +00001840 // Now add any that the user explicitly requested on the command line,
1841 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001842 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1843 StringRef Name = A->getOption().getName();
1844 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001845
1846 // Skip over "-m".
1847 assert(Name.startswith("m") && "Invalid feature name.");
1848 Name = Name.substr(1);
1849
1850 bool IsNegative = Name.startswith("no-");
1851 if (IsNegative)
1852 Name = Name.substr(3);
1853
1854 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1855 }
1856}
1857
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001858void Clang::AddX86TargetArgs(const ArgList &Args,
1859 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001860 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001861 Args.hasArg(options::OPT_mkernel) ||
1862 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001863 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001864
Bob Wilson2616e2e2013-02-10 16:01:41 +00001865 // Default to avoid implicit floating-point for kernel/kext code, but allow
1866 // that to be overridden with -mno-soft-float.
1867 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1868 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 if (Arg *A = Args.getLastArg(
1870 options::OPT_msoft_float, options::OPT_mno_soft_float,
1871 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001872 const Option &O = A->getOption();
1873 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1874 O.matches(options::OPT_msoft_float));
1875 }
1876 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001877 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001878
1879 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1880 StringRef Value = A->getValue();
1881 if (Value == "intel" || Value == "att") {
1882 CmdArgs.push_back("-mllvm");
1883 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1884 } else {
1885 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1886 << A->getOption().getName() << Value;
1887 }
1888 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001889}
1890
Tony Linthicum76329bf2011-12-12 21:14:55 +00001891void Clang::AddHexagonTargetArgs(const ArgList &Args,
1892 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001893 CmdArgs.push_back("-mqdsp6-compat");
1894 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001895
Douglas Katzman54366072015-07-27 16:53:08 +00001896 if (const char *v =
1897 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001899 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001900 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001901 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001902 }
1903
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001904 if (!Args.hasArg(options::OPT_fno_short_enums))
1905 CmdArgs.push_back("-fshort-enums");
1906 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001907 CmdArgs.push_back("-mllvm");
1908 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001909 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001910 CmdArgs.push_back("-mllvm");
1911 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001912}
1913
Kevin Qin110db6f2014-07-18 07:03:22 +00001914// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001915static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001916 std::vector<const char *> &Features) {
1917 SmallVector<StringRef, 8> Split;
1918 text.split(Split, StringRef("+"), -1, false);
1919
Douglas Katzman2675d012015-06-29 19:12:56 +00001920 for (const StringRef Feature : Split) {
1921 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001922 .Case("fp", "+fp-armv8")
1923 .Case("simd", "+neon")
1924 .Case("crc", "+crc")
1925 .Case("crypto", "+crypto")
1926 .Case("nofp", "-fp-armv8")
1927 .Case("nosimd", "-neon")
1928 .Case("nocrc", "-crc")
1929 .Case("nocrypto", "-crypto")
1930 .Default(nullptr);
1931 if (result)
1932 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001933 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001934 D.Diag(diag::err_drv_no_neon_modifier);
1935 else
1936 return false;
1937 }
1938 return true;
1939}
1940
1941// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1942// decode CPU and feature.
1943static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1944 std::vector<const char *> &Features) {
1945 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1946 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001947 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1948 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001949 Features.push_back("+neon");
1950 Features.push_back("+crc");
1951 Features.push_back("+crypto");
1952 } else if (CPU == "generic") {
1953 Features.push_back("+neon");
1954 } else {
1955 return false;
1956 }
1957
1958 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1959 return false;
1960
1961 return true;
1962}
1963
1964static bool
1965getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1966 const ArgList &Args,
1967 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001968 std::string MarchLowerCase = March.lower();
1969 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001971 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001972 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001974 Features.push_back("+v8.1a");
1975 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001976 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001977 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001978
1979 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1980 return false;
1981
1982 return true;
1983}
1984
1985static bool
1986getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1987 const ArgList &Args,
1988 std::vector<const char *> &Features) {
1989 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001990 std::string McpuLowerCase = Mcpu.lower();
1991 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001992 return false;
1993
1994 return true;
1995}
1996
1997static bool
1998getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1999 const ArgList &Args,
2000 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002001 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002002 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002003 if (MtuneLowerCase == "native")
2004 MtuneLowerCase = llvm::sys::getHostCPUName();
2005 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002006 Features.push_back("+zcm");
2007 Features.push_back("+zcz");
2008 }
2009 return true;
2010}
2011
2012static bool
2013getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2014 const ArgList &Args,
2015 std::vector<const char *> &Features) {
2016 StringRef CPU;
2017 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002018 std::string McpuLowerCase = Mcpu.lower();
2019 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002020 return false;
2021
2022 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2023}
2024
Akira Hatanaka92500472015-07-27 19:29:04 +00002025static void getAArch64TargetFeatures(const Driver &D,
2026 const llvm::Triple &Triple,
2027 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002028 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002029 Arg *A;
2030 bool success = true;
2031 // Enable NEON by default.
2032 Features.push_back("+neon");
2033 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2034 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2035 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2036 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002037 else if (Args.hasArg(options::OPT_arch))
2038 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2039 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002040
2041 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2042 success =
2043 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2044 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2045 success =
2046 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002047 else if (Args.hasArg(options::OPT_arch))
2048 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2049 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002050
2051 if (!success)
2052 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002053
2054 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2055 Features.push_back("-fp-armv8");
2056 Features.push_back("-crypto");
2057 Features.push_back("-neon");
2058 }
Bradley Smith418c5932014-05-02 15:17:51 +00002059
2060 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002061 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002062 if (A->getOption().matches(options::OPT_mcrc))
2063 Features.push_back("+crc");
2064 else
2065 Features.push_back("-crc");
2066 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002067
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002068 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2069 options::OPT_munaligned_access))
2070 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2071 Features.push_back("+strict-align");
2072
Akira Hatanaka92500472015-07-27 19:29:04 +00002073 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002074 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002075}
2076
2077static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002078 const ArgList &Args, ArgStringList &CmdArgs,
2079 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002080 std::vector<const char *> Features;
2081 switch (Triple.getArch()) {
2082 default:
2083 break;
2084 case llvm::Triple::mips:
2085 case llvm::Triple::mipsel:
2086 case llvm::Triple::mips64:
2087 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002088 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002089 break;
2090
2091 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002092 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002093 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002094 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002095 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002096 break;
2097
2098 case llvm::Triple::ppc:
2099 case llvm::Triple::ppc64:
2100 case llvm::Triple::ppc64le:
2101 getPPCTargetFeatures(Args, Features);
2102 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002103 case llvm::Triple::systemz:
2104 getSystemZTargetFeatures(Args, Features);
2105 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002106 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002107 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002108 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002109 break;
2110 case llvm::Triple::x86:
2111 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002112 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002113 break;
2114 }
Rafael Espindola43964802013-08-21 17:34:32 +00002115
2116 // Find the last of each feature.
2117 llvm::StringMap<unsigned> LastOpt;
2118 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2119 const char *Name = Features[I];
2120 assert(Name[0] == '-' || Name[0] == '+');
2121 LastOpt[Name + 1] = I;
2122 }
2123
2124 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2125 // If this feature was overridden, ignore it.
2126 const char *Name = Features[I];
2127 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2128 assert(LastI != LastOpt.end());
2129 unsigned Last = LastI->second;
2130 if (Last != I)
2131 continue;
2132
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002133 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002134 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002135 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002136}
2137
David Majnemerae394812014-12-09 00:12:30 +00002138static bool
2139shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2140 const llvm::Triple &Triple) {
2141 // We use the zero-cost exception tables for Objective-C if the non-fragile
2142 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2143 // later.
2144 if (runtime.isNonFragile())
2145 return true;
2146
2147 if (!Triple.isMacOSX())
2148 return false;
2149
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002150 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002151 (Triple.getArch() == llvm::Triple::x86_64 ||
2152 Triple.getArch() == llvm::Triple::arm));
2153}
2154
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002155/// Adds exception related arguments to the driver command arguments. There's a
2156/// master flag, -fexceptions and also language specific flags to enable/disable
2157/// C++ and Objective-C exceptions. This makes it possible to for example
2158/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002159static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002160 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002161 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002162 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002163 const Driver &D = TC.getDriver();
2164 const llvm::Triple &Triple = TC.getTriple();
2165
Chad Rosier4fab82c2012-03-26 22:04:46 +00002166 if (KernelOrKext) {
2167 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2168 // arguments now to avoid warnings about unused arguments.
2169 Args.ClaimAllArgs(options::OPT_fexceptions);
2170 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2171 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2172 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2173 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2174 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002175 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002176 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002177
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002178 // See if the user explicitly enabled exceptions.
2179 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2180 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002181
David Majnemerae394812014-12-09 00:12:30 +00002182 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2183 // is not necessarily sensible, but follows GCC.
2184 if (types::isObjC(InputType) &&
2185 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002186 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002187 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002188
David Majnemerae394812014-12-09 00:12:30 +00002189 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002190 }
2191
2192 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002193 // Disable C++ EH by default on XCore, PS4, and MSVC.
2194 // FIXME: Remove MSVC from this list once things work.
2195 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2196 !Triple.isPS4CPU() &&
2197 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002198 Arg *ExceptionArg = Args.getLastArg(
2199 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2200 options::OPT_fexceptions, options::OPT_fno_exceptions);
2201 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002202 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002203 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2204 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002205
2206 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002207 if (Triple.isPS4CPU()) {
2208 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2209 assert(ExceptionArg &&
2210 "On the PS4 exceptions should only be enabled if passing "
2211 "an argument");
2212 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2213 const Arg *RTTIArg = TC.getRTTIArg();
2214 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2215 D.Diag(diag::err_drv_argument_not_allowed_with)
2216 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2217 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2218 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2219 } else
2220 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2221
Anders Carlssone96ab552011-02-28 02:27:16 +00002222 CmdArgs.push_back("-fcxx-exceptions");
2223
David Majnemer8de68642014-12-05 08:11:58 +00002224 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002225 }
2226 }
2227
David Majnemer8de68642014-12-05 08:11:58 +00002228 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002229 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002230}
2231
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002232static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002233 bool Default = true;
2234 if (TC.getTriple().isOSDarwin()) {
2235 // The native darwin assembler doesn't support the linker_option directives,
2236 // so we disable them if we think the .s file will be passed to it.
2237 Default = TC.useIntegratedAs();
2238 }
2239 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2240 Default);
2241}
2242
Ted Kremenek62093662013-03-12 17:02:12 +00002243static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2244 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002245 bool UseDwarfDirectory =
2246 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2247 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002248 return !UseDwarfDirectory;
2249}
2250
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002251/// \brief Check whether the given input tree contains any compilation actions.
2252static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002253 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002254 return true;
2255
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002256 for (const auto &Act : *A)
2257 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002258 return true;
2259
2260 return false;
2261}
2262
2263/// \brief Check if -relax-all should be passed to the internal assembler.
2264/// This is done by default when compiling non-assembler source with -O0.
2265static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2266 bool RelaxDefault = true;
2267
2268 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2269 RelaxDefault = A->getOption().matches(options::OPT_O0);
2270
2271 if (RelaxDefault) {
2272 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002273 for (const auto &Act : C.getActions()) {
2274 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002275 RelaxDefault = true;
2276 break;
2277 }
2278 }
2279 }
2280
2281 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002282 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002283}
2284
David Blaikie9260ed62013-07-25 21:19:01 +00002285static void CollectArgsForIntegratedAssembler(Compilation &C,
2286 const ArgList &Args,
2287 ArgStringList &CmdArgs,
2288 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002289 if (UseRelaxAll(C, Args))
2290 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002291
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002292 // When passing -I arguments to the assembler we sometimes need to
2293 // unconditionally take the next argument. For example, when parsing
2294 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2295 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2296 // arg after parsing the '-I' arg.
2297 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002299 // When using an integrated assembler, translate -Wa, and -Xassembler
2300 // options.
2301 bool CompressDebugSections = false;
2302 for (const Arg *A :
2303 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2304 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002305
Renato Golin7c542b42015-07-27 23:44:45 +00002306 for (const StringRef Value : A->getValues()) {
2307 if (TakeNextArg) {
2308 CmdArgs.push_back(Value.data());
2309 TakeNextArg = false;
2310 continue;
2311 }
David Blaikie9260ed62013-07-25 21:19:01 +00002312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002313 if (Value == "-force_cpusubtype_ALL") {
2314 // Do nothing, this is the default and we don't support anything else.
2315 } else if (Value == "-L") {
2316 CmdArgs.push_back("-msave-temp-labels");
2317 } else if (Value == "--fatal-warnings") {
2318 CmdArgs.push_back("-massembler-fatal-warnings");
2319 } else if (Value == "--noexecstack") {
2320 CmdArgs.push_back("-mnoexecstack");
2321 } else if (Value == "-compress-debug-sections" ||
2322 Value == "--compress-debug-sections") {
2323 CompressDebugSections = true;
2324 } else if (Value == "-nocompress-debug-sections" ||
2325 Value == "--nocompress-debug-sections") {
2326 CompressDebugSections = false;
2327 } else if (Value.startswith("-I")) {
2328 CmdArgs.push_back(Value.data());
2329 // We need to consume the next argument if the current arg is a plain
2330 // -I. The next arg will be the include directory.
2331 if (Value == "-I")
2332 TakeNextArg = true;
2333 } else if (Value.startswith("-gdwarf-")) {
2334 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002335 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2336 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2337 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002338 } else {
2339 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002340 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002341 }
2342 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002343 }
2344 if (CompressDebugSections) {
2345 if (llvm::zlib::isAvailable())
2346 CmdArgs.push_back("-compress-debug-sections");
2347 else
2348 D.Diag(diag::warn_debug_compression_unavailable);
2349 }
David Blaikie9260ed62013-07-25 21:19:01 +00002350}
2351
Renato Goline807c122014-01-31 11:47:28 +00002352// Until ARM libraries are build separately, we have them all in one library
2353static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002354 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002355 TC.getArch() == llvm::Triple::x86)
2356 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002357 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002358 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002359 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002360}
2361
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002362static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2363 // The runtimes are located in the OS-specific resource directory.
2364 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002365 const llvm::Triple &Triple = TC.getTriple();
2366 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002367 StringRef OSLibName =
2368 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002369 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002370 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002371}
2372
Peter Collingbourne581f4382015-07-02 01:48:12 +00002373SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2374 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002375 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2376 ? "-android"
2377 : "";
2378
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002379 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002380 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2381 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002382 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002383 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002384 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002385 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002386
2387 SmallString<128> Path = getCompilerRTLibDir(TC);
2388 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2389 Arch + Env + Suffix);
2390
2391 return Path;
2392}
2393
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002394// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002395// FIXME: Make sure we can also emit shared objects if they're requested
2396// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002397static void addClangRT(const ToolChain &TC, const ArgList &Args,
2398 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002399 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002400}
2401
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002402static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2403 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002404 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2405 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002406 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002407 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002408 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002409 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002410 Args.hasArg(options::OPT_fcreate_profile) ||
2411 Args.hasArg(options::OPT_coverage)))
2412 return;
2413
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002414 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002415}
2416
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002417namespace {
2418enum OpenMPRuntimeKind {
2419 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2420 /// without knowing what runtime to target.
2421 OMPRT_Unknown,
2422
2423 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2424 /// the default for Clang.
2425 OMPRT_OMP,
2426
2427 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2428 /// this runtime but can swallow the pragmas, and find and link against the
2429 /// runtime library itself.
2430 OMPRT_GOMP,
2431
Chandler Carruthc6625c62015-05-28 21:10:31 +00002432 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002433 /// OpenMP runtime. We support this mode for users with existing dependencies
2434 /// on this runtime library name.
2435 OMPRT_IOMP5
2436};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002437}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002438
2439/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002440static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2441 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002442 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2443
2444 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2445 if (A)
2446 RuntimeName = A->getValue();
2447
2448 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002449 .Case("libomp", OMPRT_OMP)
2450 .Case("libgomp", OMPRT_GOMP)
2451 .Case("libiomp5", OMPRT_IOMP5)
2452 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002453
2454 if (RT == OMPRT_Unknown) {
2455 if (A)
2456 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002457 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002458 else
2459 // FIXME: We could use a nicer diagnostic here.
2460 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2461 }
2462
2463 return RT;
2464}
2465
Alexey Samsonov52550342014-09-15 19:58:40 +00002466static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2467 ArgStringList &CmdArgs, StringRef Sanitizer,
2468 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002469 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002470 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002471 if (!IsShared)
2472 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002473 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002474 if (!IsShared)
2475 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002476}
2477
Alexey Samsonov52550342014-09-15 19:58:40 +00002478// Tries to use a file with the list of dynamic symbols that need to be exported
2479// from the runtime library. Returns true if the file was found.
2480static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2481 ArgStringList &CmdArgs,
2482 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002483 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2484 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2485 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002486 return true;
2487 }
2488 return false;
2489}
2490
2491static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2492 ArgStringList &CmdArgs) {
2493 // Force linking against the system libraries sanitizers depends on
2494 // (see PR15823 why this is necessary).
2495 CmdArgs.push_back("--no-as-needed");
2496 CmdArgs.push_back("-lpthread");
2497 CmdArgs.push_back("-lrt");
2498 CmdArgs.push_back("-lm");
2499 // There's no libdl on FreeBSD.
2500 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2501 CmdArgs.push_back("-ldl");
2502}
2503
2504static void
2505collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2506 SmallVectorImpl<StringRef> &SharedRuntimes,
2507 SmallVectorImpl<StringRef> &StaticRuntimes,
2508 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2509 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2510 // Collect shared runtimes.
2511 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2512 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002513 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002514
Alexey Samsonov52550342014-09-15 19:58:40 +00002515 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002516 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002517 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2518 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002519 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002520 }
2521 if (SanArgs.needsAsanRt()) {
2522 if (SanArgs.needsSharedAsanRt()) {
2523 HelperStaticRuntimes.push_back("asan-preinit");
2524 } else {
2525 StaticRuntimes.push_back("asan");
2526 if (SanArgs.linkCXXRuntimes())
2527 StaticRuntimes.push_back("asan_cxx");
2528 }
2529 }
2530 if (SanArgs.needsDfsanRt())
2531 StaticRuntimes.push_back("dfsan");
2532 if (SanArgs.needsLsanRt())
2533 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002534 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002535 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002536 if (SanArgs.linkCXXRuntimes())
2537 StaticRuntimes.push_back("msan_cxx");
2538 }
2539 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002540 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002541 if (SanArgs.linkCXXRuntimes())
2542 StaticRuntimes.push_back("tsan_cxx");
2543 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002544 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002545 StaticRuntimes.push_back("ubsan_standalone");
2546 if (SanArgs.linkCXXRuntimes())
2547 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002548 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002549 if (SanArgs.needsSafeStackRt())
2550 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002551}
2552
Alexey Samsonov52550342014-09-15 19:58:40 +00002553// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2554// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2555static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002556 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002557 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2558 HelperStaticRuntimes;
2559 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2560 HelperStaticRuntimes);
2561 for (auto RT : SharedRuntimes)
2562 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2563 for (auto RT : HelperStaticRuntimes)
2564 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2565 bool AddExportDynamic = false;
2566 for (auto RT : StaticRuntimes) {
2567 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2568 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2569 }
2570 // If there is a static runtime with no dynamic list, force all the symbols
2571 // to be dynamic to be sure we export sanitizer interface functions.
2572 if (AddExportDynamic)
2573 CmdArgs.push_back("-export-dynamic");
2574 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002575}
2576
Reid Kleckner86ea7702015-02-04 23:45:07 +00002577static bool areOptimizationsEnabled(const ArgList &Args) {
2578 // Find the last -O arg and see if it is non-zero.
2579 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2580 return !A->getOption().matches(options::OPT_O0);
2581 // Defaults to -O0.
2582 return false;
2583}
2584
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002585static bool shouldUseFramePointerForTarget(const ArgList &Args,
2586 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002587 // XCore never wants frame pointers, regardless of OS.
2588 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002589 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002590 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002591
2592 if (Triple.isOSLinux()) {
2593 switch (Triple.getArch()) {
2594 // Don't use a frame pointer on linux if optimizing for certain targets.
2595 case llvm::Triple::mips64:
2596 case llvm::Triple::mips64el:
2597 case llvm::Triple::mips:
2598 case llvm::Triple::mipsel:
2599 case llvm::Triple::systemz:
2600 case llvm::Triple::x86:
2601 case llvm::Triple::x86_64:
2602 return !areOptimizationsEnabled(Args);
2603 default:
2604 return true;
2605 }
2606 }
2607
2608 if (Triple.isOSWindows()) {
2609 switch (Triple.getArch()) {
2610 case llvm::Triple::x86:
2611 return !areOptimizationsEnabled(Args);
2612 default:
2613 // All other supported Windows ISAs use xdata unwind information, so frame
2614 // pointers are not generally useful.
2615 return false;
2616 }
2617 }
2618
2619 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002620}
2621
Rafael Espindola224dd632011-12-14 21:02:23 +00002622static bool shouldUseFramePointer(const ArgList &Args,
2623 const llvm::Triple &Triple) {
2624 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2625 options::OPT_fomit_frame_pointer))
2626 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2627
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002628 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002629}
2630
Eric Christopherb7d97e92013-04-03 01:58:53 +00002631static bool shouldUseLeafFramePointer(const ArgList &Args,
2632 const llvm::Triple &Triple) {
2633 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2634 options::OPT_momit_leaf_frame_pointer))
2635 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2636
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002637 if (Triple.isPS4CPU())
2638 return false;
2639
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002640 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002641}
2642
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002643/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002644static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002645 SmallString<128> cwd;
2646 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002647 CmdArgs.push_back("-fdebug-compilation-dir");
2648 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002649 }
2650}
2651
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002652static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002653 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2654 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2655 SmallString<128> T(FinalOutput->getValue());
2656 llvm::sys::path::replace_extension(T, "dwo");
2657 return Args.MakeArgString(T);
2658 } else {
2659 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002660 SmallString<128> T(
2661 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002662 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002663 llvm::sys::path::replace_extension(F, "dwo");
2664 T += F;
2665 return Args.MakeArgString(F);
2666 }
2667}
2668
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002669static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2670 const JobAction &JA, const ArgList &Args,
2671 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002672 ArgStringList ExtractArgs;
2673 ExtractArgs.push_back("--extract-dwo");
2674
2675 ArgStringList StripArgs;
2676 StripArgs.push_back("--strip-dwo");
2677
2678 // Grabbing the output of the earlier compile step.
2679 StripArgs.push_back(Output.getFilename());
2680 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002681 ExtractArgs.push_back(OutFile);
2682
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002683 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002684 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002685
2686 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002687 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002688
2689 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002690 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002691}
2692
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002693/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002694/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2695static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002696 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002697 if (A->getOption().matches(options::OPT_O4) ||
2698 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002699 return true;
2700
2701 if (A->getOption().matches(options::OPT_O0))
2702 return false;
2703
2704 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2705
Rafael Espindola91780de2013-08-26 14:05:41 +00002706 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002707 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002708 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002709 return true;
2710
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002711 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002712 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002713 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002714
2715 unsigned OptLevel = 0;
2716 if (S.getAsInteger(10, OptLevel))
2717 return false;
2718
2719 return OptLevel > 1;
2720 }
2721
2722 return false;
2723}
2724
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002725/// Add -x lang to \p CmdArgs for \p Input.
2726static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2727 ArgStringList &CmdArgs) {
2728 // When using -verify-pch, we don't want to provide the type
2729 // 'precompiled-header' if it was inferred from the file extension
2730 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2731 return;
2732
2733 CmdArgs.push_back("-x");
2734 if (Args.hasArg(options::OPT_rewrite_objc))
2735 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2736 else
2737 CmdArgs.push_back(types::getTypeName(Input.getType()));
2738}
2739
David Majnemerc371ff02015-03-22 08:39:22 +00002740static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002741 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002742 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002743
2744 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002745 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002746
2747 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002748 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002749 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002750 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002751}
2752
Rafael Espindola577637a2015-01-03 00:06:04 +00002753// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002754// options that build systems might add but are unused when assembling or only
2755// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002756static void claimNoWarnArgs(const ArgList &Args) {
2757 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002758 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002759 Args.ClaimAllArgs(options::OPT_flto);
2760 Args.ClaimAllArgs(options::OPT_fno_lto);
2761}
2762
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002763static void appendUserToPath(SmallVectorImpl<char> &Result) {
2764#ifdef LLVM_ON_UNIX
2765 const char *Username = getenv("LOGNAME");
2766#else
2767 const char *Username = getenv("USERNAME");
2768#endif
2769 if (Username) {
2770 // Validate that LoginName can be used in a path, and get its length.
2771 size_t Len = 0;
2772 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002773 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002774 Username = nullptr;
2775 break;
2776 }
2777 }
2778
2779 if (Username && Len > 0) {
2780 Result.append(Username, Username + Len);
2781 return;
2782 }
2783 }
2784
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002785// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002786#ifdef LLVM_ON_UNIX
2787 std::string UID = llvm::utostr(getuid());
2788#else
2789 // FIXME: Windows seems to have an 'SID' that might work.
2790 std::string UID = "9999";
2791#endif
2792 Result.append(UID.begin(), UID.end());
2793}
2794
David Majnemere11d3732015-06-08 00:22:46 +00002795VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2796 const llvm::Triple &Triple,
2797 const llvm::opt::ArgList &Args,
2798 bool IsWindowsMSVC) {
2799 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2800 IsWindowsMSVC) ||
2801 Args.hasArg(options::OPT_fmsc_version) ||
2802 Args.hasArg(options::OPT_fms_compatibility_version)) {
2803 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2804 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002805 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002806
2807 if (MSCVersion && MSCompatibilityVersion) {
2808 if (D)
2809 D->Diag(diag::err_drv_argument_not_allowed_with)
2810 << MSCVersion->getAsString(Args)
2811 << MSCompatibilityVersion->getAsString(Args);
2812 return VersionTuple();
2813 }
2814
2815 if (MSCompatibilityVersion) {
2816 VersionTuple MSVT;
2817 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2818 D->Diag(diag::err_drv_invalid_value)
2819 << MSCompatibilityVersion->getAsString(Args)
2820 << MSCompatibilityVersion->getValue();
2821 return MSVT;
2822 }
2823
2824 if (MSCVersion) {
2825 unsigned Version = 0;
2826 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2827 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2828 << MSCVersion->getValue();
2829 return getMSCompatibilityVersion(Version);
2830 }
2831
2832 unsigned Major, Minor, Micro;
2833 Triple.getEnvironmentVersion(Major, Minor, Micro);
2834 if (Major || Minor || Micro)
2835 return VersionTuple(Major, Minor, Micro);
2836
2837 return VersionTuple(18);
2838 }
2839 return VersionTuple();
2840}
2841
Diego Novilloa0545962015-07-10 18:00:07 +00002842static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2843 const InputInfo &Output, const ArgList &Args,
2844 ArgStringList &CmdArgs) {
2845 auto *ProfileGenerateArg = Args.getLastArg(
2846 options::OPT_fprofile_instr_generate,
2847 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002848 options::OPT_fprofile_generate_EQ,
2849 options::OPT_fno_profile_instr_generate);
2850 if (ProfileGenerateArg &&
2851 ProfileGenerateArg->getOption().matches(
2852 options::OPT_fno_profile_instr_generate))
2853 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002854
2855 auto *ProfileUseArg = Args.getLastArg(
2856 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002857 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2858 options::OPT_fno_profile_instr_use);
2859 if (ProfileUseArg &&
2860 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2861 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002862
2863 if (ProfileGenerateArg && ProfileUseArg)
2864 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002865 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002866
Diego Novillo758f3f52015-08-05 21:49:51 +00002867 if (ProfileGenerateArg) {
2868 if (ProfileGenerateArg->getOption().matches(
2869 options::OPT_fprofile_instr_generate_EQ))
2870 ProfileGenerateArg->render(Args, CmdArgs);
2871 else if (ProfileGenerateArg->getOption().matches(
2872 options::OPT_fprofile_generate_EQ)) {
2873 SmallString<128> Path(ProfileGenerateArg->getValue());
2874 llvm::sys::path::append(Path, "default.profraw");
2875 CmdArgs.push_back(
2876 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2877 } else
2878 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2879 }
Diego Novilloa0545962015-07-10 18:00:07 +00002880
Diego Novillo758f3f52015-08-05 21:49:51 +00002881 if (ProfileUseArg) {
2882 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2883 ProfileUseArg->render(Args, CmdArgs);
2884 else if ((ProfileUseArg->getOption().matches(
2885 options::OPT_fprofile_use_EQ) ||
2886 ProfileUseArg->getOption().matches(
2887 options::OPT_fprofile_instr_use))) {
2888 SmallString<128> Path(
2889 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2890 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2891 llvm::sys::path::append(Path, "default.profdata");
2892 CmdArgs.push_back(
2893 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2894 }
Diego Novilloa0545962015-07-10 18:00:07 +00002895 }
2896
2897 if (Args.hasArg(options::OPT_ftest_coverage) ||
2898 Args.hasArg(options::OPT_coverage))
2899 CmdArgs.push_back("-femit-coverage-notes");
2900 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2901 false) ||
2902 Args.hasArg(options::OPT_coverage))
2903 CmdArgs.push_back("-femit-coverage-data");
2904
Diego Novilloc4b94da2015-08-05 23:27:40 +00002905 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2906 options::OPT_fno_coverage_mapping, false) &&
2907 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002908 D.Diag(diag::err_drv_argument_only_allowed_with)
2909 << "-fcoverage-mapping"
2910 << "-fprofile-instr-generate";
2911
Diego Novilloc4b94da2015-08-05 23:27:40 +00002912 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2913 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002914 CmdArgs.push_back("-fcoverage-mapping");
2915
2916 if (C.getArgs().hasArg(options::OPT_c) ||
2917 C.getArgs().hasArg(options::OPT_S)) {
2918 if (Output.isFilename()) {
2919 CmdArgs.push_back("-coverage-file");
2920 SmallString<128> CoverageFilename;
2921 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2922 CoverageFilename = FinalOutput->getValue();
2923 } else {
2924 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2925 }
2926 if (llvm::sys::path::is_relative(CoverageFilename)) {
2927 SmallString<128> Pwd;
2928 if (!llvm::sys::fs::current_path(Pwd)) {
2929 llvm::sys::path::append(Pwd, CoverageFilename);
2930 CoverageFilename.swap(Pwd);
2931 }
2932 }
2933 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2934 }
2935 }
2936}
2937
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002938/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2939/// smooshes them together with platform defaults, to decide whether
2940/// this compile should be using PIC mode or not. Returns a tuple of
2941/// (RelocationModel, PICLevel, IsPIE).
2942static std::tuple<llvm::Reloc::Model, unsigned, bool>
2943ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
2944 const ArgList &Args) {
2945 // FIXME: why does this code...and so much everywhere else, use both
2946 // ToolChain.getTriple() and Triple?
2947 bool PIE = ToolChain.isPIEDefault();
2948 bool PIC = PIE || ToolChain.isPICDefault();
2949 bool IsPICLevelTwo = PIC;
2950
2951 bool KernelOrKext =
2952 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2953
2954 // Android-specific defaults for PIC/PIE
2955 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
2956 switch (ToolChain.getArch()) {
2957 case llvm::Triple::arm:
2958 case llvm::Triple::armeb:
2959 case llvm::Triple::thumb:
2960 case llvm::Triple::thumbeb:
2961 case llvm::Triple::aarch64:
2962 case llvm::Triple::mips:
2963 case llvm::Triple::mipsel:
2964 case llvm::Triple::mips64:
2965 case llvm::Triple::mips64el:
2966 PIC = true; // "-fpic"
2967 break;
2968
2969 case llvm::Triple::x86:
2970 case llvm::Triple::x86_64:
2971 PIC = true; // "-fPIC"
2972 IsPICLevelTwo = true;
2973 break;
2974
2975 default:
2976 break;
2977 }
2978 }
2979
2980 // OpenBSD-specific defaults for PIE
2981 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
2982 switch (ToolChain.getArch()) {
2983 case llvm::Triple::mips64:
2984 case llvm::Triple::mips64el:
2985 case llvm::Triple::sparcel:
2986 case llvm::Triple::x86:
2987 case llvm::Triple::x86_64:
2988 IsPICLevelTwo = false; // "-fpie"
2989 break;
2990
2991 case llvm::Triple::ppc:
2992 case llvm::Triple::sparc:
2993 case llvm::Triple::sparcv9:
2994 IsPICLevelTwo = true; // "-fPIE"
2995 break;
2996
2997 default:
2998 break;
2999 }
3000 }
3001
3002 // The last argument relating to either PIC or PIE wins, and no
3003 // other argument is used. If the last argument is any flavor of the
3004 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3005 // option implicitly enables PIC at the same level.
3006 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3007 options::OPT_fpic, options::OPT_fno_pic,
3008 options::OPT_fPIE, options::OPT_fno_PIE,
3009 options::OPT_fpie, options::OPT_fno_pie);
3010 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3011 // is forced, then neither PIC nor PIE flags will have no effect.
3012 if (!ToolChain.isPICDefaultForced()) {
3013 if (LastPICArg) {
3014 Option O = LastPICArg->getOption();
3015 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3016 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3017 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3018 PIC =
3019 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3020 IsPICLevelTwo =
3021 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3022 } else {
3023 PIE = PIC = false;
3024 }
3025 }
3026 }
3027
3028 // Introduce a Darwin-specific hack. If the default is PIC, but the
3029 // PIC level would've been set to level 1, force it back to level 2
3030 // PIC instead. This matches the behavior of Darwin GCC (based on
3031 // chandlerc's informal testing in 2012).
3032 if (PIC && ToolChain.getTriple().isOSDarwin())
3033 IsPICLevelTwo |= ToolChain.isPICDefault();
3034
James Y Knightc4015d32015-08-21 04:14:55 +00003035 // This kernel flags are a trump-card: they will disable PIC/PIE
3036 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003037 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3038 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003039
3040 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3041 // This is a very special mode. It trumps the other modes, almost no one
3042 // uses it, and it isn't even valid on any OS but Darwin.
3043 if (!ToolChain.getTriple().isOSDarwin())
3044 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3045 << A->getSpelling() << ToolChain.getTriple().str();
3046
3047 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3048
3049 // Only a forced PIC mode can cause the actual compile to have PIC defines
3050 // etc., no flags are sufficient. This behavior was selected to closely
3051 // match that of llvm-gcc and Apple GCC before that.
3052 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3053
3054 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3055 }
3056
3057 if (PIC)
3058 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3059
3060 return std::make_tuple(llvm::Reloc::Static, 0, false);
3061}
3062
3063static const char *RelocationModelName(llvm::Reloc::Model Model) {
3064 switch (Model) {
3065 case llvm::Reloc::Default:
3066 return nullptr;
3067 case llvm::Reloc::Static:
3068 return "static";
3069 case llvm::Reloc::PIC_:
3070 return "pic";
3071 case llvm::Reloc::DynamicNoPIC:
3072 return "dynamic-no-pic";
3073 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003074 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003075}
3076
3077static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3078 ArgStringList &CmdArgs) {
3079 llvm::Reloc::Model RelocationModel;
3080 unsigned PICLevel;
3081 bool IsPIE;
3082 std::tie(RelocationModel, PICLevel, IsPIE) =
3083 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3084
3085 if (RelocationModel != llvm::Reloc::Static)
3086 CmdArgs.push_back("-KPIC");
3087}
3088
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003089void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003090 const InputInfo &Output, const InputInfoList &Inputs,
3091 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003092 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3093 const llvm::Triple Triple(TripleStr);
3094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003095 bool KernelOrKext =
3096 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003097 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003098 ArgStringList CmdArgs;
3099
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003100 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003101 bool IsWindowsCygnus =
3102 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003103 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3104
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003105 // Check number of inputs for sanity. We need at least one input.
3106 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003107 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003108 // CUDA compilation may have multiple inputs (source file + results of
3109 // device-side compilations). All other jobs are expected to have exactly one
3110 // input.
3111 bool IsCuda = types::isCuda(Input.getType());
3112 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003113
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003114 // Invoke ourselves in -cc1 mode.
3115 //
3116 // FIXME: Implement custom jobs for internal actions.
3117 CmdArgs.push_back("-cc1");
3118
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003119 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003120 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003121 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003122
James Y Knight2db38f32015-08-15 03:45:25 +00003123 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3124 Triple.getArch() == llvm::Triple::thumb)) {
3125 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003126 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003127 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003128 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003129 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003130 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003131 }
3132
Tim Northover336f1892014-03-29 13:16:12 +00003133 // Push all default warning arguments that are specific to
3134 // the given target. These come before user provided warning options
3135 // are provided.
3136 getToolChain().addClangWarningOptions(CmdArgs);
3137
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003138 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003139 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003140
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003141 if (isa<AnalyzeJobAction>(JA)) {
3142 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3143 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003144 } else if (isa<MigrateJobAction>(JA)) {
3145 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003146 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003147 if (Output.getType() == types::TY_Dependencies)
3148 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003149 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003150 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003151 if (Args.hasArg(options::OPT_rewrite_objc) &&
3152 !Args.hasArg(options::OPT_g_Group))
3153 CmdArgs.push_back("-P");
3154 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003155 } else if (isa<AssembleJobAction>(JA)) {
3156 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003157
David Blaikie9260ed62013-07-25 21:19:01 +00003158 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003159
3160 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003161 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003162 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003163 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003164 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003165
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003166 if (JA.getType() == types::TY_Nothing)
3167 CmdArgs.push_back("-fsyntax-only");
3168 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003169 CmdArgs.push_back("-emit-pch");
3170 else
3171 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003172 } else if (isa<VerifyPCHJobAction>(JA)) {
3173 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003174 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003175 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3176 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003177
Renato Golin7c542b42015-07-27 23:44:45 +00003178 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003179 CmdArgs.push_back("-flto");
3180 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003181 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003182 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003183 } else if (JA.getType() == types::TY_LLVM_IR ||
3184 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003185 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003186 } else if (JA.getType() == types::TY_LLVM_BC ||
3187 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003188 CmdArgs.push_back("-emit-llvm-bc");
3189 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003190 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003191 } else if (JA.getType() == types::TY_AST) {
3192 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003193 } else if (JA.getType() == types::TY_ModuleFile) {
3194 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003195 } else if (JA.getType() == types::TY_RewrittenObjC) {
3196 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003197 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003198 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3199 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003200 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003201 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003202 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003203 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003204
3205 // Preserve use-list order by default when emitting bitcode, so that
3206 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3207 // same result as running passes here. For LTO, we don't need to preserve
3208 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003209 if (JA.getType() == types::TY_LLVM_BC)
3210 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003211 }
3212
Justin Bognera88f0122014-06-20 22:59:50 +00003213 // We normally speed up the clang process a bit by skipping destructors at
3214 // exit, but when we're generating diagnostics we can rely on some of the
3215 // cleanup.
3216 if (!C.isForDiagnostics())
3217 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003218
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003219// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003220#ifdef NDEBUG
3221 CmdArgs.push_back("-disable-llvm-verifier");
3222#endif
3223
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003224 // Set the main file name, so that debug info works even with
3225 // -save-temps.
3226 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003227 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003228
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003229 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003230 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003231 if (Args.hasArg(options::OPT_static))
3232 CmdArgs.push_back("-static-define");
3233
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003234 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003235 // Enable region store model by default.
3236 CmdArgs.push_back("-analyzer-store=region");
3237
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003238 // Treat blocks as analysis entry points.
3239 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3240
Ted Kremenek49c79792011-03-24 00:28:47 +00003241 CmdArgs.push_back("-analyzer-eagerly-assume");
3242
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003243 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003244 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003245 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003246
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003247 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003248 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003249
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003250 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003251 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003252
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003253 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003254
Artem Belevichba558952015-05-06 18:20:23 +00003255 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003256 CmdArgs.push_back("-analyzer-checker=cplusplus");
3257
Nico Webere8e53112014-05-11 01:04:02 +00003258 // Enable the following experimental checkers for testing.
3259 CmdArgs.push_back(
3260 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003261 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3262 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003263 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003264 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3265 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003266 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003267
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003268 // Set the output format. The default is plist, for (lame) historical
3269 // reasons.
3270 CmdArgs.push_back("-analyzer-output");
3271 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003272 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003273 else
3274 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003275
Ted Kremenekfe449a22010-03-22 22:32:05 +00003276 // Disable the presentation of standard compiler warnings when
3277 // using --analyze. We only want to show static analyzer diagnostics
3278 // or frontend errors.
3279 CmdArgs.push_back("-w");
3280
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003281 // Add -Xanalyzer arguments when running as analyzer.
3282 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003283 }
3284
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003285 CheckCodeGenerationOptions(D, Args);
3286
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003287 llvm::Reloc::Model RelocationModel;
3288 unsigned PICLevel;
3289 bool IsPIE;
3290 std::tie(RelocationModel, PICLevel, IsPIE) =
3291 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003292
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003293 const char *RMName = RelocationModelName(RelocationModel);
3294 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003295 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003296 CmdArgs.push_back(RMName);
3297 }
3298 if (PICLevel > 0) {
3299 CmdArgs.push_back("-pic-level");
3300 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3301 if (IsPIE) {
3302 CmdArgs.push_back("-pie-level");
3303 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003304 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003305 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003306
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003307 CmdArgs.push_back("-mthread-model");
3308 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3309 CmdArgs.push_back(A->getValue());
3310 else
3311 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3312
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003313 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3314
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003315 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3316 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003317 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003318
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003319 // LLVM Code Generator Options.
3320
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003321 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3322 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003323 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3324 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003325 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003326 CmdArgs.push_back(A->getValue());
3327 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003328 }
3329 }
3330
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003331 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3332 StringRef v = A->getValue();
3333 CmdArgs.push_back("-mllvm");
3334 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3335 A->claim();
3336 }
3337
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003338 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3339 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003340 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003341 }
3342
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003343 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3344 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003345 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003346 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003347 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003348 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3349 CmdArgs.push_back("-fpcc-struct-return");
3350 } else {
3351 assert(A->getOption().matches(options::OPT_freg_struct_return));
3352 CmdArgs.push_back("-freg-struct-return");
3353 }
3354 }
3355
Roman Divacky65b88cd2011-03-01 17:40:53 +00003356 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3357 CmdArgs.push_back("-mrtd");
3358
Rafael Espindola224dd632011-12-14 21:02:23 +00003359 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003360 CmdArgs.push_back("-mdisable-fp-elim");
3361 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3362 options::OPT_fno_zero_initialized_in_bss))
3363 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003364
3365 bool OFastEnabled = isOptimizationLevelFast(Args);
3366 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3367 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003368 OptSpecifier StrictAliasingAliasOption =
3369 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003370 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3371 // doesn't do any TBAA.
3372 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003373 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003374 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003375 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003376 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3377 options::OPT_fno_struct_path_tbaa))
3378 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003379 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3380 false))
3381 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003382 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3383 options::OPT_fno_optimize_sibling_calls))
3384 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003385
Eric Christopher006208c2013-04-04 06:29:47 +00003386 // Handle segmented stacks.
3387 if (Args.hasArg(options::OPT_fsplit_stack))
3388 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003389
3390 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3391 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003392 OptSpecifier FastMathAliasOption =
3393 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3394
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003395 // Handle various floating point optimization flags, mapping them to the
3396 // appropriate LLVM code generation flags. The pattern for all of these is to
3397 // default off the codegen optimizations, and if any flag enables them and no
3398 // flag disables them after the flag enabling them, enable the codegen
3399 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003400 if (Arg *A = Args.getLastArg(
3401 options::OPT_ffast_math, FastMathAliasOption,
3402 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3403 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3404 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003405 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3406 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003407 A->getOption().getID() != options::OPT_fhonor_infinities)
3408 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003409 if (Arg *A = Args.getLastArg(
3410 options::OPT_ffast_math, FastMathAliasOption,
3411 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3412 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3413 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003414 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3415 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003416 A->getOption().getID() != options::OPT_fhonor_nans)
3417 CmdArgs.push_back("-menable-no-nans");
3418
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003419 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3420 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003421 if (Arg *A =
3422 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3423 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3424 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003425 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3426 // However, turning *off* -ffast_math merely restores the toolchain default
3427 // (which may be false).
3428 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3429 A->getOption().getID() == options::OPT_ffast_math ||
3430 A->getOption().getID() == options::OPT_Ofast)
3431 MathErrno = false;
3432 else if (A->getOption().getID() == options::OPT_fmath_errno)
3433 MathErrno = true;
3434 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003435 if (MathErrno)
3436 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003437
3438 // There are several flags which require disabling very specific
3439 // optimizations. Any of these being disabled forces us to turn off the
3440 // entire set of LLVM optimizations, so collect them through all the flag
3441 // madness.
3442 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003443 if (Arg *A = Args.getLastArg(
3444 options::OPT_ffast_math, FastMathAliasOption,
3445 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3446 options::OPT_fno_unsafe_math_optimizations,
3447 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003448 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3449 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003450 A->getOption().getID() != options::OPT_fno_associative_math)
3451 AssociativeMath = true;
3452 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003453 if (Arg *A = Args.getLastArg(
3454 options::OPT_ffast_math, FastMathAliasOption,
3455 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3456 options::OPT_fno_unsafe_math_optimizations,
3457 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003458 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3459 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003460 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3461 ReciprocalMath = true;
3462 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003463 if (Arg *A = Args.getLastArg(
3464 options::OPT_ffast_math, FastMathAliasOption,
3465 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3466 options::OPT_fno_unsafe_math_optimizations,
3467 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003468 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3469 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003470 A->getOption().getID() != options::OPT_fsigned_zeros)
3471 SignedZeros = false;
3472 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003473 if (Arg *A = Args.getLastArg(
3474 options::OPT_ffast_math, FastMathAliasOption,
3475 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3476 options::OPT_fno_unsafe_math_optimizations,
3477 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003478 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3479 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003480 A->getOption().getID() != options::OPT_ftrapping_math)
3481 TrappingMath = false;
3482 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3483 !TrappingMath)
3484 CmdArgs.push_back("-menable-unsafe-fp-math");
3485
Sanjay Patel76c9e092015-01-23 16:40:50 +00003486 if (!SignedZeros)
3487 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003488
Sanjay Patel359b1052015-04-09 15:03:23 +00003489 if (ReciprocalMath)
3490 CmdArgs.push_back("-freciprocal-math");
3491
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003492 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003493 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003494 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003495 options::OPT_ffp_contract)) {
3496 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003497 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003498 if (Val == "fast" || Val == "on" || Val == "off") {
3499 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3500 } else {
3501 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003502 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003503 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003504 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3505 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003506 // If fast-math is set then set the fp-contract mode to fast.
3507 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3508 }
3509 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003510
Sanjay Patel2987c292015-06-11 14:53:41 +00003511 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003512
Bob Wilson6a039162012-07-19 03:52:53 +00003513 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3514 // and if we find them, tell the frontend to provide the appropriate
3515 // preprocessor macros. This is distinct from enabling any optimizations as
3516 // these options induce language changes which must survive serialization
3517 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003518 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3519 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003520 if (!A->getOption().matches(options::OPT_fno_fast_math))
3521 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003522 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3523 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003524 if (A->getOption().matches(options::OPT_ffinite_math_only))
3525 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003526
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003527 // Decide whether to use verbose asm. Verbose assembly is the default on
3528 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003529 bool IsIntegratedAssemblerDefault =
3530 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003531 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003532 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003533 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003534 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003535
Rafael Espindolab8a12932015-05-22 20:44:03 +00003536 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3537 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003538 CmdArgs.push_back("-no-integrated-as");
3539
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003540 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3541 CmdArgs.push_back("-mdebug-pass");
3542 CmdArgs.push_back("Structure");
3543 }
3544 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3545 CmdArgs.push_back("-mdebug-pass");
3546 CmdArgs.push_back("Arguments");
3547 }
3548
John McCall8517abc2010-02-19 02:45:38 +00003549 // Enable -mconstructor-aliases except on darwin, where we have to
3550 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003551 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003552 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003553
John McCall7ef5cb32011-03-18 02:56:14 +00003554 // Darwin's kernel doesn't support guard variables; just die if we
3555 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003556 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003557 CmdArgs.push_back("-fforbid-guard-variables");
3558
Douglas Gregordbe39272011-02-01 15:15:22 +00003559 if (Args.hasArg(options::OPT_mms_bitfields)) {
3560 CmdArgs.push_back("-mms-bitfields");
3561 }
John McCall8517abc2010-02-19 02:45:38 +00003562
Daniel Dunbar306945d2009-09-16 06:17:29 +00003563 // This is a coarse approximation of what llvm-gcc actually does, both
3564 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3565 // complicated ways.
3566 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003567 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3568 options::OPT_fno_asynchronous_unwind_tables,
3569 (getToolChain().IsUnwindTablesDefault() ||
3570 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3571 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003572 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3573 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003574 CmdArgs.push_back("-munwind-tables");
3575
Chandler Carruth05fb5852012-11-21 23:40:23 +00003576 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003577
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003578 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3579 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003580 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003581 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003582
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003583 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003584 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003585
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003586 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003587 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003588 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003589 }
3590
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003591 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003592 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003593 if (!CPU.empty()) {
3594 CmdArgs.push_back("-target-cpu");
3595 CmdArgs.push_back(Args.MakeArgString(CPU));
3596 }
3597
Rafael Espindolaeb265472013-08-21 21:59:03 +00003598 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3599 CmdArgs.push_back("-mfpmath");
3600 CmdArgs.push_back(A->getValue());
3601 }
3602
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003603 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003604 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003605
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003606 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003607 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003608 default:
3609 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003610
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003611 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003612 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003613 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003614 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003615 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003616 break;
3617
Tim Northover573cbee2014-05-24 12:52:07 +00003618 case llvm::Triple::aarch64:
3619 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003620 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003621 break;
3622
Eric Christopher0b26a612010-03-02 02:41:08 +00003623 case llvm::Triple::mips:
3624 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003625 case llvm::Triple::mips64:
3626 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003627 AddMIPSTargetArgs(Args, CmdArgs);
3628 break;
3629
Ulrich Weigand8afad612014-07-28 13:17:52 +00003630 case llvm::Triple::ppc:
3631 case llvm::Triple::ppc64:
3632 case llvm::Triple::ppc64le:
3633 AddPPCTargetArgs(Args, CmdArgs);
3634 break;
3635
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003636 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003637 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003638 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003639 AddSparcTargetArgs(Args, CmdArgs);
3640 break;
3641
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003642 case llvm::Triple::x86:
3643 case llvm::Triple::x86_64:
3644 AddX86TargetArgs(Args, CmdArgs);
3645 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003646
3647 case llvm::Triple::hexagon:
3648 AddHexagonTargetArgs(Args, CmdArgs);
3649 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003650 }
3651
Hans Wennborg75958c42013-08-08 00:17:41 +00003652 // Add clang-cl arguments.
3653 if (getToolChain().getDriver().IsCLMode())
3654 AddClangCLArgs(Args, CmdArgs);
3655
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003656 // Pass the linker version in use.
3657 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3658 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003659 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003660 }
3661
Eric Christopherb7d97e92013-04-03 01:58:53 +00003662 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003663 CmdArgs.push_back("-momit-leaf-frame-pointer");
3664
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003665 // Explicitly error on some things we know we don't support and can't just
3666 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003667 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003668 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3669 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003670 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003671 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003672 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3673 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003674 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003675 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003676 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003677 }
3678
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003679 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003680 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003681 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003682 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003683 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3684 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003685 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003686 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003687 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003688
Chad Rosierbe10f982011-08-02 17:58:04 +00003689 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003690 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003691 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3692 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003693 }
3694
Manman Ren17bdb0f2013-11-20 20:22:14 +00003695 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3696 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003697 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003698 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003699 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003700 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3701 A->getOption().matches(options::OPT_g1)) &&
3702 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003703 // FIXME: we should support specifying dwarf version with
3704 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003705 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003706 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003707 const llvm::Triple &Triple = getToolChain().getTriple();
3708 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003709 Triple.getOS() == llvm::Triple::FreeBSD ||
3710 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003711 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003712 SplitDwarfArg = nullptr;
Manman Ren17bdb0f2013-11-20 20:22:14 +00003713 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003714 CmdArgs.push_back("-gdwarf-2");
3715 else if (A->getOption().matches(options::OPT_gdwarf_3))
3716 CmdArgs.push_back("-gdwarf-3");
3717 else if (A->getOption().matches(options::OPT_gdwarf_4))
3718 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003719 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003720 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003721 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003722 const llvm::Triple &Triple = getToolChain().getTriple();
3723 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003724 Triple.getOS() == llvm::Triple::FreeBSD ||
3725 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003726 CmdArgs.push_back("-gdwarf-2");
3727 else
3728 CmdArgs.push_back("-g");
3729 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003730 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003731
Reid Kleckner124955a2015-08-05 18:51:13 +00003732 // Forward -gcodeview.
3733 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3734
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003735 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3736 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003737 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3738 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003739 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003740
Eric Christopher138c32b2013-09-13 22:37:55 +00003741 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003742 if (Args.hasArg(options::OPT_gmodules)) {
3743 CmdArgs.push_back("-g");
3744 CmdArgs.push_back("-dwarf-ext-refs");
3745 CmdArgs.push_back("-fmodule-format=obj");
3746 }
3747
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003748 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3749 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003750 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003751 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003752 CmdArgs.push_back("-g");
3753 CmdArgs.push_back("-backend-option");
3754 CmdArgs.push_back("-split-dwarf=Enable");
3755 }
3756
Eric Christopher138c32b2013-09-13 22:37:55 +00003757 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3758 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3759 CmdArgs.push_back("-backend-option");
3760 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3761 }
Eric Christophereec89c22013-06-18 00:03:50 +00003762
Eric Christopher0d403d22014-02-14 01:27:03 +00003763 // -gdwarf-aranges turns on the emission of the aranges section in the
3764 // backend.
3765 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3766 CmdArgs.push_back("-backend-option");
3767 CmdArgs.push_back("-generate-arange-section");
3768 }
3769
David Blaikief36d9ba2014-01-27 18:52:43 +00003770 if (Args.hasFlag(options::OPT_fdebug_types_section,
3771 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003772 CmdArgs.push_back("-backend-option");
3773 CmdArgs.push_back("-generate-type-units");
3774 }
Eric Christophereec89c22013-06-18 00:03:50 +00003775
Ed Schouten6e576152015-03-26 17:50:28 +00003776 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3777 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3778
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003779 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003780 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003781 CmdArgs.push_back("-ffunction-sections");
3782 }
3783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003784 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3785 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003786 CmdArgs.push_back("-fdata-sections");
3787 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003788
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003789 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003790 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003791 CmdArgs.push_back("-fno-unique-section-names");
3792
Chris Lattner3c77a352010-06-22 00:03:40 +00003793 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3794
Diego Novilloa0545962015-07-10 18:00:07 +00003795 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003796
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003797 // Pass options for controlling the default header search paths.
3798 if (Args.hasArg(options::OPT_nostdinc)) {
3799 CmdArgs.push_back("-nostdsysteminc");
3800 CmdArgs.push_back("-nobuiltininc");
3801 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003802 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003803 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003804 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3805 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3806 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003807
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003808 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003809 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003810 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003811
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003812 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3813
Ted Kremenekf7639e12012-03-06 20:06:33 +00003814 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003815 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003816 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003817 options::OPT_ccc_arcmt_modify,
3818 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003819 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003820 switch (A->getOption().getID()) {
3821 default:
3822 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003823 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003824 CmdArgs.push_back("-arcmt-check");
3825 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003826 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003827 CmdArgs.push_back("-arcmt-modify");
3828 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003829 case options::OPT_ccc_arcmt_migrate:
3830 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003831 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003832 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003833
3834 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3835 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003836 break;
John McCalld70fb982011-06-15 23:25:17 +00003837 }
3838 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003839 } else {
3840 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3841 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3842 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003843 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003844
Ted Kremenekf7639e12012-03-06 20:06:33 +00003845 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3846 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003847 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3848 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003849 }
3850 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003851 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003852
3853 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003854 options::OPT_objcmt_migrate_subscripting,
3855 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003856 // None specified, means enable them all.
3857 CmdArgs.push_back("-objcmt-migrate-literals");
3858 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003859 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003860 } else {
3861 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3862 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003863 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003864 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003865 } else {
3866 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3867 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3868 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3869 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3870 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3871 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003872 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003873 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3874 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3875 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3876 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3877 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3878 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3879 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003880 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003881 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003882 }
3883
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003884 // Add preprocessing options like -I, -D, etc. if we are using the
3885 // preprocessor.
3886 //
3887 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003888 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003889 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003890
Rafael Espindolaa7431922011-07-21 23:40:37 +00003891 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3892 // that "The compiler can only warn and ignore the option if not recognized".
3893 // When building with ccache, it will pass -D options to clang even on
3894 // preprocessed inputs and configure concludes that -fPIC is not supported.
3895 Args.ClaimAllArgs(options::OPT_D);
3896
Alp Toker7874bdc2013-11-15 20:40:58 +00003897 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003898 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3899 if (A->getOption().matches(options::OPT_O4)) {
3900 CmdArgs.push_back("-O3");
3901 D.Diag(diag::warn_O4_is_O3);
3902 } else {
3903 A->render(Args, CmdArgs);
3904 }
3905 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003906
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003907 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003908 for (const Arg *A :
3909 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3910 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003911 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003912 }
3913
Rafael Espindola577637a2015-01-03 00:06:04 +00003914 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003915
Richard Smith3be1cb22014-08-07 00:24:21 +00003916 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003917 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003918 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3919 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003920 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003921 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003922
3923 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003924 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003925 //
3926 // If a std is supplied, only add -trigraphs if it follows the
3927 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003928 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003929 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3930 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003931 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003932 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003933 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003934 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003935 else
3936 Std->render(Args, CmdArgs);
3937
Nico Weber00721502014-12-23 22:32:37 +00003938 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003939 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003940 options::OPT_ftrigraphs,
3941 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003942 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003943 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003944 } else {
3945 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003946 //
3947 // FIXME: Clang doesn't correctly handle -std= when the input language
3948 // doesn't match. For the time being just ignore this for C++ inputs;
3949 // eventually we want to do all the standard defaulting here instead of
3950 // splitting it between the driver and clang -cc1.
3951 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003952 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3953 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003954 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003955 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003956
Nico Weber00721502014-12-23 22:32:37 +00003957 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3958 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003959 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003960
Richard Smith282b4492013-09-04 22:50:31 +00003961 // GCC's behavior for -Wwrite-strings is a bit strange:
3962 // * In C, this "warning flag" changes the types of string literals from
3963 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3964 // for the discarded qualifier.
3965 // * In C++, this is just a normal warning flag.
3966 //
3967 // Implementing this warning correctly in C is hard, so we follow GCC's
3968 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3969 // a non-const char* in C, rather than using this crude hack.
3970 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003971 // FIXME: This should behave just like a warning flag, and thus should also
3972 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3973 Arg *WriteStrings =
3974 Args.getLastArg(options::OPT_Wwrite_strings,
3975 options::OPT_Wno_write_strings, options::OPT_w);
3976 if (WriteStrings &&
3977 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003978 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003979 }
3980
Chandler Carruth61fbf622011-04-23 09:27:53 +00003981 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003982 // during C++ compilation, which it is by default. GCC keeps this define even
3983 // in the presence of '-w', match this behavior bug-for-bug.
3984 if (types::isCXX(InputType) &&
3985 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3986 true)) {
3987 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003988 }
3989
Chandler Carruthe0391482010-05-22 02:21:53 +00003990 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3991 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3992 if (Asm->getOption().matches(options::OPT_fasm))
3993 CmdArgs.push_back("-fgnu-keywords");
3994 else
3995 CmdArgs.push_back("-fno-gnu-keywords");
3996 }
3997
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003998 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3999 CmdArgs.push_back("-fno-dwarf-directory-asm");
4000
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004001 if (ShouldDisableAutolink(Args, getToolChain()))
4002 CmdArgs.push_back("-fno-autolink");
4003
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004004 // Add in -fdebug-compilation-dir if necessary.
4005 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004006
Richard Smith9a568822011-11-21 19:36:32 +00004007 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4008 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004009 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004010 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004011 }
4012
Richard Smith79c927b2013-11-06 19:31:51 +00004013 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4014 CmdArgs.push_back("-foperator-arrow-depth");
4015 CmdArgs.push_back(A->getValue());
4016 }
4017
Richard Smith9a568822011-11-21 19:36:32 +00004018 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4019 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004020 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004021 }
4022
Richard Smitha3d3bd22013-05-08 02:12:03 +00004023 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4024 CmdArgs.push_back("-fconstexpr-steps");
4025 CmdArgs.push_back(A->getValue());
4026 }
4027
Richard Smithb3a14522013-02-22 01:59:51 +00004028 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4029 CmdArgs.push_back("-fbracket-depth");
4030 CmdArgs.push_back(A->getValue());
4031 }
4032
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004033 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4034 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004035 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004036 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004037 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4038 } else
4039 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004040 }
4041
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004042 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004043 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004044
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004045 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4046 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004047 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004048 }
David Chisnall5778fce2009-08-31 16:41:57 +00004049
Chris Lattnere23003d2010-01-09 21:54:33 +00004050 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4051 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004052 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004053 }
4054
Chris Lattnerb35583d2010-04-07 20:49:23 +00004055 CmdArgs.push_back("-ferror-limit");
4056 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004057 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004058 else
4059 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004060
Chandler Carrutha77a7272010-05-06 04:55:18 +00004061 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4062 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004063 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004064 }
4065
4066 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4067 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004068 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004069 }
4070
Richard Smithf6f003a2011-12-16 19:06:07 +00004071 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4072 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004073 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004074 }
4075
Nick Lewycky24653262014-12-16 21:39:02 +00004076 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4077 CmdArgs.push_back("-fspell-checking-limit");
4078 CmdArgs.push_back(A->getValue());
4079 }
4080
Daniel Dunbar2c978472009-11-04 06:24:47 +00004081 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004082 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004083 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004084 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004085 } else {
4086 // If -fmessage-length=N was not specified, determine whether this is a
4087 // terminal and, if so, implicitly define -fmessage-length appropriately.
4088 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004089 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004090 }
4091
John McCallb4a99d32013-02-19 01:57:35 +00004092 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4093 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4094 options::OPT_fvisibility_ms_compat)) {
4095 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4096 CmdArgs.push_back("-fvisibility");
4097 CmdArgs.push_back(A->getValue());
4098 } else {
4099 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4100 CmdArgs.push_back("-fvisibility");
4101 CmdArgs.push_back("hidden");
4102 CmdArgs.push_back("-ftype-visibility");
4103 CmdArgs.push_back("default");
4104 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004105 }
4106
Douglas Gregor08329632010-06-15 17:05:35 +00004107 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004108
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004109 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4110
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004111 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004112 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4113 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004114 CmdArgs.push_back("-ffreestanding");
4115
Daniel Dunbare357d562009-12-03 18:42:11 +00004116 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004117 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004118 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004119 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4120 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004121 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004122 // Emulated TLS is enabled by default on Android, and can be enabled manually
4123 // with -femulated-tls.
4124 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4125 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4126 EmulatedTLSDefault))
4127 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004128 // AltiVec-like language extensions aren't relevant for assembling.
4129 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004130 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004131 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4132 }
Richard Trieu91844232012-06-26 18:18:47 +00004133 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4134 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004135
Alexey Bataevdb390212015-05-20 04:24:19 +00004136 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004137 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4138 options::OPT_fno_openmp, false))
4139 switch (getOpenMPRuntime(getToolChain(), Args)) {
4140 case OMPRT_OMP:
4141 case OMPRT_IOMP5:
4142 // Clang can generate useful OpenMP code for these two runtime libraries.
4143 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004144
4145 // If no option regarding the use of TLS in OpenMP codegeneration is
4146 // given, decide a default based on the target. Otherwise rely on the
4147 // options and pass the right information to the frontend.
4148 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4149 options::OPT_fnoopenmp_use_tls,
4150 getToolChain().getArch() == llvm::Triple::ppc ||
4151 getToolChain().getArch() == llvm::Triple::ppc64 ||
4152 getToolChain().getArch() == llvm::Triple::ppc64le))
4153 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004154 break;
4155 default:
4156 // By default, if Clang doesn't know how to generate useful OpenMP code
4157 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4158 // down to the actual compilation.
4159 // FIXME: It would be better to have a mode which *only* omits IR
4160 // generation based on the OpenMP support so that we get consistent
4161 // semantic analysis, etc.
4162 break;
4163 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004164
Peter Collingbourne32701642013-11-01 18:16:25 +00004165 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004166 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004167
Eric Christopher459d2712013-02-19 06:16:53 +00004168 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004169 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4170 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4171 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4172 Arch == llvm::Triple::ppc64le))
4173 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4174 << "ppc/ppc64/ppc64le";
4175 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004176
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004177 // -fzvector is incompatible with -faltivec.
4178 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4179 if (Args.hasArg(options::OPT_faltivec))
4180 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4181 << "-faltivec";
4182
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004183 if (getToolChain().SupportsProfiling())
4184 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004185
4186 // -flax-vector-conversions is default.
4187 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4188 options::OPT_fno_lax_vector_conversions))
4189 CmdArgs.push_back("-fno-lax-vector-conversions");
4190
John Brawna7b4ec02015-08-10 11:11:28 +00004191 if (Args.getLastArg(options::OPT_fapple_kext) ||
4192 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004193 CmdArgs.push_back("-fapple-kext");
4194
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004195 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004196 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004197 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004198 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4199 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004200
4201 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4202 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004203 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004204 }
4205
Bob Wilson14adb362012-02-03 06:27:22 +00004206 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004207
Chandler Carruth6e501032011-03-27 00:04:55 +00004208 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4209 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004210 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004211 if (A->getOption().matches(options::OPT_fwrapv))
4212 CmdArgs.push_back("-fwrapv");
4213 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4214 options::OPT_fno_strict_overflow)) {
4215 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4216 CmdArgs.push_back("-fwrapv");
4217 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004218
4219 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4220 options::OPT_fno_reroll_loops))
4221 if (A->getOption().matches(options::OPT_freroll_loops))
4222 CmdArgs.push_back("-freroll-loops");
4223
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004224 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004225 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4226 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004227
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004228 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4229
Daniel Dunbar4930e332009-11-17 08:07:36 +00004230 // -stack-protector=0 is default.
4231 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004232 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4233 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4234 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4235 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4236 Args.ClaimAllArgs(options::OPT_fstack_protector);
4237 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004238 options::OPT_fstack_protector_all,
4239 options::OPT_fstack_protector_strong,
4240 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004241 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004242 StackProtectorLevel = std::max<unsigned>(
4243 LangOptions::SSPOn,
4244 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004245 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004246 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004247 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004248 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004249 } else {
4250 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004251 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004252 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004253 if (StackProtectorLevel) {
4254 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004255 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004256 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004257
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004258 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004259 for (const Arg *A : Args.filtered(options::OPT__param)) {
4260 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004261 if (Str.startswith("ssp-buffer-size=")) {
4262 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004263 CmdArgs.push_back("-stack-protector-buffer-size");
4264 // FIXME: Verify the argument is a valid integer.
4265 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004266 }
Sean Silva14facf32015-06-09 01:57:17 +00004267 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004268 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004269 }
4270
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004271 // Translate -mstackrealign
4272 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4273 false)) {
4274 CmdArgs.push_back("-backend-option");
4275 CmdArgs.push_back("-force-align-stack");
4276 }
4277 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004278 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004279 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4280 }
4281
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004282 if (Args.hasArg(options::OPT_mstack_alignment)) {
4283 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4284 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004285 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004286
Hans Wennborg77dc2362015-01-20 19:45:50 +00004287 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4288 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4289
4290 if (!Size.empty())
4291 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4292 else
4293 CmdArgs.push_back("-mstack-probe-size=0");
4294 }
4295
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004296 switch (getToolChain().getArch()) {
4297 case llvm::Triple::aarch64:
4298 case llvm::Triple::aarch64_be:
4299 case llvm::Triple::arm:
4300 case llvm::Triple::armeb:
4301 case llvm::Triple::thumb:
4302 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004303 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004304 break;
4305
4306 default:
4307 break;
4308 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004309
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004310 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4311 options::OPT_mno_restrict_it)) {
4312 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4313 CmdArgs.push_back("-backend-option");
4314 CmdArgs.push_back("-arm-restrict-it");
4315 } else {
4316 CmdArgs.push_back("-backend-option");
4317 CmdArgs.push_back("-arm-no-restrict-it");
4318 }
James Y Knight2db38f32015-08-15 03:45:25 +00004319 } else if (Triple.isOSWindows() &&
4320 (Triple.getArch() == llvm::Triple::arm ||
4321 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004322 // Windows on ARM expects restricted IT blocks
4323 CmdArgs.push_back("-backend-option");
4324 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004325 }
4326
Daniel Dunbard18049a2009-04-07 21:16:11 +00004327 // Forward -f options with positive and negative forms; we translate
4328 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004329 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4330 StringRef fname = A->getValue();
4331 if (!llvm::sys::fs::exists(fname))
4332 D.Diag(diag::err_drv_no_such_file) << fname;
4333 else
4334 A->render(Args, CmdArgs);
4335 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004336
John Brawna7b4ec02015-08-10 11:11:28 +00004337 // -fbuiltin is default unless -mkernel is used
4338 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4339 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004340 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004341
Nuno Lopes13c88c72009-12-16 16:59:22 +00004342 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4343 options::OPT_fno_assume_sane_operator_new))
4344 CmdArgs.push_back("-fno-assume-sane-operator-new");
4345
Daniel Dunbar4930e332009-11-17 08:07:36 +00004346 // -fblocks=0 is default.
4347 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004348 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004349 (Args.hasArg(options::OPT_fgnu_runtime) &&
4350 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4351 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004352 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004354 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004355 !getToolChain().hasBlocksRuntime())
4356 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004357 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004358
Richard Smith47972af2015-06-16 00:08:24 +00004359 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004360 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004361 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004362 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004363 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004364 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4365 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004366 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004367 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004368 HaveModules = true;
4369 }
4370 }
4371
Richard Smith47972af2015-06-16 00:08:24 +00004372 // -fmodule-maps enables implicit reading of module map files. By default,
4373 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004374 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4375 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004376 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004377 }
4378
Daniel Jasperac42b752013-10-21 06:34:34 +00004379 // -fmodules-decluse checks that modules used are declared so (off by
4380 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004381 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004382 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004383 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004384 }
4385
Daniel Jasper962b38e2014-04-11 11:47:45 +00004386 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4387 // all #included headers are part of modules.
4388 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004389 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004390 CmdArgs.push_back("-fmodules-strict-decluse");
4391 }
4392
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004393 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4394 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4395 options::OPT_fno_implicit_modules)) {
4396 CmdArgs.push_back("-fno-implicit-modules");
4397 }
4398
Daniel Jasperac42b752013-10-21 06:34:34 +00004399 // -fmodule-name specifies the module that is currently being built (or
4400 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004401 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004402
Richard Smith9887d792014-10-17 01:42:53 +00004403 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004404 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004405 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004406
Richard Smithe842a472014-10-22 02:05:46 +00004407 // -fmodule-file can be used to specify files containing precompiled modules.
4408 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4409
4410 // -fmodule-cache-path specifies where our implicitly-built module files
4411 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004412 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004413 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004414 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004415 if (HaveModules) {
4416 if (C.isForDiagnostics()) {
4417 // When generating crash reports, we want to emit the modules along with
4418 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004419 Path = Output.getFilename();
4420 llvm::sys::path::replace_extension(Path, ".cache");
4421 llvm::sys::path::append(Path, "modules");
4422 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004423 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004424 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004425 llvm::sys::path::append(Path, "org.llvm.clang.");
4426 appendUserToPath(Path);
4427 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004428 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004429 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004430 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4431 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004432 }
4433
4434 // When building modules and generating crashdumps, we need to dump a module
4435 // dependency VFS alongside the output.
4436 if (HaveModules && C.isForDiagnostics()) {
4437 SmallString<128> VFSDir(Output.getFilename());
4438 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004439 // Add the cache directory as a temp so the crash diagnostics pick it up.
4440 C.addTempFile(Args.MakeArgString(VFSDir));
4441
Justin Bognera88f0122014-06-20 22:59:50 +00004442 llvm::sys::path::append(VFSDir, "vfs");
4443 CmdArgs.push_back("-module-dependency-dir");
4444 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004445 }
4446
Richard Smith9887d792014-10-17 01:42:53 +00004447 if (HaveModules)
4448 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004449
Douglas Gregor35b04d62013-02-07 19:01:24 +00004450 // Pass through all -fmodules-ignore-macro arguments.
4451 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004452 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4453 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004454
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004455 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4456
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004457 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4458 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4459 D.Diag(diag::err_drv_argument_not_allowed_with)
4460 << A->getAsString(Args) << "-fbuild-session-timestamp";
4461
4462 llvm::sys::fs::file_status Status;
4463 if (llvm::sys::fs::status(A->getValue(), Status))
4464 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004465 CmdArgs.push_back(Args.MakeArgString(
4466 "-fbuild-session-timestamp=" +
4467 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004468 }
4469
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004470 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004471 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4472 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004473 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4474
4475 Args.AddLastArg(CmdArgs,
4476 options::OPT_fmodules_validate_once_per_build_session);
4477 }
4478
Ben Langmuirdcf73862014-03-12 00:06:17 +00004479 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4480
John McCalldfea9982010-04-09 19:12:06 +00004481 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004482 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004483 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004484 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004485
Anders Carlssond470fef2010-11-21 00:09:52 +00004486 // -felide-constructors is the default.
4487 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004488 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004489 CmdArgs.push_back("-fno-elide-constructors");
4490
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004491 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004492
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004493 if (KernelOrKext || (types::isCXX(InputType) &&
4494 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4495 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004496 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004497
Tony Linthicum76329bf2011-12-12 21:14:55 +00004498 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004499 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4500 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004501 CmdArgs.push_back("-fshort-enums");
4502
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004503 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004504 if (Arg *A = Args.getLastArg(
4505 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4506 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4507 if (A->getOption().matches(options::OPT_funsigned_char) ||
4508 A->getOption().matches(options::OPT_fno_signed_char)) {
4509 CmdArgs.push_back("-fno-signed-char");
4510 }
4511 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004512 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004513 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004514
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004515 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004516 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4517 options::OPT_fno_use_cxa_atexit,
4518 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004519 getToolChain().getArch() != llvm::Triple::hexagon &&
4520 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004521 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004522 CmdArgs.push_back("-fno-use-cxa-atexit");
4523
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004524 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004525 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004526 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004527 CmdArgs.push_back("-fms-extensions");
4528
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004529 // -fno-use-line-directives is default.
4530 if (Args.hasFlag(options::OPT_fuse_line_directives,
4531 options::OPT_fno_use_line_directives, false))
4532 CmdArgs.push_back("-fuse-line-directives");
4533
Francois Pichet1b4f1632011-09-17 04:32:15 +00004534 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004535 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004536 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004537 (IsWindowsMSVC &&
4538 Args.hasFlag(options::OPT_fms_extensions,
4539 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004540 CmdArgs.push_back("-fms-compatibility");
4541
David Majnemerc371ff02015-03-22 08:39:22 +00004542 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004543 VersionTuple MSVT = visualstudio::getMSVCVersion(
4544 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4545 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004546 CmdArgs.push_back(
4547 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004548
David Majnemer8db91762015-05-18 04:49:30 +00004549 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4550 if (ImplyVCPPCXXVer) {
4551 if (IsMSVC2015Compatible)
4552 CmdArgs.push_back("-std=c++14");
4553 else
4554 CmdArgs.push_back("-std=c++11");
4555 }
4556
Eric Christopher5ecce122013-02-18 00:38:31 +00004557 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004558 if (Args.hasFlag(options::OPT_fborland_extensions,
4559 options::OPT_fno_borland_extensions, false))
4560 CmdArgs.push_back("-fborland-extensions");
4561
David Majnemerc371ff02015-03-22 08:39:22 +00004562 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4563 // than 19.
4564 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4565 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004566 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004567 CmdArgs.push_back("-fno-threadsafe-statics");
4568
Francois Pichet02744872011-09-01 16:38:08 +00004569 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4570 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004571 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004572 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004573 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004574
Chandler Carruthe03aa552010-04-17 20:17:31 +00004575 // -fgnu-keywords default varies depending on language; only pass if
4576 // specified.
4577 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004578 options::OPT_fno_gnu_keywords))
4579 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004580
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004581 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004582 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004583 CmdArgs.push_back("-fgnu89-inline");
4584
Chad Rosier9c76d242012-03-15 22:31:42 +00004585 if (Args.hasArg(options::OPT_fno_inline))
4586 CmdArgs.push_back("-fno-inline");
4587
Chad Rosier64d6be92012-03-06 21:17:19 +00004588 if (Args.hasArg(options::OPT_fno_inline_functions))
4589 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004590
John McCall5fb5df92012-06-20 06:18:46 +00004591 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004592
John McCall5fb5df92012-06-20 06:18:46 +00004593 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004594 // legacy is the default. Except for deployment taget of 10.5,
4595 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4596 // gets ignored silently.
4597 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004598 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4599 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004600 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004601 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004602 if (getToolChain().UseObjCMixedDispatch())
4603 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4604 else
4605 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4606 }
4607 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004608
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004609 // When ObjectiveC legacy runtime is in effect on MacOSX,
4610 // turn on the option to do Array/Dictionary subscripting
4611 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004612 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004613 getToolChain().getTriple().isMacOSX() &&
4614 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4615 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004616 objcRuntime.isNeXTFamily())
4617 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004618
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004619 // -fencode-extended-block-signature=1 is default.
4620 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4621 CmdArgs.push_back("-fencode-extended-block-signature");
4622 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004623
John McCall24fc0de2011-07-06 00:26:06 +00004624 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4625 // NOTE: This logic is duplicated in ToolChains.cpp.
4626 bool ARC = isObjCAutoRefCount(Args);
4627 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004628 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004629
John McCall24fc0de2011-07-06 00:26:06 +00004630 CmdArgs.push_back("-fobjc-arc");
4631
Chandler Carruth491db322011-11-04 07:34:47 +00004632 // FIXME: It seems like this entire block, and several around it should be
4633 // wrapped in isObjC, but for now we just use it here as this is where it
4634 // was being used previously.
4635 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4636 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4637 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4638 else
4639 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4640 }
4641
John McCall24fc0de2011-07-06 00:26:06 +00004642 // Allow the user to enable full exceptions code emission.
4643 // We define off for Objective-CC, on for Objective-C++.
4644 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4645 options::OPT_fno_objc_arc_exceptions,
4646 /*default*/ types::isCXX(InputType)))
4647 CmdArgs.push_back("-fobjc-arc-exceptions");
4648 }
4649
4650 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4651 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004652 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004653 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004654
John McCall24fc0de2011-07-06 00:26:06 +00004655 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4656 // takes precedence.
4657 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4658 if (!GCArg)
4659 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4660 if (GCArg) {
4661 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004662 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004663 } else if (getToolChain().SupportsObjCGC()) {
4664 GCArg->render(Args, CmdArgs);
4665 } else {
4666 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004667 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004668 }
4669 }
4670
Bob Wilsonb111ec92015-03-02 19:01:14 +00004671 if (Args.hasFlag(options::OPT_fapplication_extension,
4672 options::OPT_fno_application_extension, false))
4673 CmdArgs.push_back("-fapplication-extension");
4674
Reid Klecknerc542d372014-06-27 17:02:02 +00004675 // Handle GCC-style exception args.
4676 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004677 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4678 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004679
4680 if (getToolChain().UseSjLjExceptions())
4681 CmdArgs.push_back("-fsjlj-exceptions");
4682
4683 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004684 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4685 options::OPT_fno_assume_sane_operator_new))
4686 CmdArgs.push_back("-fno-assume-sane-operator-new");
4687
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004688 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4689 // most platforms.
4690 if (Args.hasFlag(options::OPT_fsized_deallocation,
4691 options::OPT_fno_sized_deallocation, false))
4692 CmdArgs.push_back("-fsized-deallocation");
4693
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004694 // -fconstant-cfstrings is default, and may be subject to argument translation
4695 // on Darwin.
4696 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4697 options::OPT_fno_constant_cfstrings) ||
4698 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4699 options::OPT_mno_constant_cfstrings))
4700 CmdArgs.push_back("-fno-constant-cfstrings");
4701
John Thompsoned4e2952009-11-05 20:14:16 +00004702 // -fshort-wchar default varies depending on platform; only
4703 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004704 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4705 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004706 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004707
Hans Wennborg28c96312013-07-31 23:39:13 +00004708 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004709 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004710 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004711 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004712
Daniel Dunbar096ed292011-10-05 21:04:55 +00004713 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4714 // -fno-pack-struct doesn't apply to -fpack-struct=.
4715 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004716 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004717 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004718 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004719 } else if (Args.hasFlag(options::OPT_fpack_struct,
4720 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004721 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004722 }
4723
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004724 // Handle -fmax-type-align=N and -fno-type-align
4725 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4726 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4727 if (!SkipMaxTypeAlign) {
4728 std::string MaxTypeAlignStr = "-fmax-type-align=";
4729 MaxTypeAlignStr += A->getValue();
4730 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4731 }
4732 } else if (getToolChain().getTriple().isOSDarwin()) {
4733 if (!SkipMaxTypeAlign) {
4734 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4735 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4736 }
4737 }
4738
John Brawna7b4ec02015-08-10 11:11:28 +00004739 // -fcommon is the default unless compiling kernel code or the target says so
4740 bool NoCommonDefault =
4741 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4742 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4743 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004744 CmdArgs.push_back("-fno-common");
4745
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004746 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004747 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004748 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004749 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004750 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004751 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004752
Daniel Dunbar6358d682010-10-15 22:30:42 +00004753 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004754 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004755 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004756 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004757
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004758 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004759 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4760 StringRef value = inputCharset->getValue();
4761 if (value != "UTF-8")
4762 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4763 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004764 }
4765
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004766 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004767 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4768 StringRef value = execCharset->getValue();
4769 if (value != "UTF-8")
4770 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4771 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004772 }
4773
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004774 // -fcaret-diagnostics is default.
4775 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4776 options::OPT_fno_caret_diagnostics, true))
4777 CmdArgs.push_back("-fno-caret-diagnostics");
4778
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004779 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004780 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004781 options::OPT_fno_diagnostics_fixit_info))
4782 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004783
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004784 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004785 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004786 options::OPT_fno_diagnostics_show_option))
4787 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004788
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004789 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004790 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004791 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004792 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004793 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004794
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004795 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004796 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004797 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004798 }
4799
Chandler Carruthb6766f02011-03-27 01:50:55 +00004800 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004801 options::OPT_fdiagnostics_show_note_include_stack,
4802 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004803 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004804 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004805 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4806 else
4807 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4808 }
4809
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004810 // Color diagnostics are the default, unless the terminal doesn't support
4811 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004812 // Support both clang's -f[no-]color-diagnostics and gcc's
4813 // -f[no-]diagnostics-colors[=never|always|auto].
4814 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004815 for (const auto &Arg : Args) {
4816 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004817 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4818 !O.matches(options::OPT_fdiagnostics_color) &&
4819 !O.matches(options::OPT_fno_color_diagnostics) &&
4820 !O.matches(options::OPT_fno_diagnostics_color) &&
4821 !O.matches(options::OPT_fdiagnostics_color_EQ))
4822 continue;
4823
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004824 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004825 if (O.matches(options::OPT_fcolor_diagnostics) ||
4826 O.matches(options::OPT_fdiagnostics_color)) {
4827 ShowColors = Colors_On;
4828 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4829 O.matches(options::OPT_fno_diagnostics_color)) {
4830 ShowColors = Colors_Off;
4831 } else {
4832 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004833 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004834 if (value == "always")
4835 ShowColors = Colors_On;
4836 else if (value == "never")
4837 ShowColors = Colors_Off;
4838 else if (value == "auto")
4839 ShowColors = Colors_Auto;
4840 else
4841 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004842 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004843 }
4844 }
4845 if (ShowColors == Colors_On ||
4846 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004847 CmdArgs.push_back("-fcolor-diagnostics");
4848
Nico Rieck7857d462013-09-11 00:38:02 +00004849 if (Args.hasArg(options::OPT_fansi_escape_codes))
4850 CmdArgs.push_back("-fansi-escape-codes");
4851
Daniel Dunbardb097022009-06-08 21:13:54 +00004852 if (!Args.hasFlag(options::OPT_fshow_source_location,
4853 options::OPT_fno_show_source_location))
4854 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004855
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004856 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004857 true))
4858 CmdArgs.push_back("-fno-show-column");
4859
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004860 if (!Args.hasFlag(options::OPT_fspell_checking,
4861 options::OPT_fno_spell_checking))
4862 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004863
Chad Rosierc8e56e82012-12-05 21:08:21 +00004864 // -fno-asm-blocks is default.
4865 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4866 false))
4867 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004868
Steven Wucb0d13f2015-01-16 23:05:28 +00004869 // -fgnu-inline-asm is default.
4870 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4871 options::OPT_fno_gnu_inline_asm, true))
4872 CmdArgs.push_back("-fno-gnu-inline-asm");
4873
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004874 // Enable vectorization per default according to the optimization level
4875 // selected. For optimization levels that want vectorization we use the alias
4876 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004877 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004878 OptSpecifier VectorizeAliasOption =
4879 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004880 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004881 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004882 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004883
Chad Rosier136d67d2014-04-28 19:30:57 +00004884 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004885 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004886 OptSpecifier SLPVectAliasOption =
4887 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004888 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004889 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004890 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004891
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004892 // -fno-slp-vectorize-aggressive is default.
4893 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004894 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004895 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004896
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004897 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4898 A->render(Args, CmdArgs);
4899
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004900 // -fdollars-in-identifiers default varies depending on platform and
4901 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004902 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004903 options::OPT_fno_dollars_in_identifiers)) {
4904 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004905 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004906 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004907 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004908 }
4909
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004910 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4911 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004912 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004913 options::OPT_fno_unit_at_a_time)) {
4914 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004915 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004916 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004917
Eli Friedman055c9702011-11-02 01:53:16 +00004918 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4919 options::OPT_fno_apple_pragma_pack, false))
4920 CmdArgs.push_back("-fapple-pragma-pack");
4921
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004922 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004923 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4924 // by default.
4925 if (getToolChain().getArch() == llvm::Triple::le32) {
4926 CmdArgs.push_back("-fno-math-builtin");
4927 }
4928
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004929// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4930//
4931// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004932#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004933 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004934 (getToolChain().getArch() == llvm::Triple::arm ||
4935 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004936 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4937 CmdArgs.push_back("-fno-builtin-strcat");
4938 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4939 CmdArgs.push_back("-fno-builtin-strcpy");
4940 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004941#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004942
Justin Bognera88f0122014-06-20 22:59:50 +00004943 // Enable rewrite includes if the user's asked for it or if we're generating
4944 // diagnostics.
4945 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4946 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004947 if (Args.hasFlag(options::OPT_frewrite_includes,
4948 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004949 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004950 CmdArgs.push_back("-frewrite-includes");
4951
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004952 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004953 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004954 options::OPT_traditional_cpp)) {
4955 if (isa<PreprocessJobAction>(JA))
4956 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004957 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004958 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004959 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004960
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004961 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004962 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004963
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004964 // Handle serialized diagnostics.
4965 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4966 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004967 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004968 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004969
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004970 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4971 CmdArgs.push_back("-fretain-comments-from-system-headers");
4972
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004973 // Forward -fcomment-block-commands to -cc1.
4974 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004975 // Forward -fparse-all-comments to -cc1.
4976 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004977
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004978 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4979 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004980 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004981 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4982 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004983
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004984 // We translate this by hand to the -cc1 argument, since nightly test uses
4985 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004986 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004987 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004988 } else
Sean Silva14facf32015-06-09 01:57:17 +00004989 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004990 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004991
Bob Wilson23a55f12014-12-21 07:00:00 +00004992 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004993 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4994 // by the frontend.
4995 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4996 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004997
Daniel Dunbard67a3222009-03-30 06:36:42 +00004998 if (Output.getType() == types::TY_Dependencies) {
4999 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005000 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005001 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005002 CmdArgs.push_back(Output.getFilename());
5003 } else {
5004 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005005 }
5006
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005007 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005008
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005009 if (Input.isFilename())
5010 CmdArgs.push_back(Input.getFilename());
5011 else
5012 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005013
Chris Lattnere9d7d782009-11-03 19:50:27 +00005014 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5015
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005016 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005017
5018 // Optionally embed the -cc1 level arguments into the debug info, for build
5019 // analysis.
5020 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005021 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005022 for (const auto &Arg : Args)
5023 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005024
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005025 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005026 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005027 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005028 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005029 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005030 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005031 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005032 }
5033 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005034 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005035 }
5036
Eric Christopherd3804002013-02-22 20:12:52 +00005037 // Add the split debug info name to the command lines here so we
5038 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005039 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005040 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5041 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005042 const char *SplitDwarfOut;
5043 if (SplitDwarf) {
5044 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005045 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005046 CmdArgs.push_back(SplitDwarfOut);
5047 }
5048
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005049 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5050 // Include them with -fcuda-include-gpubinary.
5051 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005052 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005053 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005054 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005055 }
5056
Eric Christopherd3804002013-02-22 20:12:52 +00005057 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005058 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005059 Output.getType() == types::TY_Object &&
5060 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005061 auto CLCommand =
5062 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005063 C.addCommand(llvm::make_unique<FallbackCommand>(
5064 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005065 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005066 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005067 }
5068
Eric Christopherf1545832013-02-22 23:50:16 +00005069 // Handle the debug info splitting at object creation time if we're
5070 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005071 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005072 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005073 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005074
Roman Divacky178e01602011-02-10 16:52:03 +00005075 if (Arg *A = Args.getLastArg(options::OPT_pg))
5076 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005077 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5078 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005079
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005080 // Claim some arguments which clang supports automatically.
5081
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005082 // -fpch-preprocess is used with gcc to add a special marker in the output to
5083 // include the PCH file. Clang's PTH solution is completely transparent, so we
5084 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005085 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005086
Daniel Dunbar17731772009-03-23 19:03:36 +00005087 // Claim some arguments which clang doesn't support, but we don't
5088 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005089 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5090 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005091
Rafael Espindolab0092d72013-09-04 19:37:35 +00005092 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005093 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005094}
5095
John McCall5fb5df92012-06-20 06:18:46 +00005096/// Add options related to the Objective-C runtime/ABI.
5097///
5098/// Returns true if the runtime is non-fragile.
5099ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5100 ArgStringList &cmdArgs,
5101 RewriteKind rewriteKind) const {
5102 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005103 Arg *runtimeArg =
5104 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5105 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005106
5107 // Just forward -fobjc-runtime= to the frontend. This supercedes
5108 // options about fragility.
5109 if (runtimeArg &&
5110 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5111 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005112 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005113 if (runtime.tryParse(value)) {
5114 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005115 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005116 }
5117
5118 runtimeArg->render(args, cmdArgs);
5119 return runtime;
5120 }
5121
5122 // Otherwise, we'll need the ABI "version". Version numbers are
5123 // slightly confusing for historical reasons:
5124 // 1 - Traditional "fragile" ABI
5125 // 2 - Non-fragile ABI, version 1
5126 // 3 - Non-fragile ABI, version 2
5127 unsigned objcABIVersion = 1;
5128 // If -fobjc-abi-version= is present, use that to set the version.
5129 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005130 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005131 if (value == "1")
5132 objcABIVersion = 1;
5133 else if (value == "2")
5134 objcABIVersion = 2;
5135 else if (value == "3")
5136 objcABIVersion = 3;
5137 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005138 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005139 } else {
5140 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005141 bool nonFragileABIIsDefault =
5142 (rewriteKind == RK_NonFragile ||
5143 (rewriteKind == RK_None &&
5144 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005145 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5146 options::OPT_fno_objc_nonfragile_abi,
5147 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005148// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005149#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5150 unsigned nonFragileABIVersion = 1;
5151#else
5152 unsigned nonFragileABIVersion = 2;
5153#endif
5154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005155 if (Arg *abiArg =
5156 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005157 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005158 if (value == "1")
5159 nonFragileABIVersion = 1;
5160 else if (value == "2")
5161 nonFragileABIVersion = 2;
5162 else
5163 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005165 }
5166
5167 objcABIVersion = 1 + nonFragileABIVersion;
5168 } else {
5169 objcABIVersion = 1;
5170 }
5171 }
5172
5173 // We don't actually care about the ABI version other than whether
5174 // it's non-fragile.
5175 bool isNonFragile = objcABIVersion != 1;
5176
5177 // If we have no runtime argument, ask the toolchain for its default runtime.
5178 // However, the rewriter only really supports the Mac runtime, so assume that.
5179 ObjCRuntime runtime;
5180 if (!runtimeArg) {
5181 switch (rewriteKind) {
5182 case RK_None:
5183 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5184 break;
5185 case RK_Fragile:
5186 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5187 break;
5188 case RK_NonFragile:
5189 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5190 break;
5191 }
5192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005193 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005194 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5195 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005196 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005197 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5198
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005199 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005200 } else {
5201 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5202 }
5203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005204 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005205 } else {
5206 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005207 // Legacy behaviour is to target the gnustep runtime if we are i
5208 // non-fragile mode or the GCC runtime in fragile mode.
5209 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005210 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005211 else
5212 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005213 }
5214
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005215 cmdArgs.push_back(
5216 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005217 return runtime;
5218}
5219
Reid Klecknerc542d372014-06-27 17:02:02 +00005220static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5221 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5222 I += HaveDash;
5223 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005224}
Reid Klecknerc542d372014-06-27 17:02:02 +00005225
5226struct EHFlags {
5227 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5228 bool Synch;
5229 bool Asynch;
5230 bool NoExceptC;
5231};
5232
5233/// /EH controls whether to run destructor cleanups when exceptions are
5234/// thrown. There are three modifiers:
5235/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5236/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5237/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5238/// - c: Assume that extern "C" functions are implicitly noexcept. This
5239/// modifier is an optimization, so we ignore it for now.
5240/// The default is /EHs-c-, meaning cleanups are disabled.
5241static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5242 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005244 std::vector<std::string> EHArgs =
5245 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005246 for (auto EHVal : EHArgs) {
5247 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5248 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005249 case 'a':
5250 EH.Asynch = maybeConsumeDash(EHVal, I);
5251 continue;
5252 case 'c':
5253 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5254 continue;
5255 case 's':
5256 EH.Synch = maybeConsumeDash(EHVal, I);
5257 continue;
5258 default:
5259 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005260 }
5261 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5262 break;
5263 }
5264 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005265
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005266 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5267 // can use -Xclang to manually enable C++ EH until then.
5268 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005269
Reid Klecknerc542d372014-06-27 17:02:02 +00005270 return EH;
5271}
5272
Hans Wennborg75958c42013-08-08 00:17:41 +00005273void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5274 unsigned RTOptionID = options::OPT__SLASH_MT;
5275
Hans Wennborgf1a74252013-09-10 20:18:04 +00005276 if (Args.hasArg(options::OPT__SLASH_LDd))
5277 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5278 // but defining _DEBUG is sticky.
5279 RTOptionID = options::OPT__SLASH_MTd;
5280
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005281 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005282 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005283
David Majnemere2afb472015-07-24 06:49:13 +00005284 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005285 switch (RTOptionID) {
5286 case options::OPT__SLASH_MD:
5287 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005288 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005289 CmdArgs.push_back("-D_MT");
5290 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005291 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005292 break;
5293 case options::OPT__SLASH_MDd:
5294 CmdArgs.push_back("-D_DEBUG");
5295 CmdArgs.push_back("-D_MT");
5296 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005297 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005298 break;
5299 case options::OPT__SLASH_MT:
5300 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005301 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005303 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005304 break;
5305 case options::OPT__SLASH_MTd:
5306 CmdArgs.push_back("-D_DEBUG");
5307 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005308 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005309 break;
5310 default:
5311 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005312 }
5313
David Majnemere2afb472015-07-24 06:49:13 +00005314 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5315 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5316 } else {
5317 CmdArgs.push_back(FlagForCRT.data());
5318
5319 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5320 // users want. The /Za flag to cl.exe turns this off, but it's not
5321 // implemented in clang.
5322 CmdArgs.push_back("--dependent-lib=oldnames");
5323 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005324
Hans Wennborg8858a032014-07-21 23:42:07 +00005325 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5326 // would produce interleaved output, so ignore /showIncludes in such cases.
5327 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5328 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5329 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005330
David Majnemerf6072342014-07-01 22:24:56 +00005331 // This controls whether or not we emit RTTI data for polymorphic types.
5332 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5333 /*default=*/false))
5334 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005335
Reid Kleckner124955a2015-08-05 18:51:13 +00005336 // Emit CodeView if -Z7 is present.
5337 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5338 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5339 // If we are emitting CV but not DWARF, don't build information that LLVM
5340 // can't yet process.
5341 if (EmitCodeView && !EmitDwarf)
5342 CmdArgs.push_back("-gline-tables-only");
5343 if (EmitCodeView)
5344 CmdArgs.push_back("-gcodeview");
5345
Reid Klecknerc542d372014-06-27 17:02:02 +00005346 const Driver &D = getToolChain().getDriver();
5347 EHFlags EH = parseClangCLEHFlags(D, Args);
5348 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005349 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005350 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005351 CmdArgs.push_back("-fexceptions");
5352 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005353
Hans Wennborge50cec32014-06-13 20:59:54 +00005354 // /EP should expand to -E -P.
5355 if (Args.hasArg(options::OPT__SLASH_EP)) {
5356 CmdArgs.push_back("-E");
5357 CmdArgs.push_back("-P");
5358 }
5359
David Majnemera5b195a2015-02-14 01:35:12 +00005360 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005361 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5362 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005363 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5364 else
5365 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5366
5367 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5368 VolatileOptionID = A->getOption().getID();
5369
5370 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5371 CmdArgs.push_back("-fms-volatile");
5372
David Majnemer86c318f2014-02-11 21:05:00 +00005373 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5374 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5375 if (MostGeneralArg && BestCaseArg)
5376 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5377 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5378
5379 if (MostGeneralArg) {
5380 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5381 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5382 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5383
5384 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5385 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5386 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5387 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5388 << FirstConflict->getAsString(Args)
5389 << SecondConflict->getAsString(Args);
5390
5391 if (SingleArg)
5392 CmdArgs.push_back("-fms-memptr-rep=single");
5393 else if (MultipleArg)
5394 CmdArgs.push_back("-fms-memptr-rep=multiple");
5395 else
5396 CmdArgs.push_back("-fms-memptr-rep=virtual");
5397 }
5398
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005399 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5400 A->render(Args, CmdArgs);
5401
Hans Wennborg81f74482013-09-10 01:07:07 +00005402 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5403 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005404 if (Args.hasArg(options::OPT__SLASH_fallback))
5405 CmdArgs.push_back("msvc-fallback");
5406 else
5407 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005408 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005409}
5410
Douglas Katzman95354292015-06-23 20:42:09 +00005411visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005412 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005413 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005414 return CLFallback.get();
5415}
5416
Daniel Sanders7f933f42015-01-30 17:35:23 +00005417void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5418 ArgStringList &CmdArgs) const {
5419 StringRef CPUName;
5420 StringRef ABIName;
5421 const llvm::Triple &Triple = getToolChain().getTriple();
5422 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5423
5424 CmdArgs.push_back("-target-abi");
5425 CmdArgs.push_back(ABIName.data());
5426}
5427
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005428void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005430 const ArgList &Args,
5431 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005432 ArgStringList CmdArgs;
5433
5434 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5435 const InputInfo &Input = Inputs[0];
5436
James Y Knight2db38f32015-08-15 03:45:25 +00005437 std::string TripleStr =
5438 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5439 const llvm::Triple Triple(TripleStr);
5440
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005441 // Don't warn about "clang -w -c foo.s"
5442 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005443 // and "clang -emit-llvm -c foo.s"
5444 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005445
Rafael Espindola577637a2015-01-03 00:06:04 +00005446 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005447
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005448 // Invoke ourselves in -cc1as mode.
5449 //
5450 // FIXME: Implement custom jobs for internal actions.
5451 CmdArgs.push_back("-cc1as");
5452
5453 // Add the "effective" target triple.
5454 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005455 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5456
5457 // Set the output mode, we currently only expect to be used as a real
5458 // assembler.
5459 CmdArgs.push_back("-filetype");
5460 CmdArgs.push_back("obj");
5461
Eric Christopher45f2e712012-12-18 00:31:10 +00005462 // Set the main file name, so that debug info works even with
5463 // -save-temps or preprocessed assembly.
5464 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005465 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005466
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005467 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005468 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005469 if (!CPU.empty()) {
5470 CmdArgs.push_back("-target-cpu");
5471 CmdArgs.push_back(Args.MakeArgString(CPU));
5472 }
5473
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005474 // Add the target features
5475 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005476 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005477
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005478 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005479 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005480
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005481 // Pass along any -I options so we get proper .include search paths.
5482 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5483
Eric Christopherfc3ee562012-01-10 00:38:01 +00005484 // Determine the original source input.
5485 const Action *SourceAction = &JA;
5486 while (SourceAction->getKind() != Action::InputClass) {
5487 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5488 SourceAction = SourceAction->getInputs()[0];
5489 }
5490
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005491 // Forward -g and handle debug info related flags, assuming we are dealing
5492 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005493 if (SourceAction->getType() == types::TY_Asm ||
5494 SourceAction->getType() == types::TY_PP_Asm) {
5495 Args.ClaimAllArgs(options::OPT_g_Group);
5496 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5497 if (!A->getOption().matches(options::OPT_g0))
5498 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005499
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005500 if (Args.hasArg(options::OPT_gdwarf_2))
5501 CmdArgs.push_back("-gdwarf-2");
5502 if (Args.hasArg(options::OPT_gdwarf_3))
5503 CmdArgs.push_back("-gdwarf-3");
5504 if (Args.hasArg(options::OPT_gdwarf_4))
5505 CmdArgs.push_back("-gdwarf-4");
5506
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005507 // Add the -fdebug-compilation-dir flag if needed.
5508 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005509
5510 // Set the AT_producer to the clang version when using the integrated
5511 // assembler on assembly source files.
5512 CmdArgs.push_back("-dwarf-debug-producer");
5513 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005514
5515 // And pass along -I options
5516 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005517 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005518
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005519 // Handle -fPIC et al -- the relocation-model affects the assembler
5520 // for some targets.
5521 llvm::Reloc::Model RelocationModel;
5522 unsigned PICLevel;
5523 bool IsPIE;
5524 std::tie(RelocationModel, PICLevel, IsPIE) =
5525 ParsePICArgs(getToolChain(), Triple, Args);
5526
5527 const char *RMName = RelocationModelName(RelocationModel);
5528 if (RMName) {
5529 CmdArgs.push_back("-mrelocation-model");
5530 CmdArgs.push_back(RMName);
5531 }
5532
Kevin Enderby292dc082011-12-22 19:31:58 +00005533 // Optionally embed the -cc1as level arguments into the debug info, for build
5534 // analysis.
5535 if (getToolChain().UseDwarfDebugFlags()) {
5536 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005537 for (const auto &Arg : Args)
5538 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005539
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005540 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005541 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5542 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005543 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005544 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005545 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005546 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005547 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005548 }
5549 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005550 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005551 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005552
5553 // FIXME: Add -static support, once we have it.
5554
Daniel Sanders7f933f42015-01-30 17:35:23 +00005555 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005556 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005557 default:
5558 break;
5559
5560 case llvm::Triple::mips:
5561 case llvm::Triple::mipsel:
5562 case llvm::Triple::mips64:
5563 case llvm::Triple::mips64el:
5564 AddMIPSTargetArgs(Args, CmdArgs);
5565 break;
5566 }
5567
David Blaikie372d9502014-01-17 03:17:40 +00005568 // Consume all the warning flags. Usually this would be handled more
5569 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5570 // doesn't handle that so rather than warning about unused flags that are
5571 // actually used, we'll lie by omission instead.
5572 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005573 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5574 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005575
David Blaikie9260ed62013-07-25 21:19:01 +00005576 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5577 getToolChain().getDriver());
5578
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005579 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005580
5581 assert(Output.isFilename() && "Unexpected lipo output.");
5582 CmdArgs.push_back("-o");
5583 CmdArgs.push_back(Output.getFilename());
5584
Daniel Dunbarb440f562010-08-02 02:38:21 +00005585 assert(Input.isFilename() && "Invalid input.");
5586 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005587
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005588 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005589 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005590
5591 // Handle the debug info splitting at object creation time if we're
5592 // creating an object.
5593 // TODO: Currently only works on linux with newer objcopy.
5594 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005595 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005596 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005597 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005598}
5599
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005600void GnuTool::anchor() {}
5601
Daniel Dunbara3246a02009-03-18 08:07:30 +00005602void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005603 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005604 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005605 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005606 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005607 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005608
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005609 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005610 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005611 // Don't forward any -g arguments to assembly steps.
5612 if (isa<AssembleJobAction>(JA) &&
5613 A->getOption().matches(options::OPT_g_Group))
5614 continue;
5615
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005616 // Don't forward any -W arguments to assembly and link steps.
5617 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5618 A->getOption().matches(options::OPT_W_Group))
5619 continue;
5620
Daniel Dunbar2da02722009-03-19 07:55:12 +00005621 // It is unfortunate that we have to claim here, as this means
5622 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005623 // platforms using a generic gcc, even if we are just using gcc
5624 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005625 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005626 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005627 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005628 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005629
Daniel Dunbar4e295052010-01-25 22:35:08 +00005630 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005631
5632 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005633 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005634 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005635 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005636 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005637 }
5638
Daniel Dunbar5716d872009-05-02 21:41:52 +00005639 // Try to force gcc to match the tool chain we want, if we recognize
5640 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005641 //
5642 // FIXME: The triple class should directly provide the information we want
5643 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005644 switch (getToolChain().getArch()) {
5645 default:
5646 break;
5647 case llvm::Triple::x86:
5648 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005649 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005650 break;
5651 case llvm::Triple::x86_64:
5652 case llvm::Triple::ppc64:
5653 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005654 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005655 break;
5656 case llvm::Triple::sparcel:
5657 CmdArgs.push_back("-EL");
5658 break;
5659 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005660
Daniel Dunbarb440f562010-08-02 02:38:21 +00005661 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005662 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005663 CmdArgs.push_back(Output.getFilename());
5664 } else {
5665 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005666 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005667 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005668
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005669 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005670
5671 // Only pass -x if gcc will understand it; otherwise hope gcc
5672 // understands the suffix correctly. The main use case this would go
5673 // wrong in is for linker inputs if they happened to have an odd
5674 // suffix; really the only way to get this to happen is a command
5675 // like '-x foobar a.c' which will treat a.c like a linker input.
5676 //
5677 // FIXME: For the linker case specifically, can we safely convert
5678 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005679 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005680 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005681 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5682 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005683 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005684 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005685 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005686 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005687 else if (II.getType() == types::TY_ModuleFile)
5688 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005689 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005690
Daniel Dunbara3246a02009-03-18 08:07:30 +00005691 if (types::canTypeBeUserSpecified(II.getType())) {
5692 CmdArgs.push_back("-x");
5693 CmdArgs.push_back(types::getTypeName(II.getType()));
5694 }
5695
Daniel Dunbarb440f562010-08-02 02:38:21 +00005696 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005697 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005698 else {
5699 const Arg &A = II.getInputArg();
5700
5701 // Reverse translate some rewritten options.
5702 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5703 CmdArgs.push_back("-lstdc++");
5704 continue;
5705 }
5706
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005707 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005708 A.render(Args, CmdArgs);
5709 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005710 }
5711
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005712 const std::string customGCCName = D.getCCCGenericGCCName();
5713 const char *GCCName;
5714 if (!customGCCName.empty())
5715 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005716 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005717 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005718 } else
5719 GCCName = "gcc";
5720
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005721 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005722 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005723}
5724
Douglas Katzman95354292015-06-23 20:42:09 +00005725void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5726 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005727 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005728}
5729
Douglas Katzman95354292015-06-23 20:42:09 +00005730void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5731 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005732 const Driver &D = getToolChain().getDriver();
5733
Eric Christophercc7ff502015-01-29 00:56:17 +00005734 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005735 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005736 case types::TY_LLVM_IR:
5737 case types::TY_LTO_IR:
5738 case types::TY_LLVM_BC:
5739 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005740 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005741 break;
5742 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005743 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005744 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005745 case types::TY_Nothing:
5746 CmdArgs.push_back("-fsyntax-only");
5747 break;
5748 default:
5749 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005750 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005751}
5752
Douglas Katzman95354292015-06-23 20:42:09 +00005753void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5754 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005755 // The types are (hopefully) good enough.
5756}
5757
Tony Linthicum76329bf2011-12-12 21:14:55 +00005758// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005759void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5760 ArgStringList &CmdArgs) const {}
5761void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5762 const InputInfo &Output,
5763 const InputInfoList &Inputs,
5764 const ArgList &Args,
5765 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005766 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005767
5768 const Driver &D = getToolChain().getDriver();
5769 ArgStringList CmdArgs;
5770
5771 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005772 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005773 CmdArgs.push_back(Args.MakeArgString(MarchString));
5774
5775 RenderExtraToolArgs(JA, CmdArgs);
5776
5777 if (Output.isFilename()) {
5778 CmdArgs.push_back("-o");
5779 CmdArgs.push_back(Output.getFilename());
5780 } else {
5781 assert(Output.isNothing() && "Unexpected output");
5782 CmdArgs.push_back("-fsyntax-only");
5783 }
5784
Douglas Katzman54366072015-07-27 16:53:08 +00005785 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005786 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005787
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005788 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005789
Tony Linthicum76329bf2011-12-12 21:14:55 +00005790 // Only pass -x if gcc will understand it; otherwise hope gcc
5791 // understands the suffix correctly. The main use case this would go
5792 // wrong in is for linker inputs if they happened to have an odd
5793 // suffix; really the only way to get this to happen is a command
5794 // like '-x foobar a.c' which will treat a.c like a linker input.
5795 //
5796 // FIXME: For the linker case specifically, can we safely convert
5797 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005798 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005799 // Don't try to pass LLVM or AST inputs to a generic gcc.
5800 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5801 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5802 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005803 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005804 else if (II.getType() == types::TY_AST)
5805 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005806 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005807 else if (II.getType() == types::TY_ModuleFile)
5808 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005809 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005810
5811 if (II.isFilename())
5812 CmdArgs.push_back(II.getFilename());
5813 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005814 // Don't render as input, we need gcc to do the translations.
5815 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005816 II.getInputArg().render(Args, CmdArgs);
5817 }
5818
5819 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005820 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005822}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005823
Douglas Katzman95354292015-06-23 20:42:09 +00005824void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5825 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005826 // The types are (hopefully) good enough.
5827}
5828
Douglas Katzman54366072015-07-27 16:53:08 +00005829static void
5830constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5831 const toolchains::HexagonToolChain &ToolChain,
5832 const InputInfo &Output, const InputInfoList &Inputs,
5833 const ArgList &Args, ArgStringList &CmdArgs,
5834 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005835
Matthew Curtise689b052012-12-06 15:46:07 +00005836 const Driver &D = ToolChain.getDriver();
5837
Matthew Curtise689b052012-12-06 15:46:07 +00005838 //----------------------------------------------------------------------------
5839 //
5840 //----------------------------------------------------------------------------
5841 bool hasStaticArg = Args.hasArg(options::OPT_static);
5842 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005843 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005844 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5845 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5846 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005847 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005848 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005849
Matthew Curtise689b052012-12-06 15:46:07 +00005850 //----------------------------------------------------------------------------
5851 // Silence warnings for various options
5852 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005853
Matthew Curtise689b052012-12-06 15:46:07 +00005854 Args.ClaimAllArgs(options::OPT_g_Group);
5855 Args.ClaimAllArgs(options::OPT_emit_llvm);
5856 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5857 // handled somewhere else.
5858 Args.ClaimAllArgs(options::OPT_static_libgcc);
5859
5860 //----------------------------------------------------------------------------
5861 //
5862 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005863 for (const auto &Opt : ToolChain.ExtraOpts)
5864 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005865
Douglas Katzman54366072015-07-27 16:53:08 +00005866 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005867 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005868
Matthew Curtise689b052012-12-06 15:46:07 +00005869 if (buildingLib) {
5870 CmdArgs.push_back("-shared");
5871 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5872 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005873 }
5874
Matthew Curtise689b052012-12-06 15:46:07 +00005875 if (hasStaticArg)
5876 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005877
Matthew Curtise8f80a12012-12-06 17:49:03 +00005878 if (buildPIE && !buildingLib)
5879 CmdArgs.push_back("-pie");
5880
Douglas Katzman54366072015-07-27 16:53:08 +00005881 if (const char *v =
5882 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005883 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005884 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005885 }
5886
Matthew Curtise689b052012-12-06 15:46:07 +00005887 //----------------------------------------------------------------------------
5888 //
5889 //----------------------------------------------------------------------------
5890 CmdArgs.push_back("-o");
5891 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005892
Matthew Curtise689b052012-12-06 15:46:07 +00005893 const std::string MarchSuffix = "/" + MarchString;
5894 const std::string G0Suffix = "/G0";
5895 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005896 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005897 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005898 const std::string StartFilesDir =
5899 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005900
5901 //----------------------------------------------------------------------------
5902 // moslib
5903 //----------------------------------------------------------------------------
5904 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005905 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005906
Sean Silva14facf32015-06-09 01:57:17 +00005907 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5908 A->claim();
5909 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005910 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005911 }
Matthew Curtise689b052012-12-06 15:46:07 +00005912 if (oslibs.empty()) {
5913 oslibs.push_back("standalone");
5914 hasStandalone = true;
5915 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005916
Matthew Curtise689b052012-12-06 15:46:07 +00005917 //----------------------------------------------------------------------------
5918 // Start Files
5919 //----------------------------------------------------------------------------
5920 if (incStdLib && incStartFiles) {
5921
5922 if (!buildingLib) {
5923 if (hasStandalone) {
5924 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005925 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005926 }
5927 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5928 }
5929 std::string initObj = useShared ? "/initS.o" : "/init.o";
5930 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5931 }
5932
5933 //----------------------------------------------------------------------------
5934 // Library Search Paths
5935 //----------------------------------------------------------------------------
5936 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005937 for (const auto &LibPath : LibPaths)
5938 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005939
5940 //----------------------------------------------------------------------------
5941 //
5942 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005943 Args.AddAllArgs(CmdArgs,
5944 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5945 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005946
5947 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5948
5949 //----------------------------------------------------------------------------
5950 // Libraries
5951 //----------------------------------------------------------------------------
5952 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005953 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005954 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5955 CmdArgs.push_back("-lm");
5956 }
5957
5958 CmdArgs.push_back("--start-group");
5959
5960 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005961 for (const std::string &Lib : oslibs)
5962 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005963 CmdArgs.push_back("-lc");
5964 }
5965 CmdArgs.push_back("-lgcc");
5966
5967 CmdArgs.push_back("--end-group");
5968 }
5969
5970 //----------------------------------------------------------------------------
5971 // End files
5972 //----------------------------------------------------------------------------
5973 if (incStdLib && incStartFiles) {
5974 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5975 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5976 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005977}
5978
Douglas Katzman95354292015-06-23 20:42:09 +00005979void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5980 const InputInfo &Output,
5981 const InputInfoList &Inputs,
5982 const ArgList &Args,
5983 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005984
Douglas Katzman54366072015-07-27 16:53:08 +00005985 const toolchains::HexagonToolChain &ToolChain =
5986 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005987
5988 ArgStringList CmdArgs;
5989 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5990 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005991
5992 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005993 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005994 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005995}
5996// Hexagon tools end.
5997
Tom Stellard8fa33092015-07-18 01:49:05 +00005998void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5999 const InputInfo &Output,
6000 const InputInfoList &Inputs,
6001 const ArgList &Args,
6002 const char *LinkingOutput) const {
6003
6004 std::string Linker = getToolChain().GetProgramPath(getShortName());
6005 ArgStringList CmdArgs;
6006 CmdArgs.push_back("-flavor");
6007 CmdArgs.push_back("gnu");
6008 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006009 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006010 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6011 CmdArgs.push_back("-o");
6012 CmdArgs.push_back(Output.getFilename());
6013 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6014 CmdArgs, Inputs));
6015}
6016// AMDGPU tools end.
6017
Renato Golin7c542b42015-07-27 23:44:45 +00006018const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006019 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006020 if (!Arch.empty())
6021 MArch = Arch;
6022 else
Bernard Ogden31561762013-12-12 13:27:11 +00006023 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006024 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006025
6026 // Handle -march=native.
6027 if (MArch == "native") {
6028 std::string CPU = llvm::sys::getHostCPUName();
6029 if (CPU != "generic") {
6030 // Translate the native cpu into the architecture suffix for that CPU.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006031 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
John Brawn94fd9632015-05-21 12:19:49 +00006032 // If there is no valid architecture suffix for this CPU we don't know how
6033 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006034 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006035 MArch = "";
6036 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006037 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006038 }
6039 }
6040
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006041 return MArch;
6042}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006043
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006044/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006045StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006046 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006047 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6048 // here means an -march=native that we can't handle, so instead return no CPU.
6049 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006050 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006051
John Brawna95c1a82015-05-08 12:52:18 +00006052 // We need to return an empty string here on invalid MArch values as the
6053 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006054 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006055}
6056
6057/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006058std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006059 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006060 // FIXME: Warn on inconsistent use of -mcpu and -march.
6061 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006062 if (!CPU.empty()) {
6063 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006064 // Handle -mcpu=native.
6065 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006066 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006067 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006068 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006069 }
6070
Renato Goline17c5802015-07-27 23:44:42 +00006071 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006072}
6073
6074/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006075/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006076// FIXME: This is redundant with -mcpu, why does LLVM use this.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006077StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00006078 if (CPU == "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006079 return llvm::ARM::getSubArch(
6080 llvm::ARM::parseArch(Arch));
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006081
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006082 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin3c007252015-05-28 15:05:53 +00006083 if (ArchKind == llvm::ARM::AK_INVALID)
6084 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006085 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006086}
6087
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006088void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006089 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006090 if (Args.hasArg(options::OPT_r))
6091 return;
6092
John Brawn94fd9632015-05-21 12:19:49 +00006093 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6094 // to generate BE-8 executables.
6095 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6096 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006097}
6098
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006099mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6100 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6101 .Case("mips1", NanLegacy)
6102 .Case("mips2", NanLegacy)
6103 .Case("mips3", NanLegacy)
6104 .Case("mips4", NanLegacy)
6105 .Case("mips5", NanLegacy)
6106 .Case("mips32", NanLegacy)
6107 .Case("mips32r2", NanLegacy)
6108 .Case("mips32r3", NanLegacy | Nan2008)
6109 .Case("mips32r5", NanLegacy | Nan2008)
6110 .Case("mips32r6", Nan2008)
6111 .Case("mips64", NanLegacy)
6112 .Case("mips64r2", NanLegacy)
6113 .Case("mips64r3", NanLegacy | Nan2008)
6114 .Case("mips64r5", NanLegacy | Nan2008)
6115 .Case("mips64r6", Nan2008)
6116 .Default(NanLegacy);
6117}
6118
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006119bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6120 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6121 return A && (A->getValue() == StringRef(Value));
6122}
6123
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006124bool mips::isUCLibc(const ArgList &Args) {
6125 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006126 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006127}
6128
Daniel Sanders2bf13662014-07-10 14:40:57 +00006129bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006130 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6131 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006132 .Case("2008", true)
6133 .Case("legacy", false)
6134 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006135
6136 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006137 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006138 .Cases("mips32r6", "mips64r6", true)
6139 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006140
6141 return false;
6142}
6143
Daniel Sanders379d44b2014-07-16 11:52:23 +00006144bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006145 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006146 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006147 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006148 return false;
6149
6150 if (ABIName != "32")
6151 return false;
6152
Toma Tabacu94ea6862015-06-16 13:54:13 +00006153 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6154 // present.
6155 if (FloatABI == "soft")
6156 return false;
6157
Daniel Sanders379d44b2014-07-16 11:52:23 +00006158 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006159 .Cases("mips2", "mips3", "mips4", "mips5", true)
6160 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6161 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6162 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006163}
6164
Toma Tabacu94ea6862015-06-16 13:54:13 +00006165bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6166 StringRef CPUName, StringRef ABIName,
6167 StringRef FloatABI) {
6168 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6169
6170 // FPXX shouldn't be used if -msingle-float is present.
6171 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6172 options::OPT_mdouble_float))
6173 if (A->getOption().matches(options::OPT_msingle_float))
6174 UseFPXX = false;
6175
6176 return UseFPXX;
6177}
6178
Tim Northover157d9112014-01-16 08:48:16 +00006179llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006180 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6181 // archs which Darwin doesn't use.
6182
6183 // The matching this routine does is fairly pointless, since it is neither the
6184 // complete architecture list, nor a reasonable subset. The problem is that
6185 // historically the driver driver accepts this and also ties its -march=
6186 // handling to the architecture name, so we need to be careful before removing
6187 // support for it.
6188
6189 // This code must be kept in sync with Clang's Darwin specific argument
6190 // translation.
6191
6192 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006193 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6194 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6195 .Case("ppc64", llvm::Triple::ppc64)
6196 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6197 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6198 llvm::Triple::x86)
6199 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6200 // This is derived from the driver driver.
6201 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6202 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6203 .Cases("armv7s", "xscale", llvm::Triple::arm)
6204 .Case("arm64", llvm::Triple::aarch64)
6205 .Case("r600", llvm::Triple::r600)
6206 .Case("amdgcn", llvm::Triple::amdgcn)
6207 .Case("nvptx", llvm::Triple::nvptx)
6208 .Case("nvptx64", llvm::Triple::nvptx64)
6209 .Case("amdil", llvm::Triple::amdil)
6210 .Case("spir", llvm::Triple::spir)
6211 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006212}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006213
Tim Northover157d9112014-01-16 08:48:16 +00006214void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006215 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006216 T.setArch(Arch);
6217
6218 if (Str == "x86_64h")
6219 T.setArchName(Str);
6220 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6221 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006222 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006223 }
6224}
6225
Bob Wilsondecc03e2012-11-23 06:14:39 +00006226const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006227 const InputInfo &Input) {
6228 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006229}
6230
Bob Wilsondecc03e2012-11-23 06:14:39 +00006231const char *Clang::getBaseInputStem(const ArgList &Args,
6232 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006233 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006234
Chris Lattner906bb902011-01-16 08:14:11 +00006235 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006236 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006237
6238 return Str;
6239}
6240
Bob Wilsondecc03e2012-11-23 06:14:39 +00006241const char *Clang::getDependencyFileName(const ArgList &Args,
6242 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006243 // FIXME: Think about this more.
6244 std::string Res;
6245
6246 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006247 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006248 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006249 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006250 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006251 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006252 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006253}
6254
Douglas Katzman95354292015-06-23 20:42:09 +00006255void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6256 const InputInfo &Output,
6257 const InputInfoList &Inputs,
6258 const ArgList &Args,
6259 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006260 const ToolChain &ToolChain = getToolChain();
6261 const Driver &D = ToolChain.getDriver();
6262 ArgStringList CmdArgs;
6263
6264 // Silence warning for "clang -g foo.o -o foo"
6265 Args.ClaimAllArgs(options::OPT_g_Group);
6266 // and "clang -emit-llvm foo.o -o foo"
6267 Args.ClaimAllArgs(options::OPT_emit_llvm);
6268 // and for "clang -w foo.o -o foo". Other warning options are already
6269 // handled somewhere else.
6270 Args.ClaimAllArgs(options::OPT_w);
6271
6272 if (!D.SysRoot.empty())
6273 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6274
6275 // CloudABI only supports static linkage.
6276 CmdArgs.push_back("-Bstatic");
6277 CmdArgs.push_back("--eh-frame-hdr");
6278 CmdArgs.push_back("--gc-sections");
6279
6280 if (Output.isFilename()) {
6281 CmdArgs.push_back("-o");
6282 CmdArgs.push_back(Output.getFilename());
6283 } else {
6284 assert(Output.isNothing() && "Invalid output.");
6285 }
6286
6287 if (!Args.hasArg(options::OPT_nostdlib) &&
6288 !Args.hasArg(options::OPT_nostartfiles)) {
6289 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6290 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6291 }
6292
6293 Args.AddAllArgs(CmdArgs, options::OPT_L);
6294 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6295 for (const auto &Path : Paths)
6296 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006297 Args.AddAllArgs(CmdArgs,
6298 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6299 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006300
Alexey Samsonov907880e2015-06-19 19:57:46 +00006301 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006302 AddGoldPlugin(ToolChain, Args, CmdArgs);
6303
6304 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6305
6306 if (!Args.hasArg(options::OPT_nostdlib) &&
6307 !Args.hasArg(options::OPT_nodefaultlibs)) {
6308 if (D.CCCIsCXX())
6309 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6310 CmdArgs.push_back("-lc");
6311 CmdArgs.push_back("-lcompiler_rt");
6312 }
6313
6314 if (!Args.hasArg(options::OPT_nostdlib) &&
6315 !Args.hasArg(options::OPT_nostartfiles))
6316 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6317
6318 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006319 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006320}
6321
Douglas Katzman95354292015-06-23 20:42:09 +00006322void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6323 const InputInfo &Output,
6324 const InputInfoList &Inputs,
6325 const ArgList &Args,
6326 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006327 ArgStringList CmdArgs;
6328
6329 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6330 const InputInfo &Input = Inputs[0];
6331
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006332 // Determine the original source input.
6333 const Action *SourceAction = &JA;
6334 while (SourceAction->getKind() != Action::InputClass) {
6335 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6336 SourceAction = SourceAction->getInputs()[0];
6337 }
6338
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006339 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006340 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006341 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6342 // FIXME: at run-time detect assembler capabilities or rely on version
6343 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006344 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006345 const llvm::Triple &T(getToolChain().getTriple());
6346 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006347 CmdArgs.push_back("-Q");
6348 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006349
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006350 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006351 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006352 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006353 if (Args.hasArg(options::OPT_gstabs))
6354 CmdArgs.push_back("--gstabs");
6355 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006356 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006357 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006358
Daniel Dunbarbe220842009-03-20 16:06:39 +00006359 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006360 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006361
Daniel Dunbar6d484762010-07-22 01:47:22 +00006362 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006363 if (getToolChain().getArch() == llvm::Triple::x86 ||
6364 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006365 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6366 CmdArgs.push_back("-force_cpusubtype_ALL");
6367
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006368 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006369 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006370 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006371 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006372 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006373 CmdArgs.push_back("-static");
6374
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006375 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006376
6377 assert(Output.isFilename() && "Unexpected lipo output.");
6378 CmdArgs.push_back("-o");
6379 CmdArgs.push_back(Output.getFilename());
6380
Daniel Dunbarb440f562010-08-02 02:38:21 +00006381 assert(Input.isFilename() && "Invalid input.");
6382 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006383
6384 // asm_final spec is empty.
6385
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006386 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006387 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006388}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006389
Tim Northover157d9112014-01-16 08:48:16 +00006390void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006391
Tim Northover157d9112014-01-16 08:48:16 +00006392void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6393 ArgStringList &CmdArgs) const {
6394 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006395
Daniel Dunbarc1964212009-03-26 16:23:12 +00006396 // Derived from darwin_arch spec.
6397 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006398 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006399
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006400 // FIXME: Is this needed anymore?
6401 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006402 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006403}
6404
Douglas Katzman95354292015-06-23 20:42:09 +00006405bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006406 // We only need to generate a temp path for LTO if we aren't compiling object
6407 // files. When compiling source files, we run 'dsymutil' after linking. We
6408 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006409 for (const auto &Input : Inputs)
6410 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006411 return true;
6412
6413 return false;
6414}
6415
Douglas Katzman95354292015-06-23 20:42:09 +00006416void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6417 ArgStringList &CmdArgs,
6418 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006419 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006420 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006421
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006422 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006423 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6424 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006425 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6426 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006427 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006428 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006429 }
6430
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006431 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006432 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006433 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6434 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006435
Bob Wilson3d27dad2013-08-02 22:25:34 +00006436 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6437 CmdArgs.push_back("-export_dynamic");
6438
Bob Wilsonb111ec92015-03-02 19:01:14 +00006439 // If we are using App Extension restrictions, pass a flag to the linker
6440 // telling it that the compiled code has been audited.
6441 if (Args.hasFlag(options::OPT_fapplication_extension,
6442 options::OPT_fno_application_extension, false))
6443 CmdArgs.push_back("-application_extension");
6444
Bill Wendling313b6bf2012-11-16 23:03:00 +00006445 // If we are using LTO, then automatically create a temporary file path for
6446 // the linker to use, so that it's lifetime will extend past a possible
6447 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006448 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006449 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006450 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006451 C.addTempFile(TmpPath);
6452 CmdArgs.push_back("-object_path_lto");
6453 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006454 }
6455
Daniel Dunbarc1964212009-03-26 16:23:12 +00006456 // Derived from the "link" spec.
6457 Args.AddAllArgs(CmdArgs, options::OPT_static);
6458 if (!Args.hasArg(options::OPT_static))
6459 CmdArgs.push_back("-dynamic");
6460 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6461 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6462 // here. How do we wish to handle such things?
6463 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006464
Daniel Dunbarc1964212009-03-26 16:23:12 +00006465 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006466 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006467 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006468 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006469
6470 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6471 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6472 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6473
6474 Arg *A;
6475 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6476 (A = Args.getLastArg(options::OPT_current__version)) ||
6477 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006478 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6479 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006480
6481 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6482 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6483 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6484 } else {
6485 CmdArgs.push_back("-dylib");
6486
6487 Arg *A;
6488 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6489 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6490 (A = Args.getLastArg(options::OPT_client__name)) ||
6491 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6492 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6493 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006494 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6495 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006496
Daniel Dunbarc1964212009-03-26 16:23:12 +00006497 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6498 "-dylib_compatibility_version");
6499 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6500 "-dylib_current_version");
6501
Tim Northover157d9112014-01-16 08:48:16 +00006502 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006503
6504 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6505 "-dylib_install_name");
6506 }
6507
6508 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6509 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6510 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006511 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006512 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006513 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6514 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6515 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6516 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6517 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6518 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006519 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006520 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6521 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6522 Args.AddAllArgs(CmdArgs, options::OPT_init);
6523
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006524 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006525 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006526
Daniel Dunbarc1964212009-03-26 16:23:12 +00006527 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6528 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6529 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6530 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6531 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006532
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006533 if (const Arg *A =
6534 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6535 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006536 if (A->getOption().matches(options::OPT_fpie) ||
6537 A->getOption().matches(options::OPT_fPIE))
6538 CmdArgs.push_back("-pie");
6539 else
6540 CmdArgs.push_back("-no_pie");
6541 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006542
6543 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6544 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6545 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6546 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6547 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6548 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6549 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6550 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6551 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6552 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6553 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6554 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6555 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6556 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6557 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6558 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006559
Daniel Dunbar84384642011-05-02 21:03:47 +00006560 // Give --sysroot= preference, over the Apple specific behavior to also use
6561 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006562 StringRef sysroot = C.getSysRoot();
6563 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006564 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006565 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006566 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6567 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006568 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006569 }
6570
Daniel Dunbarc1964212009-03-26 16:23:12 +00006571 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6572 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6573 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6574 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6575 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006576 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006577 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6578 Args.AddAllArgs(CmdArgs, options::OPT_y);
6579 Args.AddLastArg(CmdArgs, options::OPT_w);
6580 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6581 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6582 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6583 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6584 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6585 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6586 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6587 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6588 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6589 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6590 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6591 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6592}
6593
Douglas Katzman95354292015-06-23 20:42:09 +00006594void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6595 const InputInfo &Output,
6596 const InputInfoList &Inputs,
6597 const ArgList &Args,
6598 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006599 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006600
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006601 // If the number of arguments surpasses the system limits, we will encode the
6602 // input files in a separate file, shortening the command line. To this end,
6603 // build a list of input file names that can be passed via a file with the
6604 // -filelist linker option.
6605 llvm::opt::ArgStringList InputFileList;
6606
Daniel Dunbarc1964212009-03-26 16:23:12 +00006607 // The logic here is derived from gcc's behavior; most of which
6608 // comes from specs (starting with link_command). Consult gcc for
6609 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006610 ArgStringList CmdArgs;
6611
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006612 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6613 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6614 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006615 for (const auto &Arg : Args)
6616 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006617 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006618 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006619 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006620 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006621 return;
6622 }
6623
Daniel Dunbarc1964212009-03-26 16:23:12 +00006624 // I'm not sure why this particular decomposition exists in gcc, but
6625 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006626 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006627
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006628 // It seems that the 'e' option is completely ignored for dynamic executables
6629 // (the default), and with static executables, the last one wins, as expected.
6630 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6631 options::OPT_Z_Flag, options::OPT_u_Group,
6632 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006633
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006634 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6635 // members of static archive libraries which implement Objective-C classes or
6636 // categories.
6637 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6638 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006639
Daniel Dunbarc1964212009-03-26 16:23:12 +00006640 CmdArgs.push_back("-o");
6641 CmdArgs.push_back(Output.getFilename());
6642
Chad Rosier06fd3c62012-05-16 23:45:12 +00006643 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006644 !Args.hasArg(options::OPT_nostartfiles))
6645 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006646
Peter Collingbournec4122c12015-06-15 21:08:13 +00006647 // SafeStack requires its own runtime libraries
6648 // These libraries should be linked first, to make sure the
6649 // __safestack_init constructor executes before everything else
6650 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6651 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6652 "libclang_rt.safestack_osx.a",
6653 /*AlwaysLink=*/true);
6654 }
6655
Daniel Dunbarc1964212009-03-26 16:23:12 +00006656 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006657
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006658 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6659 options::OPT_fno_openmp, false)) {
6660 switch (getOpenMPRuntime(getToolChain(), Args)) {
6661 case OMPRT_OMP:
6662 CmdArgs.push_back("-lomp");
6663 break;
6664 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006665 CmdArgs.push_back("-lgomp");
6666 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006667 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006668 CmdArgs.push_back("-liomp5");
6669 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006670 case OMPRT_Unknown:
6671 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006672 break;
6673 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006674 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006675
Douglas Gregor9295df02012-05-15 21:00:27 +00006676 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006677 // Build the input file for -filelist (list of linker input files) in case we
6678 // need it later
6679 for (const auto &II : Inputs) {
6680 if (!II.isFilename()) {
6681 // This is a linker input argument.
6682 // We cannot mix input arguments and file names in a -filelist input, thus
6683 // we prematurely stop our list (remaining files shall be passed as
6684 // arguments).
6685 if (InputFileList.size() > 0)
6686 break;
6687
6688 continue;
6689 }
6690
6691 InputFileList.push_back(II.getFilename());
6692 }
6693
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006694 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006695 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006696 // We use arclite library for both ARC and subscripting support.
6697 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6698
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006699 CmdArgs.push_back("-framework");
6700 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006701 // Link libobj.
6702 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006703 }
John McCall31168b02011-06-15 23:02:42 +00006704
Daniel Dunbarc1964212009-03-26 16:23:12 +00006705 if (LinkingOutput) {
6706 CmdArgs.push_back("-arch_multiple");
6707 CmdArgs.push_back("-final_output");
6708 CmdArgs.push_back(LinkingOutput);
6709 }
6710
Daniel Dunbarc1964212009-03-26 16:23:12 +00006711 if (Args.hasArg(options::OPT_fnested_functions))
6712 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006713
Justin Bognerc7701242015-05-12 05:44:36 +00006714 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6715 // paths are different enough from other toolchains that this needs a fair
6716 // amount of refactoring done first.
6717 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6718
Daniel Dunbarc1964212009-03-26 16:23:12 +00006719 if (!Args.hasArg(options::OPT_nostdlib) &&
6720 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006721 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006722 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006723
Daniel Dunbarc1964212009-03-26 16:23:12 +00006724 // link_ssp spec is empty.
6725
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006726 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006727 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006728 }
6729
Chad Rosier06fd3c62012-05-16 23:45:12 +00006730 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006731 !Args.hasArg(options::OPT_nostartfiles)) {
6732 // endfile_spec is empty.
6733 }
6734
6735 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6736 Args.AddAllArgs(CmdArgs, options::OPT_F);
6737
Steven Wu3ffb61b2015-02-06 18:08:29 +00006738 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006739 for (const Arg *A : Args.filtered(options::OPT_iframework))
6740 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006741
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006742 if (!Args.hasArg(options::OPT_nostdlib) &&
6743 !Args.hasArg(options::OPT_nodefaultlibs)) {
6744 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6745 if (A->getValue() == StringRef("Accelerate")) {
6746 CmdArgs.push_back("-framework");
6747 CmdArgs.push_back("Accelerate");
6748 }
6749 }
6750 }
6751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006752 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006753 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006754 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006755 Cmd->setInputFileList(std::move(InputFileList));
6756 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006757}
6758
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006759void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006760 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006761 const InputInfoList &Inputs,
6762 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006763 const char *LinkingOutput) const {
6764 ArgStringList CmdArgs;
6765
6766 CmdArgs.push_back("-create");
6767 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006768
6769 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006770 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006771
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006772 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006773 assert(II.isFilename() && "Unexpected lipo input.");
6774 CmdArgs.push_back(II.getFilename());
6775 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006776
6777 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006778 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006779}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006780
Daniel Dunbar88299622010-06-04 18:28:36 +00006781void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006782 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006783 const InputInfoList &Inputs,
6784 const ArgList &Args,
6785 const char *LinkingOutput) const {
6786 ArgStringList CmdArgs;
6787
Daniel Dunbareb86b042011-05-09 17:23:16 +00006788 CmdArgs.push_back("-o");
6789 CmdArgs.push_back(Output.getFilename());
6790
Daniel Dunbar88299622010-06-04 18:28:36 +00006791 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6792 const InputInfo &Input = Inputs[0];
6793 assert(Input.isFilename() && "Unexpected dsymutil input.");
6794 CmdArgs.push_back(Input.getFilename());
6795
Daniel Dunbar88299622010-06-04 18:28:36 +00006796 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006797 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006799}
6800
Eric Christopher551ef452011-08-23 17:56:55 +00006801void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006802 const InputInfo &Output,
6803 const InputInfoList &Inputs,
6804 const ArgList &Args,
6805 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006806 ArgStringList CmdArgs;
6807 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006808 CmdArgs.push_back("--debug-info");
6809 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006810 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006811
6812 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6813 const InputInfo &Input = Inputs[0];
6814 assert(Input.isFilename() && "Unexpected verify input");
6815
6816 // Grabbing the output of the earlier dsymutil run.
6817 CmdArgs.push_back(Input.getFilename());
6818
6819 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006820 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006822}
6823
Douglas Katzman95354292015-06-23 20:42:09 +00006824void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006825 const InputInfo &Output,
6826 const InputInfoList &Inputs,
6827 const ArgList &Args,
6828 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006829 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006830 ArgStringList CmdArgs;
6831
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006832 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006833
6834 CmdArgs.push_back("-o");
6835 CmdArgs.push_back(Output.getFilename());
6836
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006837 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006838 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006839
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006840 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006841 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006842}
6843
Douglas Katzman95354292015-06-23 20:42:09 +00006844void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6845 const InputInfo &Output,
6846 const InputInfoList &Inputs,
6847 const ArgList &Args,
6848 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006849 ArgStringList CmdArgs;
6850
David Chisnall272a0712012-02-29 15:06:12 +00006851 // Demangle C++ names in errors
6852 CmdArgs.push_back("-C");
6853
David Chisnallf571cde2012-02-15 13:39:01 +00006854 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6855 (!Args.hasArg(options::OPT_shared))) {
6856 CmdArgs.push_back("-e");
6857 CmdArgs.push_back("_start");
6858 }
6859
6860 if (Args.hasArg(options::OPT_static)) {
6861 CmdArgs.push_back("-Bstatic");
6862 CmdArgs.push_back("-dn");
6863 } else {
6864 CmdArgs.push_back("-Bdynamic");
6865 if (Args.hasArg(options::OPT_shared)) {
6866 CmdArgs.push_back("-shared");
6867 } else {
6868 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006869 CmdArgs.push_back(
6870 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006871 }
6872 }
6873
6874 if (Output.isFilename()) {
6875 CmdArgs.push_back("-o");
6876 CmdArgs.push_back(Output.getFilename());
6877 } else {
6878 assert(Output.isNothing() && "Invalid output.");
6879 }
6880
6881 if (!Args.hasArg(options::OPT_nostdlib) &&
6882 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006883 if (!Args.hasArg(options::OPT_shared))
6884 CmdArgs.push_back(
6885 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6886
6887 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6888 CmdArgs.push_back(
6889 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6890 CmdArgs.push_back(
6891 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6892
Hans Wennborg70850d82013-07-18 20:29:38 +00006893 if (getToolChain().getDriver().CCCIsCXX())
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006894 CmdArgs.push_back(
6895 Args.MakeArgString(getToolChain().GetFilePath("cxa_finalize.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006896 }
6897
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006898 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6899 for (const auto &Path : Paths)
6900 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006901
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006902 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6903 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006904
6905 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6906
6907 if (!Args.hasArg(options::OPT_nostdlib) &&
6908 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006909 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006910 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006911 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006912 if (!Args.hasArg(options::OPT_shared)) {
6913 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006914 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006915 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006916 }
David Chisnallf571cde2012-02-15 13:39:01 +00006917 }
6918
6919 if (!Args.hasArg(options::OPT_nostdlib) &&
6920 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006921 CmdArgs.push_back(
6922 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006923 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006924 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006925
Alexey Samsonov7811d192014-02-20 13:57:37 +00006926 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006927
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006928 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006929 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006930}
6931
Douglas Katzman95354292015-06-23 20:42:09 +00006932void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6933 const InputInfo &Output,
6934 const InputInfoList &Inputs,
6935 const ArgList &Args,
6936 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006937 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006938 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006939 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006940
Rafael Espindolacc126272014-02-28 01:55:21 +00006941 switch (getToolChain().getArch()) {
6942 case llvm::Triple::x86:
6943 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6944 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006945 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006946 break;
6947
6948 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006949 CmdArgs.push_back("-mppc");
6950 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006951 break;
6952
6953 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006954 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006955 CmdArgs.push_back("-32");
6956 NeedsKPIC = true;
6957 break;
6958
6959 case llvm::Triple::sparcv9:
6960 CmdArgs.push_back("-64");
6961 CmdArgs.push_back("-Av9a");
6962 NeedsKPIC = true;
6963 break;
6964
6965 case llvm::Triple::mips64:
6966 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006967 StringRef CPUName;
6968 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006969 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006970
6971 CmdArgs.push_back("-mabi");
6972 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6973
6974 if (getToolChain().getArch() == llvm::Triple::mips64)
6975 CmdArgs.push_back("-EB");
6976 else
6977 CmdArgs.push_back("-EL");
6978
Rafael Espindolacc126272014-02-28 01:55:21 +00006979 NeedsKPIC = true;
6980 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006981 }
6982
Rafael Espindolacc126272014-02-28 01:55:21 +00006983 default:
6984 break;
6985 }
6986
6987 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006988 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00006989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006990 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006991
6992 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006993 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006994
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006995 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006996 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006997
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006998 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006999 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007000}
7001
Douglas Katzman95354292015-06-23 20:42:09 +00007002void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7003 const InputInfo &Output,
7004 const InputInfoList &Inputs,
7005 const ArgList &Args,
7006 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007007 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007008 ArgStringList CmdArgs;
7009
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007010 // Silence warning for "clang -g foo.o -o foo"
7011 Args.ClaimAllArgs(options::OPT_g_Group);
7012 // and "clang -emit-llvm foo.o -o foo"
7013 Args.ClaimAllArgs(options::OPT_emit_llvm);
7014 // and for "clang -w foo.o -o foo". Other warning options are already
7015 // handled somewhere else.
7016 Args.ClaimAllArgs(options::OPT_w);
7017
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007018 if (getToolChain().getArch() == llvm::Triple::mips64)
7019 CmdArgs.push_back("-EB");
7020 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7021 CmdArgs.push_back("-EL");
7022
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007023 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007024 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007025 CmdArgs.push_back("-e");
7026 CmdArgs.push_back("__start");
7027 }
7028
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007029 if (Args.hasArg(options::OPT_static)) {
7030 CmdArgs.push_back("-Bstatic");
7031 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007032 if (Args.hasArg(options::OPT_rdynamic))
7033 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007034 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007035 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007036 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007037 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007038 } else {
7039 CmdArgs.push_back("-dynamic-linker");
7040 CmdArgs.push_back("/usr/libexec/ld.so");
7041 }
7042 }
7043
Rafael Espindola044f7832013-06-05 04:28:55 +00007044 if (Args.hasArg(options::OPT_nopie))
7045 CmdArgs.push_back("-nopie");
7046
Daniel Dunbarb440f562010-08-02 02:38:21 +00007047 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007048 CmdArgs.push_back("-o");
7049 CmdArgs.push_back(Output.getFilename());
7050 } else {
7051 assert(Output.isNothing() && "Invalid output.");
7052 }
7053
7054 if (!Args.hasArg(options::OPT_nostdlib) &&
7055 !Args.hasArg(options::OPT_nostartfiles)) {
7056 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007057 if (Args.hasArg(options::OPT_pg))
7058 CmdArgs.push_back(
7059 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007060 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007061 CmdArgs.push_back(
7062 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7063 CmdArgs.push_back(
7064 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007065 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007066 CmdArgs.push_back(
7067 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007068 }
7069 }
7070
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007071 std::string Triple = getToolChain().getTripleString();
7072 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007073 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007074 CmdArgs.push_back(
7075 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007076
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007077 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7078 options::OPT_e, options::OPT_s, options::OPT_t,
7079 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007080
Daniel Dunbar54423b22010-09-17 00:24:54 +00007081 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007082
7083 if (!Args.hasArg(options::OPT_nostdlib) &&
7084 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007085 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007086 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007087 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007088 CmdArgs.push_back("-lm_p");
7089 else
7090 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007091 }
7092
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007093 // FIXME: For some reason GCC passes -lgcc before adding
7094 // the default system libraries. Just mimic this for now.
7095 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007096
Eric Christopher17674ec2012-09-13 06:32:34 +00007097 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007098 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7099 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007100 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007101 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007102 }
7103
Chandler Carruth45661652011-12-17 22:32:42 +00007104 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007105 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007106 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007107 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007108 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007109 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007110
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007111 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007112 }
7113
7114 if (!Args.hasArg(options::OPT_nostdlib) &&
7115 !Args.hasArg(options::OPT_nostartfiles)) {
7116 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007117 CmdArgs.push_back(
7118 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007119 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007120 CmdArgs.push_back(
7121 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007122 }
7123
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007124 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007125 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007126}
Ed Schoutene33194b2009-04-02 19:13:12 +00007127
Douglas Katzman95354292015-06-23 20:42:09 +00007128void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7129 const InputInfo &Output,
7130 const InputInfoList &Inputs,
7131 const ArgList &Args,
7132 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007133 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007134 ArgStringList CmdArgs;
7135
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007136 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007137
7138 CmdArgs.push_back("-o");
7139 CmdArgs.push_back(Output.getFilename());
7140
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007141 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007142 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007143
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007144 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007145 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007146}
7147
Douglas Katzman95354292015-06-23 20:42:09 +00007148void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7149 const InputInfo &Output,
7150 const InputInfoList &Inputs,
7151 const ArgList &Args,
7152 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007153 const Driver &D = getToolChain().getDriver();
7154 ArgStringList CmdArgs;
7155
7156 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7157 (!Args.hasArg(options::OPT_shared))) {
7158 CmdArgs.push_back("-e");
7159 CmdArgs.push_back("__start");
7160 }
7161
7162 if (Args.hasArg(options::OPT_static)) {
7163 CmdArgs.push_back("-Bstatic");
7164 } else {
7165 if (Args.hasArg(options::OPT_rdynamic))
7166 CmdArgs.push_back("-export-dynamic");
7167 CmdArgs.push_back("--eh-frame-hdr");
7168 CmdArgs.push_back("-Bdynamic");
7169 if (Args.hasArg(options::OPT_shared)) {
7170 CmdArgs.push_back("-shared");
7171 } else {
7172 CmdArgs.push_back("-dynamic-linker");
7173 CmdArgs.push_back("/usr/libexec/ld.so");
7174 }
7175 }
7176
7177 if (Output.isFilename()) {
7178 CmdArgs.push_back("-o");
7179 CmdArgs.push_back(Output.getFilename());
7180 } else {
7181 assert(Output.isNothing() && "Invalid output.");
7182 }
7183
7184 if (!Args.hasArg(options::OPT_nostdlib) &&
7185 !Args.hasArg(options::OPT_nostartfiles)) {
7186 if (!Args.hasArg(options::OPT_shared)) {
7187 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007188 CmdArgs.push_back(
7189 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007190 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007191 CmdArgs.push_back(
7192 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7193 CmdArgs.push_back(
7194 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007195 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007196 CmdArgs.push_back(
7197 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007198 }
7199 }
7200
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007201 Args.AddAllArgs(CmdArgs,
7202 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007203
7204 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7205
7206 if (!Args.hasArg(options::OPT_nostdlib) &&
7207 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007208 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007209 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7210 if (Args.hasArg(options::OPT_pg))
7211 CmdArgs.push_back("-lm_p");
7212 else
7213 CmdArgs.push_back("-lm");
7214 }
7215
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007216 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007217 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007218 CmdArgs.push_back("-lpthread_p");
7219 else
7220 CmdArgs.push_back("-lpthread");
7221 }
7222
Eli Friedman9fa28852012-08-08 23:57:20 +00007223 if (!Args.hasArg(options::OPT_shared)) {
7224 if (Args.hasArg(options::OPT_pg))
7225 CmdArgs.push_back("-lc_p");
7226 else
7227 CmdArgs.push_back("-lc");
7228 }
7229
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007230 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007231 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007232 case llvm::Triple::arm:
7233 MyArch = "arm";
7234 break;
7235 case llvm::Triple::x86:
7236 MyArch = "i386";
7237 break;
7238 case llvm::Triple::x86_64:
7239 MyArch = "amd64";
7240 break;
7241 default:
7242 llvm_unreachable("Unsupported architecture");
7243 }
7244 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007245 }
7246
7247 if (!Args.hasArg(options::OPT_nostdlib) &&
7248 !Args.hasArg(options::OPT_nostartfiles)) {
7249 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007250 CmdArgs.push_back(
7251 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007252 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007253 CmdArgs.push_back(
7254 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007255 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007256
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007257 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007258 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007259}
7260
Douglas Katzman95354292015-06-23 20:42:09 +00007261void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7262 const InputInfo &Output,
7263 const InputInfoList &Inputs,
7264 const ArgList &Args,
7265 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007266 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007267 ArgStringList CmdArgs;
7268
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007269 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7270 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007271 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007272 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007273 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007274 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007275 else if (getToolChain().getArch() == llvm::Triple::mips ||
7276 getToolChain().getArch() == llvm::Triple::mipsel ||
7277 getToolChain().getArch() == llvm::Triple::mips64 ||
7278 getToolChain().getArch() == llvm::Triple::mips64el) {
7279 StringRef CPUName;
7280 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007281 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007282
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007283 CmdArgs.push_back("-march");
7284 CmdArgs.push_back(CPUName.data());
7285
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007286 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007287 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007288
7289 if (getToolChain().getArch() == llvm::Triple::mips ||
7290 getToolChain().getArch() == llvm::Triple::mips64)
7291 CmdArgs.push_back("-EB");
7292 else
7293 CmdArgs.push_back("-EL");
7294
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007295 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007296 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007297 getToolChain().getArch() == llvm::Triple::armeb ||
7298 getToolChain().getArch() == llvm::Triple::thumb ||
7299 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007300 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007301 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007302 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7303
7304 if (FloatABI == "hard") {
7305 CmdArgs.push_back("-mfpu=vfp");
7306 } else {
7307 CmdArgs.push_back("-mfpu=softvfp");
7308 }
7309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007310 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007311 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007312 case llvm::Triple::GNUEABI:
7313 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007314 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007315 break;
7316
7317 default:
7318 CmdArgs.push_back("-matpcs");
7319 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007320 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007321 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007322 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007323 if (getToolChain().getArch() == llvm::Triple::sparc)
7324 CmdArgs.push_back("-Av8plusa");
7325 else
7326 CmdArgs.push_back("-Av9a");
7327
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007328 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007329 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007331 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007332
7333 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007334 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007335
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007336 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007337 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007338
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007339 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007340 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007341}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007342
Douglas Katzman95354292015-06-23 20:42:09 +00007343void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7344 const InputInfo &Output,
7345 const InputInfoList &Inputs,
7346 const ArgList &Args,
7347 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007348 const toolchains::FreeBSD &ToolChain =
7349 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007350 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007351 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007352 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007353 !Args.hasArg(options::OPT_shared) &&
7354 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007355 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007356
7357 // Silence warning for "clang -g foo.o -o foo"
7358 Args.ClaimAllArgs(options::OPT_g_Group);
7359 // and "clang -emit-llvm foo.o -o foo"
7360 Args.ClaimAllArgs(options::OPT_emit_llvm);
7361 // and for "clang -w foo.o -o foo". Other warning options are already
7362 // handled somewhere else.
7363 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007364
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007365 if (!D.SysRoot.empty())
7366 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7367
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007368 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007369 CmdArgs.push_back("-pie");
7370
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007371 if (Args.hasArg(options::OPT_static)) {
7372 CmdArgs.push_back("-Bstatic");
7373 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007374 if (Args.hasArg(options::OPT_rdynamic))
7375 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007376 CmdArgs.push_back("--eh-frame-hdr");
7377 if (Args.hasArg(options::OPT_shared)) {
7378 CmdArgs.push_back("-Bshareable");
7379 } else {
7380 CmdArgs.push_back("-dynamic-linker");
7381 CmdArgs.push_back("/libexec/ld-elf.so.1");
7382 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007383 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007384 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7385 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7386 CmdArgs.push_back("--hash-style=both");
7387 }
7388 }
7389 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007390 }
7391
7392 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7393 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007394 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007395 CmdArgs.push_back("-m");
7396 CmdArgs.push_back("elf_i386_fbsd");
7397 }
7398
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007399 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007400 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007401 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007402 }
7403
Daniel Dunbarb440f562010-08-02 02:38:21 +00007404 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007405 CmdArgs.push_back("-o");
7406 CmdArgs.push_back(Output.getFilename());
7407 } else {
7408 assert(Output.isNothing() && "Invalid output.");
7409 }
7410
7411 if (!Args.hasArg(options::OPT_nostdlib) &&
7412 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007413 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007414 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007415 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007416 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007417 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007418 crt1 = "Scrt1.o";
7419 else
7420 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007421 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007422 if (crt1)
7423 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7424
7425 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7426
Craig Topper92fc2df2014-05-17 16:56:41 +00007427 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007428 if (Args.hasArg(options::OPT_static))
7429 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007430 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007431 crtbegin = "crtbeginS.o";
7432 else
7433 crtbegin = "crtbegin.o";
7434
7435 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007436 }
7437
7438 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007439 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007440 for (const auto &Path : Paths)
7441 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007442 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7443 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007444 Args.AddAllArgs(CmdArgs, options::OPT_s);
7445 Args.AddAllArgs(CmdArgs, options::OPT_t);
7446 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7447 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007448
Alexey Samsonov907880e2015-06-19 19:57:46 +00007449 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007450 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007451
Alexey Samsonov52550342014-09-15 19:58:40 +00007452 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007453 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007454
7455 if (!Args.hasArg(options::OPT_nostdlib) &&
7456 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007457 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007458 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007459 if (Args.hasArg(options::OPT_pg))
7460 CmdArgs.push_back("-lm_p");
7461 else
7462 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007463 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007464 if (NeedsSanitizerDeps)
7465 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007466 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7467 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007468 if (Args.hasArg(options::OPT_pg))
7469 CmdArgs.push_back("-lgcc_p");
7470 else
7471 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007472 if (Args.hasArg(options::OPT_static)) {
7473 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007474 } else if (Args.hasArg(options::OPT_pg)) {
7475 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007476 } else {
7477 CmdArgs.push_back("--as-needed");
7478 CmdArgs.push_back("-lgcc_s");
7479 CmdArgs.push_back("--no-as-needed");
7480 }
7481
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007482 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007483 if (Args.hasArg(options::OPT_pg))
7484 CmdArgs.push_back("-lpthread_p");
7485 else
7486 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007487 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007488
Roman Divacky66f22762011-02-10 16:59:40 +00007489 if (Args.hasArg(options::OPT_pg)) {
7490 if (Args.hasArg(options::OPT_shared))
7491 CmdArgs.push_back("-lc");
7492 else
7493 CmdArgs.push_back("-lc_p");
7494 CmdArgs.push_back("-lgcc_p");
7495 } else {
7496 CmdArgs.push_back("-lc");
7497 CmdArgs.push_back("-lgcc");
7498 }
7499
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007500 if (Args.hasArg(options::OPT_static)) {
7501 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007502 } else if (Args.hasArg(options::OPT_pg)) {
7503 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007504 } else {
7505 CmdArgs.push_back("--as-needed");
7506 CmdArgs.push_back("-lgcc_s");
7507 CmdArgs.push_back("--no-as-needed");
7508 }
7509 }
7510
7511 if (!Args.hasArg(options::OPT_nostdlib) &&
7512 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007513 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007514 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007515 else
7516 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007517 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007518 }
7519
Alexey Samsonov7811d192014-02-20 13:57:37 +00007520 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007522 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007523 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007524}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007525
Douglas Katzman95354292015-06-23 20:42:09 +00007526void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007527 const InputInfo &Output,
7528 const InputInfoList &Inputs,
7529 const ArgList &Args,
7530 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007531 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007532 ArgStringList CmdArgs;
7533
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007534 // GNU as needs different flags for creating the correct output format
7535 // on architectures with different ABIs or optional feature sets.
7536 switch (getToolChain().getArch()) {
7537 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007538 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007539 break;
7540 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007541 case llvm::Triple::armeb:
7542 case llvm::Triple::thumb:
7543 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007544 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007545 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7546 std::string Arch =
7547 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007548 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007549 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007550 }
7551
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007552 case llvm::Triple::mips:
7553 case llvm::Triple::mipsel:
7554 case llvm::Triple::mips64:
7555 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007556 StringRef CPUName;
7557 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007558 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007559
7560 CmdArgs.push_back("-march");
7561 CmdArgs.push_back(CPUName.data());
7562
7563 CmdArgs.push_back("-mabi");
7564 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7565
7566 if (getToolChain().getArch() == llvm::Triple::mips ||
7567 getToolChain().getArch() == llvm::Triple::mips64)
7568 CmdArgs.push_back("-EB");
7569 else
7570 CmdArgs.push_back("-EL");
7571
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007572 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007573 break;
7574 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007575
7576 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007577 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007578 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007579 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007580 break;
7581
7582 case llvm::Triple::sparcv9:
7583 CmdArgs.push_back("-64");
7584 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007585 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007586 break;
7587
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007588 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007589 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007590 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007591
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007592 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007593
7594 CmdArgs.push_back("-o");
7595 CmdArgs.push_back(Output.getFilename());
7596
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007597 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007598 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007599
David Chisnallddbd68f2011-09-27 22:03:18 +00007600 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007601 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007602}
7603
Douglas Katzman95354292015-06-23 20:42:09 +00007604void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7605 const InputInfo &Output,
7606 const InputInfoList &Inputs,
7607 const ArgList &Args,
7608 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007609 const Driver &D = getToolChain().getDriver();
7610 ArgStringList CmdArgs;
7611
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007612 if (!D.SysRoot.empty())
7613 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7614
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007615 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007616 if (Args.hasArg(options::OPT_static)) {
7617 CmdArgs.push_back("-Bstatic");
7618 } else {
7619 if (Args.hasArg(options::OPT_rdynamic))
7620 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007621 if (Args.hasArg(options::OPT_shared)) {
7622 CmdArgs.push_back("-Bshareable");
7623 } else {
7624 CmdArgs.push_back("-dynamic-linker");
7625 CmdArgs.push_back("/libexec/ld.elf_so");
7626 }
7627 }
7628
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007629 // Many NetBSD architectures support more than one ABI.
7630 // Determine the correct emulation for ld.
7631 switch (getToolChain().getArch()) {
7632 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007633 CmdArgs.push_back("-m");
7634 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007635 break;
7636 case llvm::Triple::arm:
7637 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007638 CmdArgs.push_back("-m");
7639 switch (getToolChain().getTriple().getEnvironment()) {
7640 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007641 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007642 CmdArgs.push_back("armelf_nbsd_eabi");
7643 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007644 case llvm::Triple::EABIHF:
7645 case llvm::Triple::GNUEABIHF:
7646 CmdArgs.push_back("armelf_nbsd_eabihf");
7647 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007648 default:
7649 CmdArgs.push_back("armelf_nbsd");
7650 break;
7651 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007652 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007653 case llvm::Triple::armeb:
7654 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007655 arm::appendEBLinkFlags(
7656 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007657 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007658 CmdArgs.push_back("-m");
7659 switch (getToolChain().getTriple().getEnvironment()) {
7660 case llvm::Triple::EABI:
7661 case llvm::Triple::GNUEABI:
7662 CmdArgs.push_back("armelfb_nbsd_eabi");
7663 break;
7664 case llvm::Triple::EABIHF:
7665 case llvm::Triple::GNUEABIHF:
7666 CmdArgs.push_back("armelfb_nbsd_eabihf");
7667 break;
7668 default:
7669 CmdArgs.push_back("armelfb_nbsd");
7670 break;
7671 }
7672 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007673 case llvm::Triple::mips64:
7674 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007675 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007676 CmdArgs.push_back("-m");
7677 if (getToolChain().getArch() == llvm::Triple::mips64)
7678 CmdArgs.push_back("elf32btsmip");
7679 else
7680 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007681 } else if (mips::hasMipsAbiArg(Args, "64")) {
7682 CmdArgs.push_back("-m");
7683 if (getToolChain().getArch() == llvm::Triple::mips64)
7684 CmdArgs.push_back("elf64btsmip");
7685 else
7686 CmdArgs.push_back("elf64ltsmip");
7687 }
7688 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007689 case llvm::Triple::ppc:
7690 CmdArgs.push_back("-m");
7691 CmdArgs.push_back("elf32ppc_nbsd");
7692 break;
7693
7694 case llvm::Triple::ppc64:
7695 case llvm::Triple::ppc64le:
7696 CmdArgs.push_back("-m");
7697 CmdArgs.push_back("elf64ppc");
7698 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007699
7700 case llvm::Triple::sparc:
7701 CmdArgs.push_back("-m");
7702 CmdArgs.push_back("elf32_sparc");
7703 break;
7704
7705 case llvm::Triple::sparcv9:
7706 CmdArgs.push_back("-m");
7707 CmdArgs.push_back("elf64_sparc");
7708 break;
7709
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007710 default:
7711 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007712 }
7713
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007714 if (Output.isFilename()) {
7715 CmdArgs.push_back("-o");
7716 CmdArgs.push_back(Output.getFilename());
7717 } else {
7718 assert(Output.isNothing() && "Invalid output.");
7719 }
7720
7721 if (!Args.hasArg(options::OPT_nostdlib) &&
7722 !Args.hasArg(options::OPT_nostartfiles)) {
7723 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007724 CmdArgs.push_back(
7725 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7726 CmdArgs.push_back(
7727 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7728 CmdArgs.push_back(
7729 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007730 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007731 CmdArgs.push_back(
7732 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7733 CmdArgs.push_back(
7734 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007735 }
7736 }
7737
7738 Args.AddAllArgs(CmdArgs, options::OPT_L);
7739 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7740 Args.AddAllArgs(CmdArgs, options::OPT_e);
7741 Args.AddAllArgs(CmdArgs, options::OPT_s);
7742 Args.AddAllArgs(CmdArgs, options::OPT_t);
7743 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7744 Args.AddAllArgs(CmdArgs, options::OPT_r);
7745
7746 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7747
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007748 unsigned Major, Minor, Micro;
7749 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7750 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007751 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007752 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007753 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007754 case llvm::Triple::arm:
7755 case llvm::Triple::armeb:
7756 case llvm::Triple::thumb:
7757 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007758 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007759 case llvm::Triple::ppc64:
7760 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007761 case llvm::Triple::x86:
7762 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007763 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007764 break;
7765 default:
7766 break;
7767 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007768 }
7769
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007770 if (!Args.hasArg(options::OPT_nostdlib) &&
7771 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007772 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007773 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7774 CmdArgs.push_back("-lm");
7775 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007776 if (Args.hasArg(options::OPT_pthread))
7777 CmdArgs.push_back("-lpthread");
7778 CmdArgs.push_back("-lc");
7779
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007780 if (useLibgcc) {
7781 if (Args.hasArg(options::OPT_static)) {
7782 // libgcc_eh depends on libc, so resolve as much as possible,
7783 // pull in any new requirements from libc and then get the rest
7784 // of libgcc.
7785 CmdArgs.push_back("-lgcc_eh");
7786 CmdArgs.push_back("-lc");
7787 CmdArgs.push_back("-lgcc");
7788 } else {
7789 CmdArgs.push_back("-lgcc");
7790 CmdArgs.push_back("--as-needed");
7791 CmdArgs.push_back("-lgcc_s");
7792 CmdArgs.push_back("--no-as-needed");
7793 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007794 }
7795 }
7796
7797 if (!Args.hasArg(options::OPT_nostdlib) &&
7798 !Args.hasArg(options::OPT_nostartfiles)) {
7799 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007800 CmdArgs.push_back(
7801 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007802 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007803 CmdArgs.push_back(
7804 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7805 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007806 }
7807
Alexey Samsonov7811d192014-02-20 13:57:37 +00007808 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007809
Logan Chieneb9162f2014-06-26 14:23:45 +00007810 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007811 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007812}
7813
Douglas Katzman95354292015-06-23 20:42:09 +00007814void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7815 const InputInfo &Output,
7816 const InputInfoList &Inputs,
7817 const ArgList &Args,
7818 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007819 claimNoWarnArgs(Args);
7820
James Y Knight2db38f32015-08-15 03:45:25 +00007821 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7822 llvm::Triple Triple = llvm::Triple(TripleStr);
7823
Rafael Espindola92b00932010-08-10 00:25:48 +00007824 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007825 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007826
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007827 llvm::Reloc::Model RelocationModel;
7828 unsigned PICLevel;
7829 bool IsPIE;
7830 std::tie(RelocationModel, PICLevel, IsPIE) =
7831 ParsePICArgs(getToolChain(), Triple, Args);
7832
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007833 switch (getToolChain().getArch()) {
7834 default:
7835 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007836 // Add --32/--64 to make sure we get the format we want.
7837 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007838 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007839 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007840 break;
7841 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007842 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7843 CmdArgs.push_back("--x32");
7844 else
7845 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007846 break;
7847 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007848 CmdArgs.push_back("-a32");
7849 CmdArgs.push_back("-mppc");
7850 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007851 break;
7852 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007853 CmdArgs.push_back("-a64");
7854 CmdArgs.push_back("-mppc64");
7855 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007856 break;
7857 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007858 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007859 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007860 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007861 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007862 break;
7863 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007864 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007865 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007866 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007867 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007868 break;
7869 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007870 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007871 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007872 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007873 break;
7874 case llvm::Triple::arm:
7875 case llvm::Triple::armeb:
7876 case llvm::Triple::thumb:
7877 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007878 const llvm::Triple &Triple2 = getToolChain().getTriple();
7879 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007880 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007881 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007882 break;
7883 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007884 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007885 break;
7886 default:
7887 break;
7888 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007889
James Y Knight2db38f32015-08-15 03:45:25 +00007890 StringRef ARMFloatABI =
7891 tools::arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple);
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007892 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007893
7894 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007895
7896 // FIXME: remove krait check when GNU tools support krait cpu
7897 // for now replace it with -march=armv7-a to avoid a lower
7898 // march from being picked in the absence of a cpu flag.
7899 Arg *A;
7900 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007901 StringRef(A->getValue()).lower() == "krait")
7902 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007903 else
7904 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007905 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007906 break;
7907 }
7908 case llvm::Triple::mips:
7909 case llvm::Triple::mipsel:
7910 case llvm::Triple::mips64:
7911 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007912 StringRef CPUName;
7913 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007914 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007915 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007916
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007917 CmdArgs.push_back("-march");
7918 CmdArgs.push_back(CPUName.data());
7919
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007920 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007921 CmdArgs.push_back(ABIName.data());
7922
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007923 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7924 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007925 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007926 CmdArgs.push_back("-mno-shared");
7927
Daniel Sanders379d44b2014-07-16 11:52:23 +00007928 // LLVM doesn't support -mplt yet and acts as if it is always given.
7929 // However, -mplt has no effect with the N64 ABI.
7930 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007931
7932 if (getToolChain().getArch() == llvm::Triple::mips ||
7933 getToolChain().getArch() == llvm::Triple::mips64)
7934 CmdArgs.push_back("-EB");
7935 else
7936 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007937
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007938 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7939 if (StringRef(A->getValue()) == "2008")
7940 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7941 }
7942
Daniel Sanders379d44b2014-07-16 11:52:23 +00007943 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007944 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007945 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7946 options::OPT_mfp64)) {
7947 A->claim();
7948 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007949 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7950 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007951 CmdArgs.push_back("-mfpxx");
7952
7953 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7954 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007955 if (Arg *A =
7956 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007957 if (A->getOption().matches(options::OPT_mips16)) {
7958 A->claim();
7959 A->render(Args, CmdArgs);
7960 } else {
7961 A->claim();
7962 CmdArgs.push_back("-no-mips16");
7963 }
7964 }
7965
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007966 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7967 options::OPT_mno_micromips);
7968 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7969 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7970
Simon Atanasyanbd986632013-11-26 11:58:04 +00007971 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7972 // Do not use AddLastArg because not all versions of MIPS assembler
7973 // support -mmsa / -mno-msa options.
7974 if (A->getOption().matches(options::OPT_mmsa))
7975 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7976 }
7977
Daniel Sanders379d44b2014-07-16 11:52:23 +00007978 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7979 options::OPT_msoft_float);
7980
Toma Tabacub36d6102015-06-11 12:13:18 +00007981 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7982 options::OPT_msingle_float);
7983
Daniel Sanders379d44b2014-07-16 11:52:23 +00007984 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7985 options::OPT_mno_odd_spreg);
7986
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007987 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007988 break;
7989 }
7990 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007991 // Always pass an -march option, since our default of z10 is later
7992 // than the GNU assembler's default.
7993 StringRef CPUName = getSystemZTargetCPU(Args);
7994 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007995 break;
7996 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007997 }
7998
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007999 if (NeedsKPIC) {
8000 if (RelocationModel != llvm::Reloc::Static)
8001 CmdArgs.push_back("-KPIC");
8002 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008003
Renato Golina74bbc72015-07-22 15:32:36 +00008004 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008005 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008006
8007 CmdArgs.push_back("-o");
8008 CmdArgs.push_back(Output.getFilename());
8009
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008010 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008011 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008012
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008013 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008015
8016 // Handle the debug info splitting at object creation time if we're
8017 // creating an object.
8018 // TODO: Currently only works on linux with newer objcopy.
8019 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008020 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008021 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008022 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008023}
8024
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008025static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008026 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008027 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008028 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008029 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8030 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008031 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008032 CmdArgs.push_back("-lgcc");
8033
Logan Chien3d3373c2012-11-19 12:04:11 +00008034 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008035 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008036 CmdArgs.push_back("-lgcc");
8037 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008038 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008039 CmdArgs.push_back("--as-needed");
8040 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008041 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008042 CmdArgs.push_back("--no-as-needed");
8043 }
8044
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008045 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008046 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008047 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008048 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008049
8050 // According to Android ABI, we have to link with libdl if we are
8051 // linking with non-static libgcc.
8052 //
8053 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8054 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8055 if (isAndroid && !StaticLibgcc)
8056 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008057}
8058
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008059static std::string getLinuxDynamicLinker(const ArgList &Args,
8060 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008061 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8062
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008063 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8064 if (ToolChain.getTriple().isArch64Bit())
8065 return "/system/bin/linker64";
8066 else
8067 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008068 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8069 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008070 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008071 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008072 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008073 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008074 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008075 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008076 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8077 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008078 return "/lib/ld-linux-armhf.so.3";
8079 else
8080 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008081 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8082 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008083 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8084 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008085 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008086 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008087 return "/lib/ld-linux.so.3";
8088 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8089 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008090 StringRef CPUName;
8091 StringRef ABIName;
8092 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8093 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8094
8095 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8096 .Case("o32", "/lib")
8097 .Case("n32", "/lib32")
8098 .Case("n64", "/lib64")
8099 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008100 StringRef LibName;
8101 if (mips::isUCLibc(Args))
8102 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8103 else
8104 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008105
8106 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008107 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008108 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008109 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008110 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8111 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008112 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008113 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008114 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8115 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008116 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008117 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008118 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008119 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008120 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008121 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008122 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8123 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008124 else
8125 return "/lib64/ld-linux-x86-64.so.2";
8126}
8127
Renato Golinc4b49242014-02-13 10:01:16 +00008128static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008129 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008130 // Make use of compiler-rt if --rtlib option is used
8131 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8132
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008133 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008134 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008135 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008136 default:
8137 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008138 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008139 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008140 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008141 break;
8142 }
Renato Golinc4b49242014-02-13 10:01:16 +00008143 break;
8144 case ToolChain::RLT_Libgcc:
8145 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8146 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008147 }
8148}
8149
Rafael Espindola1e085772014-08-15 17:14:35 +00008150static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8151 switch (T.getArch()) {
8152 case llvm::Triple::x86:
8153 return "elf_i386";
8154 case llvm::Triple::aarch64:
8155 return "aarch64linux";
8156 case llvm::Triple::aarch64_be:
8157 return "aarch64_be_linux";
8158 case llvm::Triple::arm:
8159 case llvm::Triple::thumb:
8160 return "armelf_linux_eabi";
8161 case llvm::Triple::armeb:
8162 case llvm::Triple::thumbeb:
8163 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8164 case llvm::Triple::ppc:
8165 return "elf32ppclinux";
8166 case llvm::Triple::ppc64:
8167 return "elf64ppc";
8168 case llvm::Triple::ppc64le:
8169 return "elf64lppc";
8170 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008171 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008172 return "elf32_sparc";
8173 case llvm::Triple::sparcv9:
8174 return "elf64_sparc";
8175 case llvm::Triple::mips:
8176 return "elf32btsmip";
8177 case llvm::Triple::mipsel:
8178 return "elf32ltsmip";
8179 case llvm::Triple::mips64:
8180 if (mips::hasMipsAbiArg(Args, "n32"))
8181 return "elf32btsmipn32";
8182 return "elf64btsmip";
8183 case llvm::Triple::mips64el:
8184 if (mips::hasMipsAbiArg(Args, "n32"))
8185 return "elf32ltsmipn32";
8186 return "elf64ltsmip";
8187 case llvm::Triple::systemz:
8188 return "elf64_s390";
8189 case llvm::Triple::x86_64:
8190 if (T.getEnvironment() == llvm::Triple::GNUX32)
8191 return "elf32_x86_64";
8192 return "elf_x86_64";
8193 default:
8194 llvm_unreachable("Unexpected arch");
8195 }
8196}
8197
Douglas Katzman95354292015-06-23 20:42:09 +00008198void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8199 const InputInfo &Output,
8200 const InputInfoList &Inputs,
8201 const ArgList &Args,
8202 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008203 const toolchains::Linux &ToolChain =
8204 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008205 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008206
8207 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8208 llvm::Triple Triple = llvm::Triple(TripleStr);
8209
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008210 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008211 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008212 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008213 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008214 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8215 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008216
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008217 ArgStringList CmdArgs;
8218
Rafael Espindolad1002f62010-11-15 18:28:16 +00008219 // Silence warning for "clang -g foo.o -o foo"
8220 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008221 // and "clang -emit-llvm foo.o -o foo"
8222 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008223 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008224 // handled somewhere else.
8225 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008226
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008227 if (!D.SysRoot.empty())
8228 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008229
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008230 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008231 CmdArgs.push_back("-pie");
8232
Rafael Espindola1c76c592010-11-07 22:57:16 +00008233 if (Args.hasArg(options::OPT_rdynamic))
8234 CmdArgs.push_back("-export-dynamic");
8235
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008236 if (Args.hasArg(options::OPT_s))
8237 CmdArgs.push_back("-s");
8238
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008239 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008240 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008241
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008242 for (const auto &Opt : ToolChain.ExtraOpts)
8243 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008244
8245 if (!Args.hasArg(options::OPT_static)) {
8246 CmdArgs.push_back("--eh-frame-hdr");
8247 }
8248
8249 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008250 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008251
8252 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008253 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8254 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008255 CmdArgs.push_back("-Bstatic");
8256 else
8257 CmdArgs.push_back("-static");
8258 } else if (Args.hasArg(options::OPT_shared)) {
8259 CmdArgs.push_back("-shared");
8260 }
8261
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008262 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8263 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008264 (!Args.hasArg(options::OPT_static) &&
8265 !Args.hasArg(options::OPT_shared))) {
8266 CmdArgs.push_back("-dynamic-linker");
8267 CmdArgs.push_back(Args.MakeArgString(
8268 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8269 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008270
8271 CmdArgs.push_back("-o");
8272 CmdArgs.push_back(Output.getFilename());
8273
Rafael Espindola81937ec2010-12-01 01:52:43 +00008274 if (!Args.hasArg(options::OPT_nostdlib) &&
8275 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008276 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008277 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008278 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008279 if (Args.hasArg(options::OPT_pg))
8280 crt1 = "gcrt1.o";
8281 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008282 crt1 = "Scrt1.o";
8283 else
8284 crt1 = "crt1.o";
8285 }
8286 if (crt1)
8287 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008288
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008289 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8290 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008291
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008292 const char *crtbegin;
8293 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008294 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008295 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008296 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008297 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008298 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008299 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008300 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008301 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008302
8303 // Add crtfastmath.o if available and fast math is enabled.
8304 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008305 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008306
8307 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008308 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008309
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008310 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008311
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008312 for (const auto &Path : Paths)
8313 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008314
Alexey Samsonov907880e2015-06-19 19:57:46 +00008315 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008316 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008317
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008318 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8319 CmdArgs.push_back("--no-demangle");
8320
Alexey Samsonov52550342014-09-15 19:58:40 +00008321 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008322 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008323 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008324 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008325
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008326 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008327 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008328 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008329 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008330 if (OnlyLibstdcxxStatic)
8331 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008332 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008333 if (OnlyLibstdcxxStatic)
8334 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008335 CmdArgs.push_back("-lm");
8336 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008337 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8338 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008339
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008340 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008341 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8342 if (Args.hasArg(options::OPT_static))
8343 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008344
Alexey Samsonov52550342014-09-15 19:58:40 +00008345 if (NeedsSanitizerDeps)
8346 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8347
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008348 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8349 Args.hasArg(options::OPT_pthreads);
8350
8351 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8352 options::OPT_fno_openmp, false)) {
8353 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8354 // FIXME: Does this really make sense for all GNU toolchains?
8355 WantPthread = true;
8356
8357 // Also link the particular OpenMP runtimes.
8358 switch (getOpenMPRuntime(ToolChain, Args)) {
8359 case OMPRT_OMP:
8360 CmdArgs.push_back("-lomp");
8361 break;
8362 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008363 CmdArgs.push_back("-lgomp");
8364
8365 // FIXME: Exclude this for platforms with libgomp that don't require
8366 // librt. Most modern Linux platforms require it, but some may not.
8367 CmdArgs.push_back("-lrt");
8368 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008369 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008370 CmdArgs.push_back("-liomp5");
8371 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008372 case OMPRT_Unknown:
8373 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008374 break;
8375 }
Chandler Carruth01538002013-01-17 13:19:29 +00008376 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008377
Renato Golinc4b49242014-02-13 10:01:16 +00008378 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008379
Richard Smith31d1de22015-05-20 22:48:44 +00008380 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008381 CmdArgs.push_back("-lpthread");
8382
8383 CmdArgs.push_back("-lc");
8384
8385 if (Args.hasArg(options::OPT_static))
8386 CmdArgs.push_back("--end-group");
8387 else
Renato Golinc4b49242014-02-13 10:01:16 +00008388 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008389 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008390
Rafael Espindola81937ec2010-12-01 01:52:43 +00008391 if (!Args.hasArg(options::OPT_nostartfiles)) {
8392 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008393 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008394 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008395 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008396 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008397 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008398 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008399
Rafael Espindola81937ec2010-12-01 01:52:43 +00008400 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008401 if (!isAndroid)
8402 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008403 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008404 }
8405
Justin Bognerd3371d82015-07-17 03:35:54 +00008406 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8407 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008408}
8409
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008410// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8411// for the various SFI requirements like register masking. The assembly tool
8412// inserts the file containing the macros as an input into all the assembly
8413// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008414void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8415 const InputInfo &Output,
8416 const InputInfoList &Inputs,
8417 const ArgList &Args,
8418 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008419 const toolchains::NaClToolChain &ToolChain =
8420 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008421 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8422 "nacl-arm-macros.s");
8423 InputInfoList NewInputs;
8424 NewInputs.push_back(NaClMacros);
8425 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008426 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8427 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008428}
8429
Douglas Katzman750cfc52015-06-29 18:42:16 +00008430// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008431// we use static by default, do not yet support sanitizers or LTO, and a few
8432// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008433// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008434void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8435 const InputInfo &Output,
8436 const InputInfoList &Inputs,
8437 const ArgList &Args,
8438 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008439
Douglas Katzman54366072015-07-27 16:53:08 +00008440 const toolchains::NaClToolChain &ToolChain =
8441 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008442 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008443 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008444 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008445 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008446
8447 ArgStringList CmdArgs;
8448
8449 // Silence warning for "clang -g foo.o -o foo"
8450 Args.ClaimAllArgs(options::OPT_g_Group);
8451 // and "clang -emit-llvm foo.o -o foo"
8452 Args.ClaimAllArgs(options::OPT_emit_llvm);
8453 // and for "clang -w foo.o -o foo". Other warning options are already
8454 // handled somewhere else.
8455 Args.ClaimAllArgs(options::OPT_w);
8456
8457 if (!D.SysRoot.empty())
8458 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8459
8460 if (Args.hasArg(options::OPT_rdynamic))
8461 CmdArgs.push_back("-export-dynamic");
8462
8463 if (Args.hasArg(options::OPT_s))
8464 CmdArgs.push_back("-s");
8465
Douglas Katzman54366072015-07-27 16:53:08 +00008466 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8467 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008468 CmdArgs.push_back("--build-id");
8469
8470 if (!IsStatic)
8471 CmdArgs.push_back("--eh-frame-hdr");
8472
8473 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008474 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008475 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008476 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008477 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008478 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008479 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008480 else if (Arch == llvm::Triple::mipsel)
8481 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008482 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008483 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8484 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008485
8486 if (IsStatic)
8487 CmdArgs.push_back("-static");
8488 else if (Args.hasArg(options::OPT_shared))
8489 CmdArgs.push_back("-shared");
8490
8491 CmdArgs.push_back("-o");
8492 CmdArgs.push_back(Output.getFilename());
8493 if (!Args.hasArg(options::OPT_nostdlib) &&
8494 !Args.hasArg(options::OPT_nostartfiles)) {
8495 if (!Args.hasArg(options::OPT_shared))
8496 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8497 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8498
8499 const char *crtbegin;
8500 if (IsStatic)
8501 crtbegin = "crtbeginT.o";
8502 else if (Args.hasArg(options::OPT_shared))
8503 crtbegin = "crtbeginS.o";
8504 else
8505 crtbegin = "crtbegin.o";
8506 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8507 }
8508
8509 Args.AddAllArgs(CmdArgs, options::OPT_L);
8510 Args.AddAllArgs(CmdArgs, options::OPT_u);
8511
8512 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8513
8514 for (const auto &Path : Paths)
8515 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8516
8517 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8518 CmdArgs.push_back("--no-demangle");
8519
8520 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008522 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008523 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008524 bool OnlyLibstdcxxStatic =
8525 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008526 if (OnlyLibstdcxxStatic)
8527 CmdArgs.push_back("-Bstatic");
8528 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8529 if (OnlyLibstdcxxStatic)
8530 CmdArgs.push_back("-Bdynamic");
8531 CmdArgs.push_back("-lm");
8532 }
8533
8534 if (!Args.hasArg(options::OPT_nostdlib)) {
8535 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8536 // Always use groups, since it has no effect on dynamic libraries.
8537 CmdArgs.push_back("--start-group");
8538 CmdArgs.push_back("-lc");
8539 // NaCl's libc++ currently requires libpthread, so just always include it
8540 // in the group for C++.
8541 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008542 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008543 // Gold, used by Mips, handles nested groups differently than ld, and
8544 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8545 // which is not a desired behaviour here.
8546 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8547 if (getToolChain().getArch() == llvm::Triple::mipsel)
8548 CmdArgs.push_back("-lnacl");
8549
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008550 CmdArgs.push_back("-lpthread");
8551 }
8552
8553 CmdArgs.push_back("-lgcc");
8554 CmdArgs.push_back("--as-needed");
8555 if (IsStatic)
8556 CmdArgs.push_back("-lgcc_eh");
8557 else
8558 CmdArgs.push_back("-lgcc_s");
8559 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008560
8561 // Mips needs to create and use pnacl_legacy library that contains
8562 // definitions from bitcode/pnaclmm.c and definitions for
8563 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8564 if (getToolChain().getArch() == llvm::Triple::mipsel)
8565 CmdArgs.push_back("-lpnacl_legacy");
8566
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008567 CmdArgs.push_back("--end-group");
8568 }
8569
8570 if (!Args.hasArg(options::OPT_nostartfiles)) {
8571 const char *crtend;
8572 if (Args.hasArg(options::OPT_shared))
8573 crtend = "crtendS.o";
8574 else
8575 crtend = "crtend.o";
8576
8577 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8578 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8579 }
8580 }
8581
Justin Bognerd3371d82015-07-17 03:35:54 +00008582 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8583 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008584}
8585
Douglas Katzman95354292015-06-23 20:42:09 +00008586void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8587 const InputInfo &Output,
8588 const InputInfoList &Inputs,
8589 const ArgList &Args,
8590 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008591 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008592 ArgStringList CmdArgs;
8593
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008594 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008595
8596 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008597 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008598
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008599 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008600 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008601
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008602 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008603 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008604}
8605
Douglas Katzman95354292015-06-23 20:42:09 +00008606void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8607 const InputInfo &Output,
8608 const InputInfoList &Inputs,
8609 const ArgList &Args,
8610 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008611 const Driver &D = getToolChain().getDriver();
8612 ArgStringList CmdArgs;
8613
Daniel Dunbarb440f562010-08-02 02:38:21 +00008614 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008615 CmdArgs.push_back("-o");
8616 CmdArgs.push_back(Output.getFilename());
8617 } else {
8618 assert(Output.isNothing() && "Invalid output.");
8619 }
8620
8621 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008622 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008623 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8624 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8625 CmdArgs.push_back(
8626 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8627 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008628 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008629
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008630 Args.AddAllArgs(CmdArgs,
8631 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008632
Daniel Dunbar54423b22010-09-17 00:24:54 +00008633 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008634
Alexey Samsonov7811d192014-02-20 13:57:37 +00008635 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008636
Chris Lattner3e2ee142010-07-07 16:01:42 +00008637 if (!Args.hasArg(options::OPT_nostdlib) &&
8638 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008639 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008640 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008641 CmdArgs.push_back("-lm");
8642 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008643 }
8644
8645 if (!Args.hasArg(options::OPT_nostdlib) &&
8646 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008647 if (Args.hasArg(options::OPT_pthread))
8648 CmdArgs.push_back("-lpthread");
8649 CmdArgs.push_back("-lc");
8650 CmdArgs.push_back("-lCompilerRT-Generic");
8651 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8652 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008653 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008654 }
8655
Logan Chieneb9162f2014-06-26 14:23:45 +00008656 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008657 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008658}
8659
Daniel Dunbarcc912342009-05-02 18:28:39 +00008660/// DragonFly Tools
8661
8662// For now, DragonFly Assemble does just about the same as for
8663// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008664void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8665 const InputInfo &Output,
8666 const InputInfoList &Inputs,
8667 const ArgList &Args,
8668 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008669 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008670 ArgStringList CmdArgs;
8671
8672 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8673 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008674 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008675 CmdArgs.push_back("--32");
8676
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008677 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008678
8679 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008680 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008681
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008682 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008683 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008684
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008685 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008686 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008687}
8688
Douglas Katzman95354292015-06-23 20:42:09 +00008689void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8690 const InputInfo &Output,
8691 const InputInfoList &Inputs,
8692 const ArgList &Args,
8693 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008694 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008695 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008696 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008697
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008698 if (!D.SysRoot.empty())
8699 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8700
John McCall65b8da02013-04-11 22:55:55 +00008701 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008702 if (Args.hasArg(options::OPT_static)) {
8703 CmdArgs.push_back("-Bstatic");
8704 } else {
John McCall65b8da02013-04-11 22:55:55 +00008705 if (Args.hasArg(options::OPT_rdynamic))
8706 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008707 if (Args.hasArg(options::OPT_shared))
8708 CmdArgs.push_back("-Bshareable");
8709 else {
8710 CmdArgs.push_back("-dynamic-linker");
8711 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8712 }
John McCall65b8da02013-04-11 22:55:55 +00008713 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008714 }
8715
8716 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8717 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008718 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008719 CmdArgs.push_back("-m");
8720 CmdArgs.push_back("elf_i386");
8721 }
8722
Daniel Dunbarb440f562010-08-02 02:38:21 +00008723 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008724 CmdArgs.push_back("-o");
8725 CmdArgs.push_back(Output.getFilename());
8726 } else {
8727 assert(Output.isNothing() && "Invalid output.");
8728 }
8729
8730 if (!Args.hasArg(options::OPT_nostdlib) &&
8731 !Args.hasArg(options::OPT_nostartfiles)) {
8732 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008733 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008734 CmdArgs.push_back(
8735 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008736 else {
8737 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008738 CmdArgs.push_back(
8739 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008740 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008741 CmdArgs.push_back(
8742 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008743 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008744 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008745 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008746 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008747 CmdArgs.push_back(
8748 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008749 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008750 CmdArgs.push_back(
8751 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008752 }
8753
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008754 Args.AddAllArgs(CmdArgs,
8755 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008756
Daniel Dunbar54423b22010-09-17 00:24:54 +00008757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008758
8759 if (!Args.hasArg(options::OPT_nostdlib) &&
8760 !Args.hasArg(options::OPT_nodefaultlibs)) {
8761 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8762 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008763 if (UseGCC47)
8764 CmdArgs.push_back("-L/usr/lib/gcc47");
8765 else
8766 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008767
8768 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008769 if (UseGCC47) {
8770 CmdArgs.push_back("-rpath");
8771 CmdArgs.push_back("/usr/lib/gcc47");
8772 } else {
8773 CmdArgs.push_back("-rpath");
8774 CmdArgs.push_back("/usr/lib/gcc44");
8775 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008776 }
8777
Hans Wennborg70850d82013-07-18 20:29:38 +00008778 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008779 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008780 CmdArgs.push_back("-lm");
8781 }
8782
Daniel Dunbarcc912342009-05-02 18:28:39 +00008783 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008784 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008785
8786 if (!Args.hasArg(options::OPT_nolibc)) {
8787 CmdArgs.push_back("-lc");
8788 }
8789
John McCall65b8da02013-04-11 22:55:55 +00008790 if (UseGCC47) {
8791 if (Args.hasArg(options::OPT_static) ||
8792 Args.hasArg(options::OPT_static_libgcc)) {
8793 CmdArgs.push_back("-lgcc");
8794 CmdArgs.push_back("-lgcc_eh");
8795 } else {
8796 if (Args.hasArg(options::OPT_shared_libgcc)) {
8797 CmdArgs.push_back("-lgcc_pic");
8798 if (!Args.hasArg(options::OPT_shared))
8799 CmdArgs.push_back("-lgcc");
8800 } else {
8801 CmdArgs.push_back("-lgcc");
8802 CmdArgs.push_back("--as-needed");
8803 CmdArgs.push_back("-lgcc_pic");
8804 CmdArgs.push_back("--no-as-needed");
8805 }
8806 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008807 } else {
John McCall65b8da02013-04-11 22:55:55 +00008808 if (Args.hasArg(options::OPT_shared)) {
8809 CmdArgs.push_back("-lgcc_pic");
8810 } else {
8811 CmdArgs.push_back("-lgcc");
8812 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008813 }
8814 }
8815
8816 if (!Args.hasArg(options::OPT_nostdlib) &&
8817 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008818 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008819 CmdArgs.push_back(
8820 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008821 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008822 CmdArgs.push_back(
8823 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8824 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008825 }
8826
Alexey Samsonov7811d192014-02-20 13:57:37 +00008827 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008828
Logan Chieneb9162f2014-06-26 14:23:45 +00008829 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008830 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008831}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008832
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008833// Try to find Exe from a Visual Studio distribution. This first tries to find
8834// an installed copy of Visual Studio and, failing that, looks in the PATH,
8835// making sure that whatever executable that's found is not a same-named exe
8836// from clang itself to prevent clang from falling back to itself.
8837static std::string FindVisualStudioExecutable(const ToolChain &TC,
8838 const char *Exe,
8839 const char *ClangProgramPath) {
8840 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8841 std::string visualStudioBinDir;
8842 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8843 visualStudioBinDir)) {
8844 SmallString<128> FilePath(visualStudioBinDir);
8845 llvm::sys::path::append(FilePath, Exe);
8846 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8847 return FilePath.str();
8848 }
8849
8850 return Exe;
8851}
8852
Douglas Katzman95354292015-06-23 20:42:09 +00008853void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8854 const InputInfo &Output,
8855 const InputInfoList &Inputs,
8856 const ArgList &Args,
8857 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008858 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008859 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008860
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008861 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8862 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008863 CmdArgs.push_back(
8864 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008865
8866 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008867 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008868 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008869
Zachary Turner10d75b22014-10-22 20:40:43 +00008870 if (!llvm::sys::Process::GetEnv("LIB")) {
8871 // If the VC environment hasn't been configured (perhaps because the user
8872 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008873 // the environment variable is set however, assume the user knows what
8874 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008875 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008876 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008877 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8878 SmallString<128> LibDir(VisualStudioDir);
8879 llvm::sys::path::append(LibDir, "VC", "lib");
8880 switch (MSVC.getArch()) {
8881 case llvm::Triple::x86:
8882 // x86 just puts the libraries directly in lib
8883 break;
8884 case llvm::Triple::x86_64:
8885 llvm::sys::path::append(LibDir, "amd64");
8886 break;
8887 case llvm::Triple::arm:
8888 llvm::sys::path::append(LibDir, "arm");
8889 break;
8890 default:
8891 break;
8892 }
8893 CmdArgs.push_back(
8894 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8895 }
8896
8897 std::string WindowsSdkLibPath;
8898 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8899 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8900 WindowsSdkLibPath.c_str()));
8901 }
8902
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008903 CmdArgs.push_back("-nologo");
8904
Reid Kleckner124955a2015-08-05 18:51:13 +00008905 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008906 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008908 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008909 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008910 if (DLL) {
8911 CmdArgs.push_back(Args.MakeArgString("-dll"));
8912
8913 SmallString<128> ImplibName(Output.getFilename());
8914 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008915 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008916 }
8917
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008918 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008919 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008920 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008921 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008922 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008923 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008924 };
8925 for (const auto &Component : CompilerRTComponents)
8926 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008927 // Make sure the dynamic runtime thunk is not optimized out at link time
8928 // to ensure proper SEH handling.
8929 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008930 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008931 CmdArgs.push_back(
8932 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008933 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008934 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008935 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008936 };
8937 for (const auto &Component : CompilerRTComponents)
8938 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008939 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008940 }
8941
Hans Wennborg2e274592013-08-13 23:38:57 +00008942 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008943
Alexey Bataevc7e84352015-08-19 04:49:01 +00008944 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8945 options::OPT_fno_openmp, false)) {
8946 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
8947 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
8948 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8949 TC.getDriver().Dir + "/../lib"));
8950 switch (getOpenMPRuntime(getToolChain(), Args)) {
8951 case OMPRT_OMP:
8952 CmdArgs.push_back("-defaultlib:libomp.lib");
8953 break;
8954 case OMPRT_IOMP5:
8955 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
8956 break;
8957 case OMPRT_GOMP:
8958 break;
8959 case OMPRT_Unknown:
8960 // Already diagnosed.
8961 break;
8962 }
8963 }
8964
Reid Kleckner337188f2014-09-16 19:22:00 +00008965 // Add filenames, libraries, and other linker inputs.
8966 for (const auto &Input : Inputs) {
8967 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008968 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008969 continue;
8970 }
8971
8972 const Arg &A = Input.getInputArg();
8973
8974 // Render -l options differently for the MSVC linker.
8975 if (A.getOption().matches(options::OPT_l)) {
8976 StringRef Lib = A.getValue();
8977 const char *LinkLibArg;
8978 if (Lib.endswith(".lib"))
8979 LinkLibArg = Args.MakeArgString(Lib);
8980 else
8981 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8982 CmdArgs.push_back(LinkLibArg);
8983 continue;
8984 }
8985
8986 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8987 // or -L. Render it, even if MSVC doesn't understand it.
8988 A.renderAsInput(Args, CmdArgs);
8989 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008990
Zachary Turner719f58c2014-12-01 23:06:47 +00008991 // We need to special case some linker paths. In the case of lld, we need to
8992 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8993 // linker, we need to use a special search algorithm.
8994 llvm::SmallString<128> linkPath;
8995 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8996 if (Linker.equals_lower("lld"))
8997 Linker = "lld-link";
8998
8999 if (Linker.equals_lower("link")) {
9000 // If we're using the MSVC linker, it's not sufficient to just use link
9001 // from the program PATH, because other environments like GnuWin32 install
9002 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009003 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009004 C.getDriver().getClangProgramPath());
9005 } else {
9006 linkPath = Linker;
9007 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009008 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009009 }
9010
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009011 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009012 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009013}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009014
Douglas Katzman95354292015-06-23 20:42:09 +00009015void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9016 const InputInfo &Output,
9017 const InputInfoList &Inputs,
9018 const ArgList &Args,
9019 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009020 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9021}
9022
Douglas Katzman95354292015-06-23 20:42:09 +00009023std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009024 Compilation &C, const JobAction &JA, const InputInfo &Output,
9025 const InputInfoList &Inputs, const ArgList &Args,
9026 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009027 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009028 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009029 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009030 CmdArgs.push_back("/W0"); // No warnings.
9031
9032 // The goal is to be able to invoke this tool correctly based on
9033 // any flag accepted by clang-cl.
9034
9035 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009036 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009037
9038 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009039 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9040 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9041 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009042 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9043 if (A->getOption().getID() == options::OPT_O0) {
9044 CmdArgs.push_back("/Od");
9045 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009046 CmdArgs.push_back("/Og");
9047
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009048 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009049 if (OptLevel == "s" || OptLevel == "z")
9050 CmdArgs.push_back("/Os");
9051 else
9052 CmdArgs.push_back("/Ot");
9053
9054 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009055 }
9056 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009057 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9058 options::OPT_fno_omit_frame_pointer))
9059 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9060 ? "/Oy"
9061 : "/Oy-");
9062 if (!Args.hasArg(options::OPT_fwritable_strings))
9063 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009064
Nico Weber3f8dafb2015-03-12 19:37:10 +00009065 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009066 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9067
David Majnemerf6072342014-07-01 22:24:56 +00009068 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9069 /*default=*/false))
9070 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009071 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9072 options::OPT_fno_function_sections))
9073 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9074 ? "/Gy"
9075 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009076 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9077 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009078 CmdArgs.push_back(
9079 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009080 if (Args.hasArg(options::OPT_fsyntax_only))
9081 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009082 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9083 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009084 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009085
Nico Weber3f8dafb2015-03-12 19:37:10 +00009086 std::vector<std::string> Includes =
9087 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009088 for (const auto &Include : Includes)
9089 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009090
Hans Wennborg87cfa712013-09-19 20:32:16 +00009091 // Flags that can simply be passed through.
9092 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9093 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009094 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009095 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009096
9097 // The order of these flags is relevant, so pick the last one.
9098 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9099 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9100 A->render(Args, CmdArgs);
9101
Hans Wennborg87cfa712013-09-19 20:32:16 +00009102 // Input filename.
9103 assert(Inputs.size() == 1);
9104 const InputInfo &II = Inputs[0];
9105 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9106 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9107 if (II.isFilename())
9108 CmdArgs.push_back(II.getFilename());
9109 else
9110 II.getInputArg().renderAsInput(Args, CmdArgs);
9111
9112 // Output filename.
9113 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009114 const char *Fo =
9115 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009116 CmdArgs.push_back(Fo);
9117
Hans Wennborg188382e2013-09-20 18:16:35 +00009118 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009119 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9120 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009121 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009122 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009123}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009124
Yaron Keren1c0070c2015-07-02 04:45:27 +00009125/// MinGW Tools
9126void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9127 const InputInfo &Output,
9128 const InputInfoList &Inputs,
9129 const ArgList &Args,
9130 const char *LinkingOutput) const {
9131 claimNoWarnArgs(Args);
9132 ArgStringList CmdArgs;
9133
9134 if (getToolChain().getArch() == llvm::Triple::x86) {
9135 CmdArgs.push_back("--32");
9136 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9137 CmdArgs.push_back("--64");
9138 }
9139
9140 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9141
9142 CmdArgs.push_back("-o");
9143 CmdArgs.push_back(Output.getFilename());
9144
9145 for (const auto &II : Inputs)
9146 CmdArgs.push_back(II.getFilename());
9147
9148 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009149 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009150
9151 if (Args.hasArg(options::OPT_gsplit_dwarf))
9152 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9153 SplitDebugName(Args, Inputs[0]));
9154}
9155
9156void MinGW::Linker::AddLibGCC(const ArgList &Args,
9157 ArgStringList &CmdArgs) const {
9158 if (Args.hasArg(options::OPT_mthreads))
9159 CmdArgs.push_back("-lmingwthrd");
9160 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009161
Yaron Kerenaa281332015-08-09 00:24:07 +00009162 // Make use of compiler-rt if --rtlib option is used
9163 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9164 if (RLT == ToolChain::RLT_Libgcc) {
9165 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9166 Args.hasArg(options::OPT_static);
9167 bool Shared = Args.hasArg(options::OPT_shared);
9168 bool CXX = getToolChain().getDriver().CCCIsCXX();
9169
9170 if (Static || (!CXX && !Shared)) {
9171 CmdArgs.push_back("-lgcc");
9172 CmdArgs.push_back("-lgcc_eh");
9173 } else {
9174 CmdArgs.push_back("-lgcc_s");
9175 CmdArgs.push_back("-lgcc");
9176 }
9177 } else {
9178 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9179 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009180
Yaron Keren1c0070c2015-07-02 04:45:27 +00009181 CmdArgs.push_back("-lmoldname");
9182 CmdArgs.push_back("-lmingwex");
9183 CmdArgs.push_back("-lmsvcrt");
9184}
9185
9186void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9187 const InputInfo &Output,
9188 const InputInfoList &Inputs,
9189 const ArgList &Args,
9190 const char *LinkingOutput) const {
9191 const ToolChain &TC = getToolChain();
9192 const Driver &D = TC.getDriver();
9193 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9194
9195 ArgStringList CmdArgs;
9196
9197 // Silence warning for "clang -g foo.o -o foo"
9198 Args.ClaimAllArgs(options::OPT_g_Group);
9199 // and "clang -emit-llvm foo.o -o foo"
9200 Args.ClaimAllArgs(options::OPT_emit_llvm);
9201 // and for "clang -w foo.o -o foo". Other warning options are already
9202 // handled somewhere else.
9203 Args.ClaimAllArgs(options::OPT_w);
9204
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009205 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9206 if (LinkerName.equals_lower("lld")) {
9207 CmdArgs.push_back("-flavor");
9208 CmdArgs.push_back("gnu");
9209 }
9210
Yaron Keren1c0070c2015-07-02 04:45:27 +00009211 if (!D.SysRoot.empty())
9212 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9213
9214 if (Args.hasArg(options::OPT_s))
9215 CmdArgs.push_back("-s");
9216
9217 CmdArgs.push_back("-m");
9218 if (TC.getArch() == llvm::Triple::x86)
9219 CmdArgs.push_back("i386pe");
9220 if (TC.getArch() == llvm::Triple::x86_64)
9221 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009222 if (TC.getArch() == llvm::Triple::arm)
9223 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009224
9225 if (Args.hasArg(options::OPT_mwindows)) {
9226 CmdArgs.push_back("--subsystem");
9227 CmdArgs.push_back("windows");
9228 } else if (Args.hasArg(options::OPT_mconsole)) {
9229 CmdArgs.push_back("--subsystem");
9230 CmdArgs.push_back("console");
9231 }
9232
9233 if (Args.hasArg(options::OPT_static))
9234 CmdArgs.push_back("-Bstatic");
9235 else {
9236 if (Args.hasArg(options::OPT_mdll))
9237 CmdArgs.push_back("--dll");
9238 else if (Args.hasArg(options::OPT_shared))
9239 CmdArgs.push_back("--shared");
9240 CmdArgs.push_back("-Bdynamic");
9241 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9242 CmdArgs.push_back("-e");
9243 if (TC.getArch() == llvm::Triple::x86)
9244 CmdArgs.push_back("_DllMainCRTStartup@12");
9245 else
9246 CmdArgs.push_back("DllMainCRTStartup");
9247 CmdArgs.push_back("--enable-auto-image-base");
9248 }
9249 }
9250
9251 CmdArgs.push_back("-o");
9252 CmdArgs.push_back(Output.getFilename());
9253
9254 Args.AddAllArgs(CmdArgs, options::OPT_e);
9255 // FIXME: add -N, -n flags
9256 Args.AddLastArg(CmdArgs, options::OPT_r);
9257 Args.AddLastArg(CmdArgs, options::OPT_s);
9258 Args.AddLastArg(CmdArgs, options::OPT_t);
9259 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9260 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9261
9262 if (!Args.hasArg(options::OPT_nostdlib) &&
9263 !Args.hasArg(options::OPT_nostartfiles)) {
9264 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9265 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9266 } else {
9267 if (Args.hasArg(options::OPT_municode))
9268 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9269 else
9270 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9271 }
9272 if (Args.hasArg(options::OPT_pg))
9273 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9274 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9275 }
9276
9277 Args.AddAllArgs(CmdArgs, options::OPT_L);
9278 const ToolChain::path_list Paths = TC.getFilePaths();
9279 for (const auto &Path : Paths)
9280 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9281
9282 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9283
9284 // TODO: Add ASan stuff here
9285
9286 // TODO: Add profile stuff here
9287
9288 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9289 !Args.hasArg(options::OPT_nodefaultlibs)) {
9290 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9291 !Args.hasArg(options::OPT_static);
9292 if (OnlyLibstdcxxStatic)
9293 CmdArgs.push_back("-Bstatic");
9294 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9295 if (OnlyLibstdcxxStatic)
9296 CmdArgs.push_back("-Bdynamic");
9297 }
9298
9299 if (!Args.hasArg(options::OPT_nostdlib)) {
9300 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9301 if (Args.hasArg(options::OPT_static))
9302 CmdArgs.push_back("--start-group");
9303
9304 if (Args.hasArg(options::OPT_fstack_protector) ||
9305 Args.hasArg(options::OPT_fstack_protector_strong) ||
9306 Args.hasArg(options::OPT_fstack_protector_all)) {
9307 CmdArgs.push_back("-lssp_nonshared");
9308 CmdArgs.push_back("-lssp");
9309 }
9310 if (Args.hasArg(options::OPT_fopenmp))
9311 CmdArgs.push_back("-lgomp");
9312
9313 AddLibGCC(Args, CmdArgs);
9314
9315 if (Args.hasArg(options::OPT_pg))
9316 CmdArgs.push_back("-lgmon");
9317
Yaron Kerenadce68e2015-07-06 18:52:19 +00009318 if (Args.hasArg(options::OPT_pthread))
9319 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009320
9321 // add system libraries
9322 if (Args.hasArg(options::OPT_mwindows)) {
9323 CmdArgs.push_back("-lgdi32");
9324 CmdArgs.push_back("-lcomdlg32");
9325 }
9326 CmdArgs.push_back("-ladvapi32");
9327 CmdArgs.push_back("-lshell32");
9328 CmdArgs.push_back("-luser32");
9329 CmdArgs.push_back("-lkernel32");
9330
9331 if (Args.hasArg(options::OPT_static))
9332 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009333 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009334 AddLibGCC(Args, CmdArgs);
9335 }
9336
9337 if (!Args.hasArg(options::OPT_nostartfiles)) {
9338 // Add crtfastmath.o if available and fast math is enabled.
9339 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9340
9341 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9342 }
9343 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009344 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009345 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009346}
9347
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009348/// XCore Tools
9349// We pass assemble and link construction to the xcc tool.
9350
Douglas Katzman95354292015-06-23 20:42:09 +00009351void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9352 const InputInfo &Output,
9353 const InputInfoList &Inputs,
9354 const ArgList &Args,
9355 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009356 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009357 ArgStringList CmdArgs;
9358
9359 CmdArgs.push_back("-o");
9360 CmdArgs.push_back(Output.getFilename());
9361
9362 CmdArgs.push_back("-c");
9363
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009364 if (Args.hasArg(options::OPT_v))
9365 CmdArgs.push_back("-v");
9366
Robert Lytton894d25c2014-05-02 09:33:25 +00009367 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9368 if (!A->getOption().matches(options::OPT_g0))
9369 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009370
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009371 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9372 false))
9373 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009374
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009375 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009376
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009377 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009378 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009379
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009380 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009381 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009382}
9383
Douglas Katzman95354292015-06-23 20:42:09 +00009384void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9385 const InputInfo &Output,
9386 const InputInfoList &Inputs,
9387 const ArgList &Args,
9388 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009389 ArgStringList CmdArgs;
9390
9391 if (Output.isFilename()) {
9392 CmdArgs.push_back("-o");
9393 CmdArgs.push_back(Output.getFilename());
9394 } else {
9395 assert(Output.isNothing() && "Invalid output.");
9396 }
9397
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009398 if (Args.hasArg(options::OPT_v))
9399 CmdArgs.push_back("-v");
9400
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009401 // Pass -fexceptions through to the linker if it was present.
9402 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9403 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009404 CmdArgs.push_back("-fexceptions");
9405
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009406 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9407
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009408 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009409 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009410}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009411
Douglas Katzman95354292015-06-23 20:42:09 +00009412void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9413 const InputInfo &Output,
9414 const InputInfoList &Inputs,
9415 const ArgList &Args,
9416 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009417 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009418 const auto &TC =
9419 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9420 ArgStringList CmdArgs;
9421 const char *Exec;
9422
9423 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009424 default:
9425 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009426 case llvm::Triple::arm:
9427 case llvm::Triple::thumb:
9428 break;
9429 case llvm::Triple::x86:
9430 CmdArgs.push_back("--32");
9431 break;
9432 case llvm::Triple::x86_64:
9433 CmdArgs.push_back("--64");
9434 break;
9435 }
9436
9437 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9438
9439 CmdArgs.push_back("-o");
9440 CmdArgs.push_back(Output.getFilename());
9441
9442 for (const auto &Input : Inputs)
9443 CmdArgs.push_back(Input.getFilename());
9444
9445 const std::string Assembler = TC.GetProgramPath("as");
9446 Exec = Args.MakeArgString(Assembler);
9447
Justin Bognerd3371d82015-07-17 03:35:54 +00009448 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009449}
9450
Douglas Katzman95354292015-06-23 20:42:09 +00009451void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9452 const InputInfo &Output,
9453 const InputInfoList &Inputs,
9454 const ArgList &Args,
9455 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009456 const auto &TC =
9457 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9458 const llvm::Triple &T = TC.getTriple();
9459 const Driver &D = TC.getDriver();
9460 SmallString<128> EntryPoint;
9461 ArgStringList CmdArgs;
9462 const char *Exec;
9463
9464 // Silence warning for "clang -g foo.o -o foo"
9465 Args.ClaimAllArgs(options::OPT_g_Group);
9466 // and "clang -emit-llvm foo.o -o foo"
9467 Args.ClaimAllArgs(options::OPT_emit_llvm);
9468 // and for "clang -w foo.o -o foo"
9469 Args.ClaimAllArgs(options::OPT_w);
9470 // Other warning options are already handled somewhere else.
9471
9472 if (!D.SysRoot.empty())
9473 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9474
9475 if (Args.hasArg(options::OPT_pie))
9476 CmdArgs.push_back("-pie");
9477 if (Args.hasArg(options::OPT_rdynamic))
9478 CmdArgs.push_back("-export-dynamic");
9479 if (Args.hasArg(options::OPT_s))
9480 CmdArgs.push_back("--strip-all");
9481
9482 CmdArgs.push_back("-m");
9483 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009484 default:
9485 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009486 case llvm::Triple::arm:
9487 case llvm::Triple::thumb:
9488 // FIXME: this is incorrect for WinCE
9489 CmdArgs.push_back("thumb2pe");
9490 break;
9491 case llvm::Triple::x86:
9492 CmdArgs.push_back("i386pe");
9493 EntryPoint.append("_");
9494 break;
9495 case llvm::Triple::x86_64:
9496 CmdArgs.push_back("i386pep");
9497 break;
9498 }
9499
9500 if (Args.hasArg(options::OPT_shared)) {
9501 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009502 default:
9503 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009504 case llvm::Triple::arm:
9505 case llvm::Triple::thumb:
9506 case llvm::Triple::x86_64:
9507 EntryPoint.append("_DllMainCRTStartup");
9508 break;
9509 case llvm::Triple::x86:
9510 EntryPoint.append("_DllMainCRTStartup@12");
9511 break;
9512 }
9513
9514 CmdArgs.push_back("-shared");
9515 CmdArgs.push_back("-Bdynamic");
9516
9517 CmdArgs.push_back("--enable-auto-image-base");
9518
9519 CmdArgs.push_back("--entry");
9520 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9521 } else {
9522 EntryPoint.append("mainCRTStartup");
9523
9524 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9525 : "-Bdynamic");
9526
9527 if (!Args.hasArg(options::OPT_nostdlib) &&
9528 !Args.hasArg(options::OPT_nostartfiles)) {
9529 CmdArgs.push_back("--entry");
9530 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9531 }
9532
9533 // FIXME: handle subsystem
9534 }
9535
9536 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009537 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009538
9539 CmdArgs.push_back("-o");
9540 CmdArgs.push_back(Output.getFilename());
9541
9542 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9543 SmallString<261> ImpLib(Output.getFilename());
9544 llvm::sys::path::replace_extension(ImpLib, ".lib");
9545
9546 CmdArgs.push_back("--out-implib");
9547 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9548 }
9549
9550 if (!Args.hasArg(options::OPT_nostdlib) &&
9551 !Args.hasArg(options::OPT_nostartfiles)) {
9552 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9553 const char *CRTBegin;
9554
9555 CRTBegin =
9556 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9557 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9558 }
9559
9560 Args.AddAllArgs(CmdArgs, options::OPT_L);
9561
9562 const auto &Paths = TC.getFilePaths();
9563 for (const auto &Path : Paths)
9564 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9565
9566 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9567
9568 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9569 !Args.hasArg(options::OPT_nodefaultlibs)) {
9570 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9571 !Args.hasArg(options::OPT_static);
9572 if (StaticCXX)
9573 CmdArgs.push_back("-Bstatic");
9574 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9575 if (StaticCXX)
9576 CmdArgs.push_back("-Bdynamic");
9577 }
9578
9579 if (!Args.hasArg(options::OPT_nostdlib)) {
9580 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9581 // TODO handle /MT[d] /MD[d]
9582 CmdArgs.push_back("-lmsvcrt");
9583 AddRunTimeLibs(TC, D, CmdArgs, Args);
9584 }
9585 }
9586
9587 const std::string Linker = TC.GetProgramPath("ld");
9588 Exec = Args.MakeArgString(Linker);
9589
Justin Bognerd3371d82015-07-17 03:35:54 +00009590 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009591}
Douglas Katzman84a75642015-06-19 14:55:19 +00009592
Douglas Katzman95354292015-06-23 20:42:09 +00009593void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9594 const InputInfo &Output,
9595 const InputInfoList &Inputs,
9596 const ArgList &Args,
9597 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009598
9599 ArgStringList CmdArgs;
9600
9601 assert(Inputs.size() == 1);
9602 const InputInfo &II = Inputs[0];
9603 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9604 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9605
Douglas Katzman84a75642015-06-19 14:55:19 +00009606 CmdArgs.push_back("-DMYRIAD2");
9607 CmdArgs.push_back("-mcpu=myriad2");
9608 CmdArgs.push_back("-S");
9609
Douglas Katzmanf6071112015-08-03 14:34:22 +00009610 // Append all -I, -iquote, -isystem paths, defines/undefines,
9611 // 'f' flags, optimize flags, and warning options.
9612 // These are spelled the same way in clang and moviCompile.
9613 Args.AddAllArgs(CmdArgs,
9614 {options::OPT_I_Group, options::OPT_clang_i_Group,
9615 options::OPT_D, options::OPT_U,
9616 options::OPT_f_Group,
9617 options::OPT_f_clang_Group,
9618 options::OPT_g_Group,
Douglas Katzman15172612015-09-02 13:42:43 +00009619 options::OPT_M_Group,
Douglas Katzmanf6071112015-08-03 14:34:22 +00009620 options::OPT_O_Group,
9621 options::OPT_W_Group});
Douglas Katzman84a75642015-06-19 14:55:19 +00009622 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9623
9624 CmdArgs.push_back(II.getFilename());
9625 CmdArgs.push_back("-o");
9626 CmdArgs.push_back(Output.getFilename());
9627
9628 std::string Exec =
9629 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009630 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9631 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009632}
9633
Douglas Katzman95354292015-06-23 20:42:09 +00009634void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9635 const InputInfo &Output,
9636 const InputInfoList &Inputs,
9637 const ArgList &Args,
9638 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009639 ArgStringList CmdArgs;
9640
9641 assert(Inputs.size() == 1);
9642 const InputInfo &II = Inputs[0];
9643 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9644 assert(Output.getType() == types::TY_Object);
9645
9646 CmdArgs.push_back("-no6thSlotCompression");
9647 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9648 CmdArgs.push_back("-noSPrefixing");
9649 CmdArgs.push_back("-a"); // Mystery option.
9650 for (auto Arg : Args.filtered(options::OPT_I)) {
9651 Arg->claim();
9652 CmdArgs.push_back(
9653 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9654 }
9655 CmdArgs.push_back("-elf"); // Output format.
9656 CmdArgs.push_back(II.getFilename());
9657 CmdArgs.push_back(
9658 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9659
9660 std::string Exec =
9661 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009662 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9663 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009664}