blob: 0adc05c94647a86ae1a58b6ffab99455203329c8 [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:
Dan Gohmanc2853072015-09-03 22:51:53 +0000487 case llvm::Triple::wasm32:
488 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000489 return true;
490 }
491}
492
Renato Goline17c5802015-07-27 23:44:42 +0000493// ARM tools start.
494
495// Get SubArch (vN).
496static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
497 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000498 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000499}
500
501// True if M-profile.
502static bool isARMMProfile(const llvm::Triple &Triple) {
503 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000504 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000505 return Profile == llvm::ARM::PK_M;
506}
507
508// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000509static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
510 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000511 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
512 CPU = A->getValue();
513 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
514 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000515 if (!FromAs)
516 return;
517
518 for (const Arg *A :
519 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
520 StringRef Value = A->getValue();
521 if (Value.startswith("-mcpu="))
522 CPU = Value.substr(6);
523 if (Value.startswith("-march="))
524 Arch = Value.substr(7);
525 }
Renato Goline17c5802015-07-27 23:44:42 +0000526}
527
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000529// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000530static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000531 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000532 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000533 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
534 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000540 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000541 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000542 unsigned FPUID = llvm::ARM::parseFPU(FPU);
543 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000544 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
545}
546
Renato Golin7c542b42015-07-27 23:44:45 +0000547// Check if -march is valid by checking if it can be canonicalised and parsed.
548// getARMArch is used here instead of just checking the -march value in order
549// to handle -march=native correctly.
550static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000551 llvm::StringRef ArchName,
552 const llvm::Triple &Triple) {
553 std::string MArch = arm::getARMArch(ArchName, Triple);
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000554 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID)
Renato Goline17c5802015-07-27 23:44:42 +0000555 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000556}
557
Renato Golin7c542b42015-07-27 23:44:45 +0000558// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
559static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
560 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000561 const llvm::Triple &Triple) {
562 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
563 std::string Arch = arm::getARMArch(ArchName, Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000564 if (arm::getLLVMArchSuffixForARM(CPU, Arch).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000565 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000566}
567
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000568static bool useAAPCSForMachO(const llvm::Triple &T) {
569 // The backend is hardwired to assume AAPCS for M-class processors, ensure
570 // the frontend matches that.
571 return T.getEnvironment() == llvm::Triple::EABI ||
572 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
573}
574
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000575// Select the float ABI as determined by -msoft-float, -mhard-float, and
576// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000577StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000578 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000579 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000580 if (Arg *A =
581 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
582 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000583 if (A->getOption().matches(options::OPT_msoft_float))
584 FloatABI = "soft";
585 else if (A->getOption().matches(options::OPT_mhard_float))
586 FloatABI = "hard";
587 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000588 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000589 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000590 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000591 FloatABI = "soft";
592 }
593 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000594
595 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
596 // "apcs-gnu".
597 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
598 FloatABI == "hard")
599 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
600 << Triple.getArchName();
Daniel Dunbar78485922009-09-10 23:00:09 +0000601 }
602
603 // If unspecified, choose the default based on the platform.
604 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000605 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000606 case llvm::Triple::Darwin:
607 case llvm::Triple::MacOSX:
608 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 // Darwin defaults to "softfp" for v6 and v7.
610 //
John Brawn94fd9632015-05-21 12:19:49 +0000611 if (getARMSubArchVersionNumber(Triple) == 6 ||
612 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000613 FloatABI = "softfp";
614 else
615 FloatABI = "soft";
616 break;
617 }
618
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000619 // FIXME: this is invalid for WindowsCE
620 case llvm::Triple::Win32:
621 FloatABI = "hard";
622 break;
623
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000624 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000625 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000626 case llvm::Triple::GNUEABIHF:
627 FloatABI = "hard";
628 break;
629 default:
630 // FreeBSD defaults to soft float
631 FloatABI = "soft";
632 break;
633 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000634 break;
635
Daniel Dunbar78485922009-09-10 23:00:09 +0000636 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000637 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000638 case llvm::Triple::GNUEABIHF:
639 FloatABI = "hard";
640 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000641 case llvm::Triple::GNUEABI:
642 FloatABI = "softfp";
643 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000644 case llvm::Triple::EABIHF:
645 FloatABI = "hard";
646 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000647 case llvm::Triple::EABI:
648 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
649 FloatABI = "softfp";
650 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000651 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000652 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000653 FloatABI = "softfp";
654 else
655 FloatABI = "soft";
656 break;
657 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000658 default:
659 // Assume "soft", but warn the user we are guessing.
660 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000661 if (Triple.getOS() != llvm::Triple::UnknownOS ||
662 !Triple.isOSBinFormatMachO())
663 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000664 break;
665 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000666 }
667 }
668
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000669 return FloatABI;
670}
671
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000672static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
673 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000674 std::vector<const char *> &Features,
675 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000676 bool KernelOrKext =
677 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000678 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000679 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
680 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
681
Nico Weber6e0ebae2015-04-29 21:16:40 +0000682 if (!ForAS) {
683 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
684 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
685 // stripped out by the ARM target. We should probably pass this a new
686 // -target-option, which is handled by the -cc1/-cc1as invocation.
687 //
688 // FIXME2: For consistency, it would be ideal if we set up the target
689 // machine state the same when using the frontend or the assembler. We don't
690 // currently do that for the assembler, we pass the options directly to the
691 // backend and never even instantiate the frontend TargetInfo. If we did,
692 // and used its handleTargetFeatures hook, then we could ensure the
693 // assembler and the frontend behave the same.
694
695 // Use software floating point operations?
696 if (FloatABI == "soft")
697 Features.push_back("+soft-float");
698
699 // Use software floating point argument passing?
700 if (FloatABI != "hard")
701 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000702 } else {
703 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
704 // to the assembler correctly.
705 for (const Arg *A :
706 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
707 StringRef Value = A->getValue();
708 if (Value.startswith("-mfpu=")) {
709 WaFPU = A;
710 } else if (Value.startswith("-mcpu=")) {
711 WaCPU = A;
712 } else if (Value.startswith("-mhwdiv=")) {
713 WaHDiv = A;
714 } else if (Value.startswith("-march=")) {
715 WaArch = A;
716 }
717 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000718 }
719
Renato Golin7c542b42015-07-27 23:44:45 +0000720 // Check -march. ClangAs gives preference to -Wa,-march=.
721 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000722 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000723 if (WaArch) {
724 if (ArchArg)
725 D.Diag(clang::diag::warn_drv_unused_argument)
726 << ArchArg->getAsString(Args);
727 ArchName = StringRef(WaArch->getValue()).substr(7);
728 checkARMArchName(D, WaArch, Args, ArchName, Triple);
729 // FIXME: Set Arch.
730 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
731 } else if (ArchArg) {
732 ArchName = ArchArg->getValue();
733 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000734 }
735
Renato Golin7c542b42015-07-27 23:44:45 +0000736 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
737 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000738 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000739 if (WaCPU) {
740 if (CPUArg)
741 D.Diag(clang::diag::warn_drv_unused_argument)
742 << CPUArg->getAsString(Args);
743 CPUName = StringRef(WaCPU->getValue()).substr(6);
744 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
745 } else if (CPUArg) {
746 CPUName = CPUArg->getValue();
747 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000748 }
John Brawna95c1a82015-05-08 12:52:18 +0000749
Renato Golin23459c62015-07-30 16:40:17 +0000750 // Add CPU features for generic CPUs
751 if (CPUName == "native") {
752 llvm::StringMap<bool> HostFeatures;
753 if (llvm::sys::getHostCPUFeatures(HostFeatures))
754 for (auto &F : HostFeatures)
755 Features.push_back(
756 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
757 }
758
759 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
760 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
761 if (WaFPU) {
762 if (FPUArg)
763 D.Diag(clang::diag::warn_drv_unused_argument)
764 << FPUArg->getAsString(Args);
765 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
766 Features);
767 } else if (FPUArg) {
768 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
769 }
770
771 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
772 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
773 if (WaHDiv) {
774 if (HDivArg)
775 D.Diag(clang::diag::warn_drv_unused_argument)
776 << HDivArg->getAsString(Args);
777 getARMHWDivFeatures(D, WaHDiv, Args,
778 StringRef(WaHDiv->getValue()).substr(8), Features);
779 } else if (HDivArg)
780 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
781
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000782 // Setting -msoft-float effectively disables NEON because of the GCC
783 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000784 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000785 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000786 // Also need to explicitly disable features which imply NEON.
787 Features.push_back("-crypto");
788 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000789
Eric Christopher269c2a22015-04-04 03:34:43 +0000790 // En/disable crc code generation.
791 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000792 if (A->getOption().matches(options::OPT_mcrc))
793 Features.push_back("+crc");
794 else
795 Features.push_back("-crc");
796 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000797
798 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
799 Features.insert(Features.begin(), "+v8.1a");
800 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000801
Akira Hatanakac2694822015-07-07 08:28:42 +0000802 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
803 // neither options are specified, see if we are compiling for kernel/kext and
804 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000805 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
806 options::OPT_mno_long_calls)) {
807 if (A->getOption().matches(options::OPT_mlong_calls))
808 Features.push_back("+long-calls");
809 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
810 Features.push_back("+long-calls");
811 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000812
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000813 // Kernel code has more strict alignment requirements.
814 if (KernelOrKext)
815 Features.push_back("+strict-align");
816 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
817 options::OPT_munaligned_access)) {
818 if (A->getOption().matches(options::OPT_munaligned_access)) {
819 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
820 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
821 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
822 } else
823 Features.push_back("+strict-align");
824 } else {
825 // Assume pre-ARMv6 doesn't support unaligned accesses.
826 //
827 // ARMv6 may or may not support unaligned accesses depending on the
828 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
829 // Darwin and NetBSD targets support unaligned accesses, and others don't.
830 //
831 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
832 // which raises an alignment fault on unaligned accesses. Linux
833 // defaults this bit to 0 and handles it as a system-wide (not
834 // per-process) setting. It is therefore safe to assume that ARMv7+
835 // Linux targets support unaligned accesses. The same goes for NaCl.
836 //
837 // The above behavior is consistent with GCC.
838 int VersionNum = getARMSubArchVersionNumber(Triple);
839 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
840 if (VersionNum < 6)
841 Features.push_back("+strict-align");
842 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
843 if (VersionNum < 7)
844 Features.push_back("+strict-align");
845 } else
846 Features.push_back("+strict-align");
847 }
848
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000849 // llvm does not support reserving registers in general. There is support
850 // for reserving r9 on ARM though (defined as a platform-specific register
851 // in ARM EABI).
852 if (Args.hasArg(options::OPT_ffixed_r9))
853 Features.push_back("+reserve-r9");
854
Akira Hatanaka580efb22015-07-16 00:43:00 +0000855 // The kext linker doesn't know how to deal with movw/movt.
856 if (KernelOrKext)
857 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000858}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000860void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000861 bool KernelOrKext) const {
862 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000863 // Get the effective triple, which takes into account the deployment target.
864 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
865 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000866
867 // Select the ABI to use.
868 //
869 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000870 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000871 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000872 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000873 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000874 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000875 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000876 ABIName = "aapcs";
877 } else {
878 ABIName = "apcs-gnu";
879 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000880 } else if (Triple.isOSWindows()) {
881 // FIXME: this is invalid for WindowsCE
882 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000883 } else {
884 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000885 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000886 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000887 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000888 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000889 ABIName = "aapcs-linux";
890 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000891 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000892 case llvm::Triple::EABI:
893 ABIName = "aapcs";
894 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000895 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000896 if (Triple.getOS() == llvm::Triple::NetBSD)
897 ABIName = "apcs-gnu";
898 else
899 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000900 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000901 }
902 }
903 CmdArgs.push_back("-target-abi");
904 CmdArgs.push_back(ABIName);
905
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000906 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000907 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000908 if (FloatABI == "soft") {
909 // Floating point operations and argument passing are soft.
910 //
911 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000912 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000915 } else if (FloatABI == "softfp") {
916 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000917 CmdArgs.push_back("-mfloat-abi");
918 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000919 } else {
920 // Floating point operations and argument passing are hard.
921 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000922 CmdArgs.push_back("-mfloat-abi");
923 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000924 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000925
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000926 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000927 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
928 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000929 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000930 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000931 CmdArgs.push_back("-arm-global-merge=false");
932 else
933 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000934 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000935
Bob Wilson9c8af452013-04-11 18:53:25 +0000936 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000937 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000938 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000939}
Renato Goline17c5802015-07-27 23:44:42 +0000940// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000941
Tim Northover573cbee2014-05-24 12:52:07 +0000942/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
943/// targeting.
944static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000945 Arg *A;
946 std::string CPU;
947 // If we have -mtune or -mcpu, use that.
948 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000949 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000950 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000951 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000952 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000953 }
954
Kevin Qin110db6f2014-07-18 07:03:22 +0000955 // Handle CPU name is 'native'.
956 if (CPU == "native")
957 return llvm::sys::getHostCPUName();
958 else if (CPU.size())
959 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000960
James Molloy9b1586b2014-04-17 12:51:17 +0000961 // Make sure we pick "cyclone" if -arch is used.
962 // FIXME: Should this be picked by checking the target triple instead?
963 if (Args.getLastArg(options::OPT_arch))
964 return "cyclone";
965
966 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000967}
968
Tim Northover573cbee2014-05-24 12:52:07 +0000969void Clang::AddAArch64TargetArgs(const ArgList &Args,
970 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000971 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
972 llvm::Triple Triple(TripleStr);
973
974 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
975 Args.hasArg(options::OPT_mkernel) ||
976 Args.hasArg(options::OPT_fapple_kext))
977 CmdArgs.push_back("-disable-red-zone");
978
979 if (!Args.hasFlag(options::OPT_mimplicit_float,
980 options::OPT_mno_implicit_float, true))
981 CmdArgs.push_back("-no-implicit-float");
982
Craig Topper92fc2df2014-05-17 16:56:41 +0000983 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000984 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
985 ABIName = A->getValue();
986 else if (Triple.isOSDarwin())
987 ABIName = "darwinpcs";
988 else
989 ABIName = "aapcs";
990
991 CmdArgs.push_back("-target-abi");
992 CmdArgs.push_back(ABIName);
993
Bradley Smith9ff64332014-10-13 10:16:06 +0000994 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
995 options::OPT_mno_fix_cortex_a53_835769)) {
996 CmdArgs.push_back("-backend-option");
997 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
998 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
999 else
1000 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001001 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
1002 // Enabled A53 errata (835769) workaround by default on android
1003 CmdArgs.push_back("-backend-option");
1004 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001005 }
1006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-aarch64-global-merge=false");
1013 else
1014 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001015 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001016}
1017
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001018// Get CPU and ABI names. They are not independent
1019// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001020void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1021 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001022 const char *DefMips32CPU = "mips32r2";
1023 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001024
Daniel Sanders2bf13662014-07-10 14:40:57 +00001025 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1026 // default for mips64(el)?-img-linux-gnu.
1027 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1028 Triple.getEnvironment() == llvm::Triple::GNU) {
1029 DefMips32CPU = "mips32r6";
1030 DefMips64CPU = "mips64r6";
1031 }
Renato Golin7c542b42015-07-27 23:44:45 +00001032
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001033 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1034 if (Triple.getEnvironment() == llvm::Triple::Android)
1035 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001036
Brad Smithba26f582015-01-06 02:53:17 +00001037 // MIPS3 is the default for mips64*-unknown-openbsd.
1038 if (Triple.getOS() == llvm::Triple::OpenBSD)
1039 DefMips64CPU = "mips3";
1040
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001041 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001042 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001043
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001044 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001045 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001046 // Convert a GNU style Mips ABI name to the name
1047 // accepted by LLVM Mips backend.
1048 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001049 .Case("32", "o32")
1050 .Case("64", "n64")
1051 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001052 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001053
1054 // Setup default CPU and ABI names.
1055 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001056 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001057 default:
1058 llvm_unreachable("Unexpected triple arch name");
1059 case llvm::Triple::mips:
1060 case llvm::Triple::mipsel:
1061 CPUName = DefMips32CPU;
1062 break;
1063 case llvm::Triple::mips64:
1064 case llvm::Triple::mips64el:
1065 CPUName = DefMips64CPU;
1066 break;
1067 }
1068 }
1069
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001070 if (ABIName.empty()) {
1071 // Deduce ABI name from the target triple.
1072 if (Triple.getArch() == llvm::Triple::mips ||
1073 Triple.getArch() == llvm::Triple::mipsel)
1074 ABIName = "o32";
1075 else
1076 ABIName = "n64";
1077 }
1078
1079 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001080 // Deduce CPU name from ABI name.
1081 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001082 .Cases("o32", "eabi", DefMips32CPU)
1083 .Cases("n32", "n64", DefMips64CPU)
1084 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001085 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001086
1087 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001088}
1089
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001090// Convert ABI name to the GNU tools acceptable variant.
1091static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1092 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001093 .Case("o32", "32")
1094 .Case("n64", "64")
1095 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001096}
1097
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001098// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1099// and -mfloat-abi=.
1100static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001101 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001102 if (Arg *A =
1103 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1104 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001105 if (A->getOption().matches(options::OPT_msoft_float))
1106 FloatABI = "soft";
1107 else if (A->getOption().matches(options::OPT_mhard_float))
1108 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001109 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001110 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001111 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001112 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001113 FloatABI = "hard";
1114 }
1115 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001116 }
1117
1118 // If unspecified, choose the default based on the platform.
1119 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001120 // Assume "hard", because it's a default value used by gcc.
1121 // When we start to recognize specific target MIPS processors,
1122 // we will be able to select the default more correctly.
1123 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001124 }
1125
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001126 return FloatABI;
1127}
1128
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001129static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 std::vector<const char *> &Features,
1131 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001132 StringRef FeatureName) {
1133 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001134 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001135 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001136 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001137 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001138 }
1139}
1140
Daniel Sanders379d44b2014-07-16 11:52:23 +00001141static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1142 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001143 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001144 StringRef CPUName;
1145 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001146 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001147 ABIName = getGnuCompatibleMipsABIName(ABIName);
1148
Daniel Sandersfeb61302014-08-08 15:47:17 +00001149 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1150 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001151
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001152 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001153 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001154 // FIXME: Note, this is a hack. We need to pass the selected float
1155 // mode to the MipsTargetInfoBase to define appropriate macros there.
1156 // Now it is the only method.
1157 Features.push_back("+soft-float");
1158 }
1159
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001161 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001162 if (Val == "2008") {
1163 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1164 Features.push_back("+nan2008");
1165 else {
1166 Features.push_back("-nan2008");
1167 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1168 }
1169 } else if (Val == "legacy") {
1170 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1171 Features.push_back("-nan2008");
1172 else {
1173 Features.push_back("+nan2008");
1174 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1175 }
1176 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001177 D.Diag(diag::err_drv_unsupported_option_argument)
1178 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001179 }
1180
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001181 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1182 options::OPT_mdouble_float, "single-float");
1183 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1184 "mips16");
1185 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1186 options::OPT_mno_micromips, "micromips");
1187 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1188 "dsp");
1189 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1190 "dspr2");
1191 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1192 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001193
1194 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1195 // pass -mfpxx
1196 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1197 options::OPT_mfp64)) {
1198 if (A->getOption().matches(options::OPT_mfp32))
1199 Features.push_back(Args.MakeArgString("-fp64"));
1200 else if (A->getOption().matches(options::OPT_mfpxx)) {
1201 Features.push_back(Args.MakeArgString("+fpxx"));
1202 Features.push_back(Args.MakeArgString("+nooddspreg"));
1203 } else
1204 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001205 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001206 Features.push_back(Args.MakeArgString("+fpxx"));
1207 Features.push_back(Args.MakeArgString("+nooddspreg"));
1208 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001209
Daniel Sanders28e5d392014-07-10 10:39:51 +00001210 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1211 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001212}
1213
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001214void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001215 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001216 const Driver &D = getToolChain().getDriver();
1217 StringRef CPUName;
1218 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001219 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001220 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001221
1222 CmdArgs.push_back("-target-abi");
1223 CmdArgs.push_back(ABIName.data());
1224
1225 StringRef FloatABI = getMipsFloatABI(D, Args);
1226
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001227 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001228 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001229 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001230 CmdArgs.push_back("-mfloat-abi");
1231 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001232 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001233 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001234 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001235 CmdArgs.push_back("-mfloat-abi");
1236 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001237 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001238
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001239 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1240 if (A->getOption().matches(options::OPT_mxgot)) {
1241 CmdArgs.push_back("-mllvm");
1242 CmdArgs.push_back("-mxgot");
1243 }
1244 }
1245
Simon Atanasyanc580b322013-05-11 06:33:44 +00001246 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1247 options::OPT_mno_ldc1_sdc1)) {
1248 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1249 CmdArgs.push_back("-mllvm");
1250 CmdArgs.push_back("-mno-ldc1-sdc1");
1251 }
1252 }
1253
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001254 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1255 options::OPT_mno_check_zero_division)) {
1256 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1257 CmdArgs.push_back("-mllvm");
1258 CmdArgs.push_back("-mno-check-zero-division");
1259 }
1260 }
1261
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001262 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001263 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001264 CmdArgs.push_back("-mllvm");
1265 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1266 A->claim();
1267 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001268}
1269
Hal Finkel8eb59282012-06-11 22:35:19 +00001270/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1271static std::string getPPCTargetCPU(const ArgList &Args) {
1272 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001273 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001274
1275 if (CPUName == "native") {
1276 std::string CPU = llvm::sys::getHostCPUName();
1277 if (!CPU.empty() && CPU != "generic")
1278 return CPU;
1279 else
1280 return "";
1281 }
1282
1283 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001284 .Case("common", "generic")
1285 .Case("440", "440")
1286 .Case("440fp", "440")
1287 .Case("450", "450")
1288 .Case("601", "601")
1289 .Case("602", "602")
1290 .Case("603", "603")
1291 .Case("603e", "603e")
1292 .Case("603ev", "603ev")
1293 .Case("604", "604")
1294 .Case("604e", "604e")
1295 .Case("620", "620")
1296 .Case("630", "pwr3")
1297 .Case("G3", "g3")
1298 .Case("7400", "7400")
1299 .Case("G4", "g4")
1300 .Case("7450", "7450")
1301 .Case("G4+", "g4+")
1302 .Case("750", "750")
1303 .Case("970", "970")
1304 .Case("G5", "g5")
1305 .Case("a2", "a2")
1306 .Case("a2q", "a2q")
1307 .Case("e500mc", "e500mc")
1308 .Case("e5500", "e5500")
1309 .Case("power3", "pwr3")
1310 .Case("power4", "pwr4")
1311 .Case("power5", "pwr5")
1312 .Case("power5x", "pwr5x")
1313 .Case("power6", "pwr6")
1314 .Case("power6x", "pwr6x")
1315 .Case("power7", "pwr7")
1316 .Case("power8", "pwr8")
1317 .Case("pwr3", "pwr3")
1318 .Case("pwr4", "pwr4")
1319 .Case("pwr5", "pwr5")
1320 .Case("pwr5x", "pwr5x")
1321 .Case("pwr6", "pwr6")
1322 .Case("pwr6x", "pwr6x")
1323 .Case("pwr7", "pwr7")
1324 .Case("pwr8", "pwr8")
1325 .Case("powerpc", "ppc")
1326 .Case("powerpc64", "ppc64")
1327 .Case("powerpc64le", "ppc64le")
1328 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001329 }
1330
1331 return "";
1332}
1333
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001334static void getPPCTargetFeatures(const ArgList &Args,
1335 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001336 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1337 StringRef Name = A->getOption().getName();
1338 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001339
1340 // Skip over "-m".
1341 assert(Name.startswith("m") && "Invalid feature name.");
1342 Name = Name.substr(1);
1343
1344 bool IsNegative = Name.startswith("no-");
1345 if (IsNegative)
1346 Name = Name.substr(3);
1347
1348 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1349 // pass the correct option to the backend while calling the frontend
1350 // option the same.
1351 // TODO: Change the LLVM backend option maybe?
1352 if (Name == "mfcrf")
1353 Name = "mfocrf";
1354
1355 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1356 }
1357
1358 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001359 AddTargetFeature(Args, Features, options::OPT_faltivec,
1360 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001361}
1362
Ulrich Weigand8afad612014-07-28 13:17:52 +00001363void Clang::AddPPCTargetArgs(const ArgList &Args,
1364 ArgStringList &CmdArgs) const {
1365 // Select the ABI to use.
1366 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001367 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001368 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001369 case llvm::Triple::ppc64: {
1370 // When targeting a processor that supports QPX, or if QPX is
1371 // specifically enabled, default to using the ABI that supports QPX (so
1372 // long as it is not specifically disabled).
1373 bool HasQPX = false;
1374 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1375 HasQPX = A->getValue() == StringRef("a2q");
1376 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1377 if (HasQPX) {
1378 ABIName = "elfv1-qpx";
1379 break;
1380 }
1381
Ulrich Weigand8afad612014-07-28 13:17:52 +00001382 ABIName = "elfv1";
1383 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001384 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001385 case llvm::Triple::ppc64le:
1386 ABIName = "elfv2";
1387 break;
1388 default:
1389 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001390 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001391
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001392 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1393 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1394 // the option if given as we don't have backend support for any targets
1395 // that don't use the altivec abi.
1396 if (StringRef(A->getValue()) != "altivec")
1397 ABIName = A->getValue();
1398
Ulrich Weigand8afad612014-07-28 13:17:52 +00001399 if (ABIName) {
1400 CmdArgs.push_back("-target-abi");
1401 CmdArgs.push_back(ABIName);
1402 }
1403}
1404
1405bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1406 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1407 return A && (A->getValue() == StringRef(Value));
1408}
1409
Tom Stellard6674c702013-04-01 20:56:53 +00001410/// Get the (LLVM) name of the R600 gpu we are targeting.
1411static std::string getR600TargetGPU(const ArgList &Args) {
1412 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001413 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001414 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001415 .Cases("rv630", "rv635", "r600")
1416 .Cases("rv610", "rv620", "rs780", "rs880")
1417 .Case("rv740", "rv770")
1418 .Case("palm", "cedar")
1419 .Cases("sumo", "sumo2", "sumo")
1420 .Case("hemlock", "cypress")
1421 .Case("aruba", "cayman")
1422 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001423 }
1424 return "";
1425}
1426
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001427void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001428 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001430 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001431
James Y Knightb2406522015-06-15 20:51:24 +00001432 bool SoftFloatABI = false;
1433 if (Arg *A =
1434 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001435 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001436 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001437 }
1438
James Y Knightb2406522015-06-15 20:51:24 +00001439 // Only the hard-float ABI on Sparc is standardized, and it is the
1440 // default. GCC also supports a nonstandard soft-float ABI mode, and
1441 // perhaps LLVM should implement that, too. However, since llvm
1442 // currently does not support Sparc soft-float, at all, display an
1443 // error if it's requested.
1444 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001445 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1446 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001447 }
1448}
1449
Richard Sandiford4652d892013-07-19 16:51:51 +00001450static const char *getSystemZTargetCPU(const ArgList &Args) {
1451 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1452 return A->getValue();
1453 return "z10";
1454}
1455
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001456static void getSystemZTargetFeatures(const ArgList &Args,
1457 std::vector<const char *> &Features) {
1458 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001459 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001460 if (A->getOption().matches(options::OPT_mhtm))
1461 Features.push_back("+transactional-execution");
1462 else
1463 Features.push_back("-transactional-execution");
1464 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001465 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001466 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001467 if (A->getOption().matches(options::OPT_mvx))
1468 Features.push_back("+vector");
1469 else
1470 Features.push_back("-vector");
1471 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001472}
1473
Chandler Carruth953fb082013-01-13 11:46:33 +00001474static const char *getX86TargetCPU(const ArgList &Args,
1475 const llvm::Triple &Triple) {
1476 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001477 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001478 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001479 return "core-avx2";
1480
Chandler Carruth953fb082013-01-13 11:46:33 +00001481 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001482 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001483
1484 // FIXME: Reject attempts to use -march=native unless the target matches
1485 // the host.
1486 //
1487 // FIXME: We should also incorporate the detected target features for use
1488 // with -native.
1489 std::string CPU = llvm::sys::getHostCPUName();
1490 if (!CPU.empty() && CPU != "generic")
1491 return Args.MakeArgString(CPU);
1492 }
1493
Reid Kleckner3123eff2015-06-30 16:32:04 +00001494 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1495 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1496 StringRef Arch = A->getValue();
1497 const char *CPU;
1498 if (Triple.getArch() == llvm::Triple::x86) {
1499 CPU = llvm::StringSwitch<const char *>(Arch)
1500 .Case("IA32", "i386")
1501 .Case("SSE", "pentium3")
1502 .Case("SSE2", "pentium4")
1503 .Case("AVX", "sandybridge")
1504 .Case("AVX2", "haswell")
1505 .Default(nullptr);
1506 } else {
1507 CPU = llvm::StringSwitch<const char *>(Arch)
1508 .Case("AVX", "sandybridge")
1509 .Case("AVX2", "haswell")
1510 .Default(nullptr);
1511 }
1512 if (CPU)
1513 return CPU;
1514 }
1515
Chandler Carruth953fb082013-01-13 11:46:33 +00001516 // Select the default CPU if none was given (or detection failed).
1517
1518 if (Triple.getArch() != llvm::Triple::x86_64 &&
1519 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001520 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001521
1522 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1523
1524 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001525 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001526 if (Triple.getArchName() == "x86_64h")
1527 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001528 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001529 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001530
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001531 // Set up default CPU name for PS4 compilers.
1532 if (Triple.isPS4CPU())
1533 return "btver2";
1534
Alexey Bataev286d1b92014-01-31 04:07:13 +00001535 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001536 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001537 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001538
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001539 // Everything else goes to x86-64 in 64-bit mode.
1540 if (Is64Bit)
1541 return "x86-64";
1542
1543 switch (Triple.getOS()) {
1544 case llvm::Triple::FreeBSD:
1545 case llvm::Triple::NetBSD:
1546 case llvm::Triple::OpenBSD:
1547 return "i486";
1548 case llvm::Triple::Haiku:
1549 return "i586";
1550 case llvm::Triple::Bitrig:
1551 return "i686";
1552 default:
1553 // Fallback to p4.
1554 return "pentium4";
1555 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001556}
1557
Dan Gohmanc2853072015-09-03 22:51:53 +00001558/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1559static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1560 // If we have -mcpu=, use that.
1561 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1562 StringRef CPU = A->getValue();
1563
1564#ifdef __wasm__
1565 // Handle "native" by examining the host. "native" isn't meaningful when
1566 // cross compiling, so only support this when the host is also WebAssembly.
1567 if (CPU == "native")
1568 return llvm::sys::getHostCPUName();
1569#endif
1570
1571 return CPU;
1572 }
1573
1574 return "generic";
1575}
1576
Renato Golin7c542b42015-07-27 23:44:45 +00001577static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1578 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001579 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001580 default:
1581 return "";
1582
Amara Emerson703da2e2013-10-31 09:32:33 +00001583 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001584 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001585 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001586
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001587 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001588 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001589 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001590 case llvm::Triple::thumbeb: {
1591 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001592 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001593 return arm::getARMTargetCPU(MCPU, MArch, T);
1594 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001595 case llvm::Triple::mips:
1596 case llvm::Triple::mipsel:
1597 case llvm::Triple::mips64:
1598 case llvm::Triple::mips64el: {
1599 StringRef CPUName;
1600 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001601 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001602 return CPUName;
1603 }
1604
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001605 case llvm::Triple::nvptx:
1606 case llvm::Triple::nvptx64:
1607 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1608 return A->getValue();
1609 return "";
1610
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001611 case llvm::Triple::ppc:
1612 case llvm::Triple::ppc64:
1613 case llvm::Triple::ppc64le: {
1614 std::string TargetCPUName = getPPCTargetCPU(Args);
1615 // LLVM may default to generating code for the native CPU,
1616 // but, like gcc, we default to a more generic option for
1617 // each architecture. (except on Darwin)
1618 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1619 if (T.getArch() == llvm::Triple::ppc64)
1620 TargetCPUName = "ppc64";
1621 else if (T.getArch() == llvm::Triple::ppc64le)
1622 TargetCPUName = "ppc64le";
1623 else
1624 TargetCPUName = "ppc";
1625 }
1626 return TargetCPUName;
1627 }
1628
1629 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001630 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001631 case llvm::Triple::sparcv9:
1632 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001633 return A->getValue();
1634 return "";
1635
1636 case llvm::Triple::x86:
1637 case llvm::Triple::x86_64:
1638 return getX86TargetCPU(Args, T);
1639
1640 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001641 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001642
1643 case llvm::Triple::systemz:
1644 return getSystemZTargetCPU(Args);
1645
1646 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001647 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001648 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001649
1650 case llvm::Triple::wasm32:
1651 case llvm::Triple::wasm64:
1652 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001653 }
1654}
1655
Alp Tokerce365ca2013-12-02 12:43:03 +00001656static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1657 ArgStringList &CmdArgs) {
1658 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1659 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1660 // forward.
1661 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001662 std::string Plugin =
1663 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001664 CmdArgs.push_back(Args.MakeArgString(Plugin));
1665
1666 // Try to pass driver level flags relevant to LTO code generation down to
1667 // the plugin.
1668
1669 // Handle flags for selecting CPU variants.
1670 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1671 if (!CPU.empty())
1672 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1673}
1674
Sanjay Patel2987c292015-06-11 14:53:41 +00001675/// This is a helper function for validating the optional refinement step
1676/// parameter in reciprocal argument strings. Return false if there is an error
1677/// parsing the refinement step. Otherwise, return true and set the Position
1678/// of the refinement step in the input string.
1679static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001680 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001681 const char RefinementStepToken = ':';
1682 Position = In.find(RefinementStepToken);
1683 if (Position != StringRef::npos) {
1684 StringRef Option = A.getOption().getName();
1685 StringRef RefStep = In.substr(Position + 1);
1686 // Allow exactly one numeric character for the additional refinement
1687 // step parameter. This is reasonable for all currently-supported
1688 // operations and architectures because we would expect that a larger value
1689 // of refinement steps would cause the estimate "optimization" to
1690 // under-perform the native operation. Also, if the estimate does not
1691 // converge quickly, it probably will not ever converge, so further
1692 // refinement steps will not produce a better answer.
1693 if (RefStep.size() != 1) {
1694 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1695 return false;
1696 }
1697 char RefStepChar = RefStep[0];
1698 if (RefStepChar < '0' || RefStepChar > '9') {
1699 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1700 return false;
1701 }
1702 }
1703 return true;
1704}
1705
1706/// The -mrecip flag requires processing of many optional parameters.
1707static void ParseMRecip(const Driver &D, const ArgList &Args,
1708 ArgStringList &OutStrings) {
1709 StringRef DisabledPrefixIn = "!";
1710 StringRef DisabledPrefixOut = "!";
1711 StringRef EnabledPrefixOut = "";
1712 StringRef Out = "-mrecip=";
1713
1714 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1715 if (!A)
1716 return;
1717
1718 unsigned NumOptions = A->getNumValues();
1719 if (NumOptions == 0) {
1720 // No option is the same as "all".
1721 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1722 return;
1723 }
1724
1725 // Pass through "all", "none", or "default" with an optional refinement step.
1726 if (NumOptions == 1) {
1727 StringRef Val = A->getValue(0);
1728 size_t RefStepLoc;
1729 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1730 return;
1731 StringRef ValBase = Val.slice(0, RefStepLoc);
1732 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1733 OutStrings.push_back(Args.MakeArgString(Out + Val));
1734 return;
1735 }
1736 }
1737
1738 // Each reciprocal type may be enabled or disabled individually.
1739 // Check each input value for validity, concatenate them all back together,
1740 // and pass through.
1741
1742 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001743 OptionStrings.insert(std::make_pair("divd", false));
1744 OptionStrings.insert(std::make_pair("divf", false));
1745 OptionStrings.insert(std::make_pair("vec-divd", false));
1746 OptionStrings.insert(std::make_pair("vec-divf", false));
1747 OptionStrings.insert(std::make_pair("sqrtd", false));
1748 OptionStrings.insert(std::make_pair("sqrtf", false));
1749 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1750 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001751
1752 for (unsigned i = 0; i != NumOptions; ++i) {
1753 StringRef Val = A->getValue(i);
1754
1755 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1756 // Ignore the disablement token for string matching.
1757 if (IsDisabled)
1758 Val = Val.substr(1);
1759
1760 size_t RefStep;
1761 if (!getRefinementStep(Val, D, *A, RefStep))
1762 return;
1763
1764 StringRef ValBase = Val.slice(0, RefStep);
1765 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1766 if (OptionIter == OptionStrings.end()) {
1767 // Try again specifying float suffix.
1768 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1769 if (OptionIter == OptionStrings.end()) {
1770 // The input name did not match any known option string.
1771 D.Diag(diag::err_drv_unknown_argument) << Val;
1772 return;
1773 }
1774 // The option was specified without a float or double suffix.
1775 // Make sure that the double entry was not already specified.
1776 // The float entry will be checked below.
1777 if (OptionStrings[ValBase.str() + 'd']) {
1778 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1779 return;
1780 }
1781 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001782
Sanjay Patel2987c292015-06-11 14:53:41 +00001783 if (OptionIter->second == true) {
1784 // Duplicate option specified.
1785 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1786 return;
1787 }
1788
1789 // Mark the matched option as found. Do not allow duplicate specifiers.
1790 OptionIter->second = true;
1791
1792 // If the precision was not specified, also mark the double entry as found.
1793 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1794 OptionStrings[ValBase.str() + 'd'] = true;
1795
1796 // Build the output string.
1797 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1798 Out = Args.MakeArgString(Out + Prefix + Val);
1799 if (i != NumOptions - 1)
1800 Out = Args.MakeArgString(Out + ",");
1801 }
1802
1803 OutStrings.push_back(Args.MakeArgString(Out));
1804}
1805
Eric Christopherc54920a2015-03-23 19:26:05 +00001806static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001807 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001808 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001809 // If -march=native, autodetect the feature list.
1810 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1811 if (StringRef(A->getValue()) == "native") {
1812 llvm::StringMap<bool> HostFeatures;
1813 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1814 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001815 Features.push_back(
1816 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001817 }
1818 }
1819
Jim Grosbach82eee262013-11-16 00:53:35 +00001820 if (Triple.getArchName() == "x86_64h") {
1821 // x86_64h implies quite a few of the more modern subtarget features
1822 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1823 Features.push_back("-rdrnd");
1824 Features.push_back("-aes");
1825 Features.push_back("-pclmul");
1826 Features.push_back("-rtm");
1827 Features.push_back("-hle");
1828 Features.push_back("-fsgsbase");
1829 }
1830
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001831 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001832 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001833 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001834 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001835 Features.push_back("+sse4.2");
1836 Features.push_back("+popcnt");
1837 } else
1838 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001839 }
1840
Eric Christopherc54920a2015-03-23 19:26:05 +00001841 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001842 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1843 StringRef Arch = A->getValue();
1844 bool ArchUsed = false;
1845 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001846 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001847 if (Arch == "AVX" || Arch == "AVX2") {
1848 ArchUsed = true;
1849 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1850 }
1851 }
1852 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001853 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001854 if (Arch == "IA32") {
1855 ArchUsed = true;
1856 } else if (Arch == "SSE" || Arch == "SSE2") {
1857 ArchUsed = true;
1858 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1859 }
1860 }
1861 if (!ArchUsed)
1862 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1863 }
1864
Jim Grosbach82eee262013-11-16 00:53:35 +00001865 // Now add any that the user explicitly requested on the command line,
1866 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001867 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1868 StringRef Name = A->getOption().getName();
1869 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001870
1871 // Skip over "-m".
1872 assert(Name.startswith("m") && "Invalid feature name.");
1873 Name = Name.substr(1);
1874
1875 bool IsNegative = Name.startswith("no-");
1876 if (IsNegative)
1877 Name = Name.substr(3);
1878
1879 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1880 }
1881}
1882
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001883void Clang::AddX86TargetArgs(const ArgList &Args,
1884 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001885 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001886 Args.hasArg(options::OPT_mkernel) ||
1887 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001888 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001889
Bob Wilson2616e2e2013-02-10 16:01:41 +00001890 // Default to avoid implicit floating-point for kernel/kext code, but allow
1891 // that to be overridden with -mno-soft-float.
1892 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1893 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 if (Arg *A = Args.getLastArg(
1895 options::OPT_msoft_float, options::OPT_mno_soft_float,
1896 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001897 const Option &O = A->getOption();
1898 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1899 O.matches(options::OPT_msoft_float));
1900 }
1901 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001902 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001903
1904 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1905 StringRef Value = A->getValue();
1906 if (Value == "intel" || Value == "att") {
1907 CmdArgs.push_back("-mllvm");
1908 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1909 } else {
1910 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1911 << A->getOption().getName() << Value;
1912 }
1913 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001914}
1915
Tony Linthicum76329bf2011-12-12 21:14:55 +00001916void Clang::AddHexagonTargetArgs(const ArgList &Args,
1917 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001918 CmdArgs.push_back("-mqdsp6-compat");
1919 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001920
Douglas Katzman54366072015-07-27 16:53:08 +00001921 if (const char *v =
1922 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001923 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001924 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001925 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001926 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001927 }
1928
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001929 if (!Args.hasArg(options::OPT_fno_short_enums))
1930 CmdArgs.push_back("-fshort-enums");
1931 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001932 CmdArgs.push_back("-mllvm");
1933 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001934 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001935 CmdArgs.push_back("-mllvm");
1936 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001937}
1938
Kevin Qin110db6f2014-07-18 07:03:22 +00001939// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001940static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001941 std::vector<const char *> &Features) {
1942 SmallVector<StringRef, 8> Split;
1943 text.split(Split, StringRef("+"), -1, false);
1944
Douglas Katzman2675d012015-06-29 19:12:56 +00001945 for (const StringRef Feature : Split) {
1946 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001947 .Case("fp", "+fp-armv8")
1948 .Case("simd", "+neon")
1949 .Case("crc", "+crc")
1950 .Case("crypto", "+crypto")
1951 .Case("nofp", "-fp-armv8")
1952 .Case("nosimd", "-neon")
1953 .Case("nocrc", "-crc")
1954 .Case("nocrypto", "-crypto")
1955 .Default(nullptr);
1956 if (result)
1957 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001958 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001959 D.Diag(diag::err_drv_no_neon_modifier);
1960 else
1961 return false;
1962 }
1963 return true;
1964}
1965
1966// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1967// decode CPU and feature.
1968static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1969 std::vector<const char *> &Features) {
1970 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1971 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001972 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1973 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001974 Features.push_back("+neon");
1975 Features.push_back("+crc");
1976 Features.push_back("+crypto");
1977 } else if (CPU == "generic") {
1978 Features.push_back("+neon");
1979 } else {
1980 return false;
1981 }
1982
1983 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1984 return false;
1985
1986 return true;
1987}
1988
1989static bool
1990getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1991 const ArgList &Args,
1992 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001993 std::string MarchLowerCase = March.lower();
1994 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001995
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001996 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001997 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001998 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001999 Features.push_back("+v8.1a");
2000 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002001 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002002 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002003
2004 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2005 return false;
2006
2007 return true;
2008}
2009
2010static bool
2011getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2012 const ArgList &Args,
2013 std::vector<const char *> &Features) {
2014 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002015 std::string McpuLowerCase = Mcpu.lower();
2016 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002017 return false;
2018
2019 return true;
2020}
2021
2022static bool
2023getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2024 const ArgList &Args,
2025 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002026 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002027 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002028 if (MtuneLowerCase == "native")
2029 MtuneLowerCase = llvm::sys::getHostCPUName();
2030 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002031 Features.push_back("+zcm");
2032 Features.push_back("+zcz");
2033 }
2034 return true;
2035}
2036
2037static bool
2038getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2039 const ArgList &Args,
2040 std::vector<const char *> &Features) {
2041 StringRef CPU;
2042 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002043 std::string McpuLowerCase = Mcpu.lower();
2044 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002045 return false;
2046
2047 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2048}
2049
Akira Hatanaka92500472015-07-27 19:29:04 +00002050static void getAArch64TargetFeatures(const Driver &D,
2051 const llvm::Triple &Triple,
2052 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002053 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002054 Arg *A;
2055 bool success = true;
2056 // Enable NEON by default.
2057 Features.push_back("+neon");
2058 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2059 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2060 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2061 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002062 else if (Args.hasArg(options::OPT_arch))
2063 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2064 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002065
2066 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2067 success =
2068 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2069 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2070 success =
2071 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002072 else if (Args.hasArg(options::OPT_arch))
2073 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2074 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002075
2076 if (!success)
2077 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002078
2079 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2080 Features.push_back("-fp-armv8");
2081 Features.push_back("-crypto");
2082 Features.push_back("-neon");
2083 }
Bradley Smith418c5932014-05-02 15:17:51 +00002084
2085 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002086 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002087 if (A->getOption().matches(options::OPT_mcrc))
2088 Features.push_back("+crc");
2089 else
2090 Features.push_back("-crc");
2091 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002092
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002093 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2094 options::OPT_munaligned_access))
2095 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2096 Features.push_back("+strict-align");
2097
Akira Hatanaka92500472015-07-27 19:29:04 +00002098 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002099 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002100}
2101
Dan Gohmanc2853072015-09-03 22:51:53 +00002102static void getWebAssemblyTargetFeatures(const ArgList &Args,
2103 std::vector<const char *> &Features) {
2104 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2105 StringRef Name = A->getOption().getName();
2106 A->claim();
2107
2108 // Skip over "-m".
2109 assert(Name.startswith("m") && "Invalid feature name.");
2110 Name = Name.substr(1);
2111
2112 bool IsNegative = Name.startswith("no-");
2113 if (IsNegative)
2114 Name = Name.substr(3);
2115
2116 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2117 }
2118}
2119
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002120static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002121 const ArgList &Args, ArgStringList &CmdArgs,
2122 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002123 std::vector<const char *> Features;
2124 switch (Triple.getArch()) {
2125 default:
2126 break;
2127 case llvm::Triple::mips:
2128 case llvm::Triple::mipsel:
2129 case llvm::Triple::mips64:
2130 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002131 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002132 break;
2133
2134 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002135 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002136 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002137 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002138 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002139 break;
2140
2141 case llvm::Triple::ppc:
2142 case llvm::Triple::ppc64:
2143 case llvm::Triple::ppc64le:
2144 getPPCTargetFeatures(Args, Features);
2145 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002146 case llvm::Triple::systemz:
2147 getSystemZTargetFeatures(Args, Features);
2148 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002149 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002150 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002151 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002152 break;
2153 case llvm::Triple::x86:
2154 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002155 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002156 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002157 case llvm::Triple::wasm32:
2158 case llvm::Triple::wasm64:
2159 getWebAssemblyTargetFeatures(Args, Features);
2160 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002161 }
Rafael Espindola43964802013-08-21 17:34:32 +00002162
2163 // Find the last of each feature.
2164 llvm::StringMap<unsigned> LastOpt;
2165 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2166 const char *Name = Features[I];
2167 assert(Name[0] == '-' || Name[0] == '+');
2168 LastOpt[Name + 1] = I;
2169 }
2170
2171 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2172 // If this feature was overridden, ignore it.
2173 const char *Name = Features[I];
2174 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2175 assert(LastI != LastOpt.end());
2176 unsigned Last = LastI->second;
2177 if (Last != I)
2178 continue;
2179
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002180 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002181 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002182 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002183}
2184
David Majnemerae394812014-12-09 00:12:30 +00002185static bool
2186shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2187 const llvm::Triple &Triple) {
2188 // We use the zero-cost exception tables for Objective-C if the non-fragile
2189 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2190 // later.
2191 if (runtime.isNonFragile())
2192 return true;
2193
2194 if (!Triple.isMacOSX())
2195 return false;
2196
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002197 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002198 (Triple.getArch() == llvm::Triple::x86_64 ||
2199 Triple.getArch() == llvm::Triple::arm));
2200}
2201
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002202/// Adds exception related arguments to the driver command arguments. There's a
2203/// master flag, -fexceptions and also language specific flags to enable/disable
2204/// C++ and Objective-C exceptions. This makes it possible to for example
2205/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002206static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002207 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002208 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002209 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002210 const Driver &D = TC.getDriver();
2211 const llvm::Triple &Triple = TC.getTriple();
2212
Chad Rosier4fab82c2012-03-26 22:04:46 +00002213 if (KernelOrKext) {
2214 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2215 // arguments now to avoid warnings about unused arguments.
2216 Args.ClaimAllArgs(options::OPT_fexceptions);
2217 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2218 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2219 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2220 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2221 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002222 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002223 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002224
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002225 // See if the user explicitly enabled exceptions.
2226 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2227 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002228
David Majnemerae394812014-12-09 00:12:30 +00002229 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2230 // is not necessarily sensible, but follows GCC.
2231 if (types::isObjC(InputType) &&
2232 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002233 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002234 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002235
David Majnemerae394812014-12-09 00:12:30 +00002236 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002237 }
2238
2239 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002240 // Disable C++ EH by default on XCore, PS4, and MSVC.
2241 // FIXME: Remove MSVC from this list once things work.
2242 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2243 !Triple.isPS4CPU() &&
2244 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002245 Arg *ExceptionArg = Args.getLastArg(
2246 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2247 options::OPT_fexceptions, options::OPT_fno_exceptions);
2248 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002249 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002250 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2251 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002252
2253 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002254 if (Triple.isPS4CPU()) {
2255 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2256 assert(ExceptionArg &&
2257 "On the PS4 exceptions should only be enabled if passing "
2258 "an argument");
2259 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2260 const Arg *RTTIArg = TC.getRTTIArg();
2261 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2262 D.Diag(diag::err_drv_argument_not_allowed_with)
2263 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2264 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2265 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2266 } else
2267 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2268
Anders Carlssone96ab552011-02-28 02:27:16 +00002269 CmdArgs.push_back("-fcxx-exceptions");
2270
David Majnemer8de68642014-12-05 08:11:58 +00002271 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002272 }
2273 }
2274
David Majnemer8de68642014-12-05 08:11:58 +00002275 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002276 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002277}
2278
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002279static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002280 bool Default = true;
2281 if (TC.getTriple().isOSDarwin()) {
2282 // The native darwin assembler doesn't support the linker_option directives,
2283 // so we disable them if we think the .s file will be passed to it.
2284 Default = TC.useIntegratedAs();
2285 }
2286 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2287 Default);
2288}
2289
Ted Kremenek62093662013-03-12 17:02:12 +00002290static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2291 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002292 bool UseDwarfDirectory =
2293 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2294 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002295 return !UseDwarfDirectory;
2296}
2297
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002298/// \brief Check whether the given input tree contains any compilation actions.
2299static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002300 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002301 return true;
2302
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002303 for (const auto &Act : *A)
2304 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002305 return true;
2306
2307 return false;
2308}
2309
2310/// \brief Check if -relax-all should be passed to the internal assembler.
2311/// This is done by default when compiling non-assembler source with -O0.
2312static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2313 bool RelaxDefault = true;
2314
2315 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2316 RelaxDefault = A->getOption().matches(options::OPT_O0);
2317
2318 if (RelaxDefault) {
2319 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002320 for (const auto &Act : C.getActions()) {
2321 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002322 RelaxDefault = true;
2323 break;
2324 }
2325 }
2326 }
2327
2328 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002329 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002330}
2331
David Blaikie9260ed62013-07-25 21:19:01 +00002332static void CollectArgsForIntegratedAssembler(Compilation &C,
2333 const ArgList &Args,
2334 ArgStringList &CmdArgs,
2335 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002336 if (UseRelaxAll(C, Args))
2337 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002338
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002339 // When passing -I arguments to the assembler we sometimes need to
2340 // unconditionally take the next argument. For example, when parsing
2341 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2342 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2343 // arg after parsing the '-I' arg.
2344 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002345
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002346 // When using an integrated assembler, translate -Wa, and -Xassembler
2347 // options.
2348 bool CompressDebugSections = false;
2349 for (const Arg *A :
2350 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2351 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002352
Renato Golin7c542b42015-07-27 23:44:45 +00002353 for (const StringRef Value : A->getValues()) {
2354 if (TakeNextArg) {
2355 CmdArgs.push_back(Value.data());
2356 TakeNextArg = false;
2357 continue;
2358 }
David Blaikie9260ed62013-07-25 21:19:01 +00002359
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002360 if (Value == "-force_cpusubtype_ALL") {
2361 // Do nothing, this is the default and we don't support anything else.
2362 } else if (Value == "-L") {
2363 CmdArgs.push_back("-msave-temp-labels");
2364 } else if (Value == "--fatal-warnings") {
2365 CmdArgs.push_back("-massembler-fatal-warnings");
2366 } else if (Value == "--noexecstack") {
2367 CmdArgs.push_back("-mnoexecstack");
2368 } else if (Value == "-compress-debug-sections" ||
2369 Value == "--compress-debug-sections") {
2370 CompressDebugSections = true;
2371 } else if (Value == "-nocompress-debug-sections" ||
2372 Value == "--nocompress-debug-sections") {
2373 CompressDebugSections = false;
2374 } else if (Value.startswith("-I")) {
2375 CmdArgs.push_back(Value.data());
2376 // We need to consume the next argument if the current arg is a plain
2377 // -I. The next arg will be the include directory.
2378 if (Value == "-I")
2379 TakeNextArg = true;
2380 } else if (Value.startswith("-gdwarf-")) {
2381 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002382 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2383 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2384 // Do nothing, we'll validate it later.
Daniel Sanders4f7cd232015-09-03 12:58:39 +00002385 } else if (Value == "--trap") {
2386 CmdArgs.push_back("-target-feature");
2387 CmdArgs.push_back("+use-tcc-in-div");
2388 } else if (Value == "--break") {
2389 CmdArgs.push_back("-target-feature");
2390 CmdArgs.push_back("-use-tcc-in-div");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002391 } else {
2392 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002393 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002394 }
2395 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002396 }
2397 if (CompressDebugSections) {
2398 if (llvm::zlib::isAvailable())
2399 CmdArgs.push_back("-compress-debug-sections");
2400 else
2401 D.Diag(diag::warn_debug_compression_unavailable);
2402 }
David Blaikie9260ed62013-07-25 21:19:01 +00002403}
2404
Renato Goline807c122014-01-31 11:47:28 +00002405// Until ARM libraries are build separately, we have them all in one library
2406static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002407 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002408 TC.getArch() == llvm::Triple::x86)
2409 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002410 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002411 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002412 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002413}
2414
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002415static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2416 // The runtimes are located in the OS-specific resource directory.
2417 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002418 const llvm::Triple &Triple = TC.getTriple();
2419 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002420 StringRef OSLibName =
2421 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002422 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002423 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002424}
2425
Peter Collingbourne581f4382015-07-02 01:48:12 +00002426SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2427 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002428 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2429 ? "-android"
2430 : "";
2431
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002432 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002433 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2434 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002435 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002436 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002437 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002438 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002439
2440 SmallString<128> Path = getCompilerRTLibDir(TC);
2441 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2442 Arch + Env + Suffix);
2443
2444 return Path;
2445}
2446
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002447// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002448// FIXME: Make sure we can also emit shared objects if they're requested
2449// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002450static void addClangRT(const ToolChain &TC, const ArgList &Args,
2451 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002452 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002453}
2454
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002455static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2456 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002457 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2458 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002459 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002460 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002461 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002462 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002463 Args.hasArg(options::OPT_fcreate_profile) ||
2464 Args.hasArg(options::OPT_coverage)))
2465 return;
2466
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002467 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002468}
2469
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002470namespace {
2471enum OpenMPRuntimeKind {
2472 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2473 /// without knowing what runtime to target.
2474 OMPRT_Unknown,
2475
2476 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2477 /// the default for Clang.
2478 OMPRT_OMP,
2479
2480 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2481 /// this runtime but can swallow the pragmas, and find and link against the
2482 /// runtime library itself.
2483 OMPRT_GOMP,
2484
Chandler Carruthc6625c62015-05-28 21:10:31 +00002485 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002486 /// OpenMP runtime. We support this mode for users with existing dependencies
2487 /// on this runtime library name.
2488 OMPRT_IOMP5
2489};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002490}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002491
2492/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002493static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2494 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002495 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2496
2497 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2498 if (A)
2499 RuntimeName = A->getValue();
2500
2501 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002502 .Case("libomp", OMPRT_OMP)
2503 .Case("libgomp", OMPRT_GOMP)
2504 .Case("libiomp5", OMPRT_IOMP5)
2505 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002506
2507 if (RT == OMPRT_Unknown) {
2508 if (A)
2509 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002510 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002511 else
2512 // FIXME: We could use a nicer diagnostic here.
2513 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2514 }
2515
2516 return RT;
2517}
2518
Alexey Samsonov52550342014-09-15 19:58:40 +00002519static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2520 ArgStringList &CmdArgs, StringRef Sanitizer,
2521 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002522 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002523 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002524 if (!IsShared)
2525 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002526 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002527 if (!IsShared)
2528 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002529}
2530
Alexey Samsonov52550342014-09-15 19:58:40 +00002531// Tries to use a file with the list of dynamic symbols that need to be exported
2532// from the runtime library. Returns true if the file was found.
2533static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2534 ArgStringList &CmdArgs,
2535 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002536 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2537 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2538 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002539 return true;
2540 }
2541 return false;
2542}
2543
2544static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2545 ArgStringList &CmdArgs) {
2546 // Force linking against the system libraries sanitizers depends on
2547 // (see PR15823 why this is necessary).
2548 CmdArgs.push_back("--no-as-needed");
2549 CmdArgs.push_back("-lpthread");
2550 CmdArgs.push_back("-lrt");
2551 CmdArgs.push_back("-lm");
2552 // There's no libdl on FreeBSD.
2553 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2554 CmdArgs.push_back("-ldl");
2555}
2556
2557static void
2558collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2559 SmallVectorImpl<StringRef> &SharedRuntimes,
2560 SmallVectorImpl<StringRef> &StaticRuntimes,
2561 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2562 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2563 // Collect shared runtimes.
2564 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2565 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002566 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002567
Alexey Samsonov52550342014-09-15 19:58:40 +00002568 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002569 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002570 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2571 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002572 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002573 }
2574 if (SanArgs.needsAsanRt()) {
2575 if (SanArgs.needsSharedAsanRt()) {
2576 HelperStaticRuntimes.push_back("asan-preinit");
2577 } else {
2578 StaticRuntimes.push_back("asan");
2579 if (SanArgs.linkCXXRuntimes())
2580 StaticRuntimes.push_back("asan_cxx");
2581 }
2582 }
2583 if (SanArgs.needsDfsanRt())
2584 StaticRuntimes.push_back("dfsan");
2585 if (SanArgs.needsLsanRt())
2586 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002587 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002588 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002589 if (SanArgs.linkCXXRuntimes())
2590 StaticRuntimes.push_back("msan_cxx");
2591 }
2592 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002593 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002594 if (SanArgs.linkCXXRuntimes())
2595 StaticRuntimes.push_back("tsan_cxx");
2596 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002597 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002598 StaticRuntimes.push_back("ubsan_standalone");
2599 if (SanArgs.linkCXXRuntimes())
2600 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002601 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002602 if (SanArgs.needsSafeStackRt())
2603 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002604}
2605
Alexey Samsonov52550342014-09-15 19:58:40 +00002606// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2607// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2608static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002609 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002610 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2611 HelperStaticRuntimes;
2612 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2613 HelperStaticRuntimes);
2614 for (auto RT : SharedRuntimes)
2615 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2616 for (auto RT : HelperStaticRuntimes)
2617 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2618 bool AddExportDynamic = false;
2619 for (auto RT : StaticRuntimes) {
2620 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2621 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2622 }
2623 // If there is a static runtime with no dynamic list, force all the symbols
2624 // to be dynamic to be sure we export sanitizer interface functions.
2625 if (AddExportDynamic)
2626 CmdArgs.push_back("-export-dynamic");
2627 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002628}
2629
Reid Kleckner86ea7702015-02-04 23:45:07 +00002630static bool areOptimizationsEnabled(const ArgList &Args) {
2631 // Find the last -O arg and see if it is non-zero.
2632 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2633 return !A->getOption().matches(options::OPT_O0);
2634 // Defaults to -O0.
2635 return false;
2636}
2637
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002638static bool shouldUseFramePointerForTarget(const ArgList &Args,
2639 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002640 switch (Triple.getArch()) {
2641 case llvm::Triple::xcore:
2642 case llvm::Triple::wasm32:
2643 case llvm::Triple::wasm64:
2644 // XCore never wants frame pointers, regardless of OS.
2645 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002646 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002647 default:
2648 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002649 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002650
2651 if (Triple.isOSLinux()) {
2652 switch (Triple.getArch()) {
2653 // Don't use a frame pointer on linux if optimizing for certain targets.
2654 case llvm::Triple::mips64:
2655 case llvm::Triple::mips64el:
2656 case llvm::Triple::mips:
2657 case llvm::Triple::mipsel:
2658 case llvm::Triple::systemz:
2659 case llvm::Triple::x86:
2660 case llvm::Triple::x86_64:
2661 return !areOptimizationsEnabled(Args);
2662 default:
2663 return true;
2664 }
2665 }
2666
2667 if (Triple.isOSWindows()) {
2668 switch (Triple.getArch()) {
2669 case llvm::Triple::x86:
2670 return !areOptimizationsEnabled(Args);
2671 default:
2672 // All other supported Windows ISAs use xdata unwind information, so frame
2673 // pointers are not generally useful.
2674 return false;
2675 }
2676 }
2677
2678 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002679}
2680
Rafael Espindola224dd632011-12-14 21:02:23 +00002681static bool shouldUseFramePointer(const ArgList &Args,
2682 const llvm::Triple &Triple) {
2683 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2684 options::OPT_fomit_frame_pointer))
2685 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2686
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002687 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002688}
2689
Eric Christopherb7d97e92013-04-03 01:58:53 +00002690static bool shouldUseLeafFramePointer(const ArgList &Args,
2691 const llvm::Triple &Triple) {
2692 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2693 options::OPT_momit_leaf_frame_pointer))
2694 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2695
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002696 if (Triple.isPS4CPU())
2697 return false;
2698
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002699 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002700}
2701
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002702/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002703static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002704 SmallString<128> cwd;
2705 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002706 CmdArgs.push_back("-fdebug-compilation-dir");
2707 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002708 }
2709}
2710
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002711static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002712 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2713 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2714 SmallString<128> T(FinalOutput->getValue());
2715 llvm::sys::path::replace_extension(T, "dwo");
2716 return Args.MakeArgString(T);
2717 } else {
2718 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002719 SmallString<128> T(
2720 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002721 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002722 llvm::sys::path::replace_extension(F, "dwo");
2723 T += F;
2724 return Args.MakeArgString(F);
2725 }
2726}
2727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002728static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2729 const JobAction &JA, const ArgList &Args,
2730 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002731 ArgStringList ExtractArgs;
2732 ExtractArgs.push_back("--extract-dwo");
2733
2734 ArgStringList StripArgs;
2735 StripArgs.push_back("--strip-dwo");
2736
2737 // Grabbing the output of the earlier compile step.
2738 StripArgs.push_back(Output.getFilename());
2739 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002740 ExtractArgs.push_back(OutFile);
2741
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002742 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002743 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002744
2745 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002746 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002747
2748 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002749 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002750}
2751
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002752/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002753/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2754static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002755 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002756 if (A->getOption().matches(options::OPT_O4) ||
2757 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002758 return true;
2759
2760 if (A->getOption().matches(options::OPT_O0))
2761 return false;
2762
2763 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2764
Rafael Espindola91780de2013-08-26 14:05:41 +00002765 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002766 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002767 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002768 return true;
2769
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002770 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002771 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002772 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002773
2774 unsigned OptLevel = 0;
2775 if (S.getAsInteger(10, OptLevel))
2776 return false;
2777
2778 return OptLevel > 1;
2779 }
2780
2781 return false;
2782}
2783
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002784/// Add -x lang to \p CmdArgs for \p Input.
2785static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2786 ArgStringList &CmdArgs) {
2787 // When using -verify-pch, we don't want to provide the type
2788 // 'precompiled-header' if it was inferred from the file extension
2789 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2790 return;
2791
2792 CmdArgs.push_back("-x");
2793 if (Args.hasArg(options::OPT_rewrite_objc))
2794 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2795 else
2796 CmdArgs.push_back(types::getTypeName(Input.getType()));
2797}
2798
David Majnemerc371ff02015-03-22 08:39:22 +00002799static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002800 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002801 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002802
2803 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002804 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002805
2806 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002807 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002808 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002809 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002810}
2811
Rafael Espindola577637a2015-01-03 00:06:04 +00002812// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002813// options that build systems might add but are unused when assembling or only
2814// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002815static void claimNoWarnArgs(const ArgList &Args) {
2816 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002817 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002818 Args.ClaimAllArgs(options::OPT_flto);
2819 Args.ClaimAllArgs(options::OPT_fno_lto);
2820}
2821
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002822static void appendUserToPath(SmallVectorImpl<char> &Result) {
2823#ifdef LLVM_ON_UNIX
2824 const char *Username = getenv("LOGNAME");
2825#else
2826 const char *Username = getenv("USERNAME");
2827#endif
2828 if (Username) {
2829 // Validate that LoginName can be used in a path, and get its length.
2830 size_t Len = 0;
2831 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002832 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002833 Username = nullptr;
2834 break;
2835 }
2836 }
2837
2838 if (Username && Len > 0) {
2839 Result.append(Username, Username + Len);
2840 return;
2841 }
2842 }
2843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002844// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002845#ifdef LLVM_ON_UNIX
2846 std::string UID = llvm::utostr(getuid());
2847#else
2848 // FIXME: Windows seems to have an 'SID' that might work.
2849 std::string UID = "9999";
2850#endif
2851 Result.append(UID.begin(), UID.end());
2852}
2853
David Majnemere11d3732015-06-08 00:22:46 +00002854VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2855 const llvm::Triple &Triple,
2856 const llvm::opt::ArgList &Args,
2857 bool IsWindowsMSVC) {
2858 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2859 IsWindowsMSVC) ||
2860 Args.hasArg(options::OPT_fmsc_version) ||
2861 Args.hasArg(options::OPT_fms_compatibility_version)) {
2862 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2863 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002864 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002865
2866 if (MSCVersion && MSCompatibilityVersion) {
2867 if (D)
2868 D->Diag(diag::err_drv_argument_not_allowed_with)
2869 << MSCVersion->getAsString(Args)
2870 << MSCompatibilityVersion->getAsString(Args);
2871 return VersionTuple();
2872 }
2873
2874 if (MSCompatibilityVersion) {
2875 VersionTuple MSVT;
2876 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2877 D->Diag(diag::err_drv_invalid_value)
2878 << MSCompatibilityVersion->getAsString(Args)
2879 << MSCompatibilityVersion->getValue();
2880 return MSVT;
2881 }
2882
2883 if (MSCVersion) {
2884 unsigned Version = 0;
2885 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2886 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2887 << MSCVersion->getValue();
2888 return getMSCompatibilityVersion(Version);
2889 }
2890
2891 unsigned Major, Minor, Micro;
2892 Triple.getEnvironmentVersion(Major, Minor, Micro);
2893 if (Major || Minor || Micro)
2894 return VersionTuple(Major, Minor, Micro);
2895
2896 return VersionTuple(18);
2897 }
2898 return VersionTuple();
2899}
2900
Diego Novilloa0545962015-07-10 18:00:07 +00002901static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2902 const InputInfo &Output, const ArgList &Args,
2903 ArgStringList &CmdArgs) {
2904 auto *ProfileGenerateArg = Args.getLastArg(
2905 options::OPT_fprofile_instr_generate,
2906 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002907 options::OPT_fprofile_generate_EQ,
2908 options::OPT_fno_profile_instr_generate);
2909 if (ProfileGenerateArg &&
2910 ProfileGenerateArg->getOption().matches(
2911 options::OPT_fno_profile_instr_generate))
2912 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002913
2914 auto *ProfileUseArg = Args.getLastArg(
2915 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002916 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2917 options::OPT_fno_profile_instr_use);
2918 if (ProfileUseArg &&
2919 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2920 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002921
2922 if (ProfileGenerateArg && ProfileUseArg)
2923 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002924 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002925
Diego Novillo758f3f52015-08-05 21:49:51 +00002926 if (ProfileGenerateArg) {
2927 if (ProfileGenerateArg->getOption().matches(
2928 options::OPT_fprofile_instr_generate_EQ))
2929 ProfileGenerateArg->render(Args, CmdArgs);
2930 else if (ProfileGenerateArg->getOption().matches(
2931 options::OPT_fprofile_generate_EQ)) {
2932 SmallString<128> Path(ProfileGenerateArg->getValue());
2933 llvm::sys::path::append(Path, "default.profraw");
2934 CmdArgs.push_back(
2935 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2936 } else
2937 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2938 }
Diego Novilloa0545962015-07-10 18:00:07 +00002939
Diego Novillo758f3f52015-08-05 21:49:51 +00002940 if (ProfileUseArg) {
2941 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2942 ProfileUseArg->render(Args, CmdArgs);
2943 else if ((ProfileUseArg->getOption().matches(
2944 options::OPT_fprofile_use_EQ) ||
2945 ProfileUseArg->getOption().matches(
2946 options::OPT_fprofile_instr_use))) {
2947 SmallString<128> Path(
2948 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2949 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2950 llvm::sys::path::append(Path, "default.profdata");
2951 CmdArgs.push_back(
2952 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2953 }
Diego Novilloa0545962015-07-10 18:00:07 +00002954 }
2955
2956 if (Args.hasArg(options::OPT_ftest_coverage) ||
2957 Args.hasArg(options::OPT_coverage))
2958 CmdArgs.push_back("-femit-coverage-notes");
2959 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2960 false) ||
2961 Args.hasArg(options::OPT_coverage))
2962 CmdArgs.push_back("-femit-coverage-data");
2963
Diego Novilloc4b94da2015-08-05 23:27:40 +00002964 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2965 options::OPT_fno_coverage_mapping, false) &&
2966 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002967 D.Diag(diag::err_drv_argument_only_allowed_with)
2968 << "-fcoverage-mapping"
2969 << "-fprofile-instr-generate";
2970
Diego Novilloc4b94da2015-08-05 23:27:40 +00002971 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2972 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002973 CmdArgs.push_back("-fcoverage-mapping");
2974
2975 if (C.getArgs().hasArg(options::OPT_c) ||
2976 C.getArgs().hasArg(options::OPT_S)) {
2977 if (Output.isFilename()) {
2978 CmdArgs.push_back("-coverage-file");
2979 SmallString<128> CoverageFilename;
2980 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2981 CoverageFilename = FinalOutput->getValue();
2982 } else {
2983 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2984 }
2985 if (llvm::sys::path::is_relative(CoverageFilename)) {
2986 SmallString<128> Pwd;
2987 if (!llvm::sys::fs::current_path(Pwd)) {
2988 llvm::sys::path::append(Pwd, CoverageFilename);
2989 CoverageFilename.swap(Pwd);
2990 }
2991 }
2992 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2993 }
2994 }
2995}
2996
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002997/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2998/// smooshes them together with platform defaults, to decide whether
2999/// this compile should be using PIC mode or not. Returns a tuple of
3000/// (RelocationModel, PICLevel, IsPIE).
3001static std::tuple<llvm::Reloc::Model, unsigned, bool>
3002ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3003 const ArgList &Args) {
3004 // FIXME: why does this code...and so much everywhere else, use both
3005 // ToolChain.getTriple() and Triple?
3006 bool PIE = ToolChain.isPIEDefault();
3007 bool PIC = PIE || ToolChain.isPICDefault();
3008 bool IsPICLevelTwo = PIC;
3009
3010 bool KernelOrKext =
3011 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3012
3013 // Android-specific defaults for PIC/PIE
3014 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
3015 switch (ToolChain.getArch()) {
3016 case llvm::Triple::arm:
3017 case llvm::Triple::armeb:
3018 case llvm::Triple::thumb:
3019 case llvm::Triple::thumbeb:
3020 case llvm::Triple::aarch64:
3021 case llvm::Triple::mips:
3022 case llvm::Triple::mipsel:
3023 case llvm::Triple::mips64:
3024 case llvm::Triple::mips64el:
3025 PIC = true; // "-fpic"
3026 break;
3027
3028 case llvm::Triple::x86:
3029 case llvm::Triple::x86_64:
3030 PIC = true; // "-fPIC"
3031 IsPICLevelTwo = true;
3032 break;
3033
3034 default:
3035 break;
3036 }
3037 }
3038
3039 // OpenBSD-specific defaults for PIE
3040 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3041 switch (ToolChain.getArch()) {
3042 case llvm::Triple::mips64:
3043 case llvm::Triple::mips64el:
3044 case llvm::Triple::sparcel:
3045 case llvm::Triple::x86:
3046 case llvm::Triple::x86_64:
3047 IsPICLevelTwo = false; // "-fpie"
3048 break;
3049
3050 case llvm::Triple::ppc:
3051 case llvm::Triple::sparc:
3052 case llvm::Triple::sparcv9:
3053 IsPICLevelTwo = true; // "-fPIE"
3054 break;
3055
3056 default:
3057 break;
3058 }
3059 }
3060
3061 // The last argument relating to either PIC or PIE wins, and no
3062 // other argument is used. If the last argument is any flavor of the
3063 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3064 // option implicitly enables PIC at the same level.
3065 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3066 options::OPT_fpic, options::OPT_fno_pic,
3067 options::OPT_fPIE, options::OPT_fno_PIE,
3068 options::OPT_fpie, options::OPT_fno_pie);
3069 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3070 // is forced, then neither PIC nor PIE flags will have no effect.
3071 if (!ToolChain.isPICDefaultForced()) {
3072 if (LastPICArg) {
3073 Option O = LastPICArg->getOption();
3074 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3075 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3076 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3077 PIC =
3078 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3079 IsPICLevelTwo =
3080 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3081 } else {
3082 PIE = PIC = false;
3083 }
3084 }
3085 }
3086
3087 // Introduce a Darwin-specific hack. If the default is PIC, but the
3088 // PIC level would've been set to level 1, force it back to level 2
3089 // PIC instead. This matches the behavior of Darwin GCC (based on
3090 // chandlerc's informal testing in 2012).
3091 if (PIC && ToolChain.getTriple().isOSDarwin())
3092 IsPICLevelTwo |= ToolChain.isPICDefault();
3093
James Y Knightc4015d32015-08-21 04:14:55 +00003094 // This kernel flags are a trump-card: they will disable PIC/PIE
3095 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003096 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3097 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003098
3099 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3100 // This is a very special mode. It trumps the other modes, almost no one
3101 // uses it, and it isn't even valid on any OS but Darwin.
3102 if (!ToolChain.getTriple().isOSDarwin())
3103 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3104 << A->getSpelling() << ToolChain.getTriple().str();
3105
3106 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3107
3108 // Only a forced PIC mode can cause the actual compile to have PIC defines
3109 // etc., no flags are sufficient. This behavior was selected to closely
3110 // match that of llvm-gcc and Apple GCC before that.
3111 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3112
3113 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3114 }
3115
3116 if (PIC)
3117 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3118
3119 return std::make_tuple(llvm::Reloc::Static, 0, false);
3120}
3121
3122static const char *RelocationModelName(llvm::Reloc::Model Model) {
3123 switch (Model) {
3124 case llvm::Reloc::Default:
3125 return nullptr;
3126 case llvm::Reloc::Static:
3127 return "static";
3128 case llvm::Reloc::PIC_:
3129 return "pic";
3130 case llvm::Reloc::DynamicNoPIC:
3131 return "dynamic-no-pic";
3132 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003133 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003134}
3135
3136static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3137 ArgStringList &CmdArgs) {
3138 llvm::Reloc::Model RelocationModel;
3139 unsigned PICLevel;
3140 bool IsPIE;
3141 std::tie(RelocationModel, PICLevel, IsPIE) =
3142 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3143
3144 if (RelocationModel != llvm::Reloc::Static)
3145 CmdArgs.push_back("-KPIC");
3146}
3147
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003148void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003149 const InputInfo &Output, const InputInfoList &Inputs,
3150 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003151 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3152 const llvm::Triple Triple(TripleStr);
3153
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003154 bool KernelOrKext =
3155 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003156 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003157 ArgStringList CmdArgs;
3158
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003159 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003160 bool IsWindowsCygnus =
3161 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003162 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3163
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003164 // Check number of inputs for sanity. We need at least one input.
3165 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003166 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003167 // CUDA compilation may have multiple inputs (source file + results of
3168 // device-side compilations). All other jobs are expected to have exactly one
3169 // input.
3170 bool IsCuda = types::isCuda(Input.getType());
3171 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003172
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003173 // Invoke ourselves in -cc1 mode.
3174 //
3175 // FIXME: Implement custom jobs for internal actions.
3176 CmdArgs.push_back("-cc1");
3177
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003178 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003179 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003180 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003181
James Y Knight2db38f32015-08-15 03:45:25 +00003182 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3183 Triple.getArch() == llvm::Triple::thumb)) {
3184 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003185 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003186 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003187 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003188 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003189 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003190 }
3191
Tim Northover336f1892014-03-29 13:16:12 +00003192 // Push all default warning arguments that are specific to
3193 // the given target. These come before user provided warning options
3194 // are provided.
3195 getToolChain().addClangWarningOptions(CmdArgs);
3196
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003197 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003198 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003199
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003200 if (isa<AnalyzeJobAction>(JA)) {
3201 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3202 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003203 } else if (isa<MigrateJobAction>(JA)) {
3204 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003205 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003206 if (Output.getType() == types::TY_Dependencies)
3207 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003208 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003209 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003210 if (Args.hasArg(options::OPT_rewrite_objc) &&
3211 !Args.hasArg(options::OPT_g_Group))
3212 CmdArgs.push_back("-P");
3213 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003214 } else if (isa<AssembleJobAction>(JA)) {
3215 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003216
David Blaikie9260ed62013-07-25 21:19:01 +00003217 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003218
3219 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003220 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003221 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003222 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003223 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003224
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003225 if (JA.getType() == types::TY_Nothing)
3226 CmdArgs.push_back("-fsyntax-only");
3227 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003228 CmdArgs.push_back("-emit-pch");
3229 else
3230 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003231 } else if (isa<VerifyPCHJobAction>(JA)) {
3232 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003233 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003234 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3235 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003236
Renato Golin7c542b42015-07-27 23:44:45 +00003237 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003238 CmdArgs.push_back("-flto");
3239 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003240 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003241 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003242 } else if (JA.getType() == types::TY_LLVM_IR ||
3243 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003244 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003245 } else if (JA.getType() == types::TY_LLVM_BC ||
3246 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003247 CmdArgs.push_back("-emit-llvm-bc");
3248 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003249 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003250 } else if (JA.getType() == types::TY_AST) {
3251 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003252 } else if (JA.getType() == types::TY_ModuleFile) {
3253 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003254 } else if (JA.getType() == types::TY_RewrittenObjC) {
3255 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003256 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003257 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3258 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003259 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003260 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003261 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003262 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003263
3264 // Preserve use-list order by default when emitting bitcode, so that
3265 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3266 // same result as running passes here. For LTO, we don't need to preserve
3267 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003268 if (JA.getType() == types::TY_LLVM_BC)
3269 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003270 }
3271
Justin Bognera88f0122014-06-20 22:59:50 +00003272 // We normally speed up the clang process a bit by skipping destructors at
3273 // exit, but when we're generating diagnostics we can rely on some of the
3274 // cleanup.
3275 if (!C.isForDiagnostics())
3276 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003279#ifdef NDEBUG
3280 CmdArgs.push_back("-disable-llvm-verifier");
3281#endif
3282
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003283 // Set the main file name, so that debug info works even with
3284 // -save-temps.
3285 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003286 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003287
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003288 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003289 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003290 if (Args.hasArg(options::OPT_static))
3291 CmdArgs.push_back("-static-define");
3292
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003293 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003294 // Enable region store model by default.
3295 CmdArgs.push_back("-analyzer-store=region");
3296
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003297 // Treat blocks as analysis entry points.
3298 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3299
Ted Kremenek49c79792011-03-24 00:28:47 +00003300 CmdArgs.push_back("-analyzer-eagerly-assume");
3301
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003302 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003303 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003304 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003305
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003306 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003307 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003308
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003309 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003310 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003311
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003312 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003313
Artem Belevichba558952015-05-06 18:20:23 +00003314 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003315 CmdArgs.push_back("-analyzer-checker=cplusplus");
3316
Nico Webere8e53112014-05-11 01:04:02 +00003317 // Enable the following experimental checkers for testing.
3318 CmdArgs.push_back(
3319 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003320 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3321 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003322 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003323 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3324 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003325 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003326
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003327 // Set the output format. The default is plist, for (lame) historical
3328 // reasons.
3329 CmdArgs.push_back("-analyzer-output");
3330 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003331 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003332 else
3333 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003334
Ted Kremenekfe449a22010-03-22 22:32:05 +00003335 // Disable the presentation of standard compiler warnings when
3336 // using --analyze. We only want to show static analyzer diagnostics
3337 // or frontend errors.
3338 CmdArgs.push_back("-w");
3339
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003340 // Add -Xanalyzer arguments when running as analyzer.
3341 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003342 }
3343
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003344 CheckCodeGenerationOptions(D, Args);
3345
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003346 llvm::Reloc::Model RelocationModel;
3347 unsigned PICLevel;
3348 bool IsPIE;
3349 std::tie(RelocationModel, PICLevel, IsPIE) =
3350 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003351
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003352 const char *RMName = RelocationModelName(RelocationModel);
3353 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003354 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003355 CmdArgs.push_back(RMName);
3356 }
3357 if (PICLevel > 0) {
3358 CmdArgs.push_back("-pic-level");
3359 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3360 if (IsPIE) {
3361 CmdArgs.push_back("-pie-level");
3362 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003363 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003364 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003365
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003366 CmdArgs.push_back("-mthread-model");
3367 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3368 CmdArgs.push_back(A->getValue());
3369 else
3370 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3371
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003372 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3373
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003374 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3375 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003376 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003377
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003378 // LLVM Code Generator Options.
3379
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003380 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3381 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003382 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3383 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003384 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003385 CmdArgs.push_back(A->getValue());
3386 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003387 }
3388 }
3389
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003390 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3391 StringRef v = A->getValue();
3392 CmdArgs.push_back("-mllvm");
3393 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3394 A->claim();
3395 }
3396
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003397 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3398 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003399 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003400 }
3401
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003402 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3403 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003404 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003405 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003406 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003407 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3408 CmdArgs.push_back("-fpcc-struct-return");
3409 } else {
3410 assert(A->getOption().matches(options::OPT_freg_struct_return));
3411 CmdArgs.push_back("-freg-struct-return");
3412 }
3413 }
3414
Roman Divacky65b88cd2011-03-01 17:40:53 +00003415 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3416 CmdArgs.push_back("-mrtd");
3417
Rafael Espindola224dd632011-12-14 21:02:23 +00003418 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003419 CmdArgs.push_back("-mdisable-fp-elim");
3420 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3421 options::OPT_fno_zero_initialized_in_bss))
3422 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003423
3424 bool OFastEnabled = isOptimizationLevelFast(Args);
3425 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3426 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003427 OptSpecifier StrictAliasingAliasOption =
3428 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003429 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3430 // doesn't do any TBAA.
3431 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003432 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003433 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003434 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003435 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3436 options::OPT_fno_struct_path_tbaa))
3437 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003438 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3439 false))
3440 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003441 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3442 options::OPT_fno_optimize_sibling_calls))
3443 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003444
Eric Christopher006208c2013-04-04 06:29:47 +00003445 // Handle segmented stacks.
3446 if (Args.hasArg(options::OPT_fsplit_stack))
3447 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003448
3449 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3450 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003451 OptSpecifier FastMathAliasOption =
3452 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3453
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003454 // Handle various floating point optimization flags, mapping them to the
3455 // appropriate LLVM code generation flags. The pattern for all of these is to
3456 // default off the codegen optimizations, and if any flag enables them and no
3457 // flag disables them after the flag enabling them, enable the codegen
3458 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003459 if (Arg *A = Args.getLastArg(
3460 options::OPT_ffast_math, FastMathAliasOption,
3461 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3462 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3463 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003464 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3465 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003466 A->getOption().getID() != options::OPT_fhonor_infinities)
3467 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003468 if (Arg *A = Args.getLastArg(
3469 options::OPT_ffast_math, FastMathAliasOption,
3470 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3471 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3472 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003473 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3474 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003475 A->getOption().getID() != options::OPT_fhonor_nans)
3476 CmdArgs.push_back("-menable-no-nans");
3477
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003478 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3479 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003480 if (Arg *A =
3481 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3482 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3483 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003484 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3485 // However, turning *off* -ffast_math merely restores the toolchain default
3486 // (which may be false).
3487 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3488 A->getOption().getID() == options::OPT_ffast_math ||
3489 A->getOption().getID() == options::OPT_Ofast)
3490 MathErrno = false;
3491 else if (A->getOption().getID() == options::OPT_fmath_errno)
3492 MathErrno = true;
3493 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003494 if (MathErrno)
3495 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003496
3497 // There are several flags which require disabling very specific
3498 // optimizations. Any of these being disabled forces us to turn off the
3499 // entire set of LLVM optimizations, so collect them through all the flag
3500 // madness.
3501 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003502 if (Arg *A = Args.getLastArg(
3503 options::OPT_ffast_math, FastMathAliasOption,
3504 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3505 options::OPT_fno_unsafe_math_optimizations,
3506 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003507 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3508 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003509 A->getOption().getID() != options::OPT_fno_associative_math)
3510 AssociativeMath = true;
3511 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003512 if (Arg *A = Args.getLastArg(
3513 options::OPT_ffast_math, FastMathAliasOption,
3514 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3515 options::OPT_fno_unsafe_math_optimizations,
3516 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003517 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3518 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003519 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3520 ReciprocalMath = true;
3521 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003522 if (Arg *A = Args.getLastArg(
3523 options::OPT_ffast_math, FastMathAliasOption,
3524 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3525 options::OPT_fno_unsafe_math_optimizations,
3526 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003527 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3528 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003529 A->getOption().getID() != options::OPT_fsigned_zeros)
3530 SignedZeros = false;
3531 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003532 if (Arg *A = Args.getLastArg(
3533 options::OPT_ffast_math, FastMathAliasOption,
3534 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3535 options::OPT_fno_unsafe_math_optimizations,
3536 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003537 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3538 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003539 A->getOption().getID() != options::OPT_ftrapping_math)
3540 TrappingMath = false;
3541 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3542 !TrappingMath)
3543 CmdArgs.push_back("-menable-unsafe-fp-math");
3544
Sanjay Patel76c9e092015-01-23 16:40:50 +00003545 if (!SignedZeros)
3546 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003547
Sanjay Patel359b1052015-04-09 15:03:23 +00003548 if (ReciprocalMath)
3549 CmdArgs.push_back("-freciprocal-math");
3550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003551 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003552 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003553 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003554 options::OPT_ffp_contract)) {
3555 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003556 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003557 if (Val == "fast" || Val == "on" || Val == "off") {
3558 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3559 } else {
3560 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003561 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003562 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003563 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3564 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003565 // If fast-math is set then set the fp-contract mode to fast.
3566 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3567 }
3568 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003569
Sanjay Patel2987c292015-06-11 14:53:41 +00003570 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003571
Bob Wilson6a039162012-07-19 03:52:53 +00003572 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3573 // and if we find them, tell the frontend to provide the appropriate
3574 // preprocessor macros. This is distinct from enabling any optimizations as
3575 // these options induce language changes which must survive serialization
3576 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003577 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3578 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003579 if (!A->getOption().matches(options::OPT_fno_fast_math))
3580 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003581 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3582 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003583 if (A->getOption().matches(options::OPT_ffinite_math_only))
3584 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003585
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003586 // Decide whether to use verbose asm. Verbose assembly is the default on
3587 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003588 bool IsIntegratedAssemblerDefault =
3589 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003590 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003591 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003592 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003593 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003594
Rafael Espindolab8a12932015-05-22 20:44:03 +00003595 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3596 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003597 CmdArgs.push_back("-no-integrated-as");
3598
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003599 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3600 CmdArgs.push_back("-mdebug-pass");
3601 CmdArgs.push_back("Structure");
3602 }
3603 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3604 CmdArgs.push_back("-mdebug-pass");
3605 CmdArgs.push_back("Arguments");
3606 }
3607
John McCall8517abc2010-02-19 02:45:38 +00003608 // Enable -mconstructor-aliases except on darwin, where we have to
3609 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003610 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003611 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003612
John McCall7ef5cb32011-03-18 02:56:14 +00003613 // Darwin's kernel doesn't support guard variables; just die if we
3614 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003615 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003616 CmdArgs.push_back("-fforbid-guard-variables");
3617
Douglas Gregordbe39272011-02-01 15:15:22 +00003618 if (Args.hasArg(options::OPT_mms_bitfields)) {
3619 CmdArgs.push_back("-mms-bitfields");
3620 }
John McCall8517abc2010-02-19 02:45:38 +00003621
Daniel Dunbar306945d2009-09-16 06:17:29 +00003622 // This is a coarse approximation of what llvm-gcc actually does, both
3623 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3624 // complicated ways.
3625 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003626 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3627 options::OPT_fno_asynchronous_unwind_tables,
3628 (getToolChain().IsUnwindTablesDefault() ||
3629 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3630 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003631 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3632 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003633 CmdArgs.push_back("-munwind-tables");
3634
Chandler Carruth05fb5852012-11-21 23:40:23 +00003635 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003636
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003637 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3638 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003639 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003640 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003641
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003642 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003643 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003644
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003645 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003646 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003647 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003648 }
3649
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003650 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003651 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003652 if (!CPU.empty()) {
3653 CmdArgs.push_back("-target-cpu");
3654 CmdArgs.push_back(Args.MakeArgString(CPU));
3655 }
3656
Rafael Espindolaeb265472013-08-21 21:59:03 +00003657 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3658 CmdArgs.push_back("-mfpmath");
3659 CmdArgs.push_back(A->getValue());
3660 }
3661
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003662 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003663 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003664
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003665 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003666 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003667 default:
3668 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003669
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003670 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003671 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003672 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003673 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003674 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003675 break;
3676
Tim Northover573cbee2014-05-24 12:52:07 +00003677 case llvm::Triple::aarch64:
3678 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003679 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003680 break;
3681
Eric Christopher0b26a612010-03-02 02:41:08 +00003682 case llvm::Triple::mips:
3683 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003684 case llvm::Triple::mips64:
3685 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003686 AddMIPSTargetArgs(Args, CmdArgs);
3687 break;
3688
Ulrich Weigand8afad612014-07-28 13:17:52 +00003689 case llvm::Triple::ppc:
3690 case llvm::Triple::ppc64:
3691 case llvm::Triple::ppc64le:
3692 AddPPCTargetArgs(Args, CmdArgs);
3693 break;
3694
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003695 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003696 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003697 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003698 AddSparcTargetArgs(Args, CmdArgs);
3699 break;
3700
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003701 case llvm::Triple::x86:
3702 case llvm::Triple::x86_64:
3703 AddX86TargetArgs(Args, CmdArgs);
3704 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003705
3706 case llvm::Triple::hexagon:
3707 AddHexagonTargetArgs(Args, CmdArgs);
3708 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003709 }
3710
Hans Wennborg75958c42013-08-08 00:17:41 +00003711 // Add clang-cl arguments.
3712 if (getToolChain().getDriver().IsCLMode())
3713 AddClangCLArgs(Args, CmdArgs);
3714
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003715 // Pass the linker version in use.
3716 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3717 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003718 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003719 }
3720
Eric Christopherb7d97e92013-04-03 01:58:53 +00003721 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003722 CmdArgs.push_back("-momit-leaf-frame-pointer");
3723
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003724 // Explicitly error on some things we know we don't support and can't just
3725 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003726 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003727 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3728 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003729 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003730 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003731 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3732 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003733 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003734 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003735 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003736 }
3737
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003738 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003739 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003740 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003741 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003742 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3743 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003744 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003745 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003746 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003747
Chad Rosierbe10f982011-08-02 17:58:04 +00003748 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003749 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003750 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3751 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003752 }
3753
Manman Ren17bdb0f2013-11-20 20:22:14 +00003754 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3755 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003756 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003757 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003758 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003759 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3760 A->getOption().matches(options::OPT_g1)) &&
3761 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003762 // FIXME: we should support specifying dwarf version with
3763 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003764 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003765 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003766 const llvm::Triple &Triple = getToolChain().getTriple();
3767 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003768 Triple.getOS() == llvm::Triple::FreeBSD ||
3769 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003770 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003771 SplitDwarfArg = nullptr;
Manman Ren17bdb0f2013-11-20 20:22:14 +00003772 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003773 CmdArgs.push_back("-gdwarf-2");
3774 else if (A->getOption().matches(options::OPT_gdwarf_3))
3775 CmdArgs.push_back("-gdwarf-3");
3776 else if (A->getOption().matches(options::OPT_gdwarf_4))
3777 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003778 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003779 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003780 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003781 const llvm::Triple &Triple = getToolChain().getTriple();
3782 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003783 Triple.getOS() == llvm::Triple::FreeBSD ||
3784 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003785 CmdArgs.push_back("-gdwarf-2");
3786 else
3787 CmdArgs.push_back("-g");
3788 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003789 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003790
Reid Kleckner124955a2015-08-05 18:51:13 +00003791 // Forward -gcodeview.
3792 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3793
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003794 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3795 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003796 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3797 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003798 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003799
Eric Christopher138c32b2013-09-13 22:37:55 +00003800 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003801 if (Args.hasArg(options::OPT_gmodules)) {
3802 CmdArgs.push_back("-g");
3803 CmdArgs.push_back("-dwarf-ext-refs");
3804 CmdArgs.push_back("-fmodule-format=obj");
3805 }
3806
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003807 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3808 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003809 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003810 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003811 CmdArgs.push_back("-g");
3812 CmdArgs.push_back("-backend-option");
3813 CmdArgs.push_back("-split-dwarf=Enable");
3814 }
3815
Eric Christopher138c32b2013-09-13 22:37:55 +00003816 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3817 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3818 CmdArgs.push_back("-backend-option");
3819 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3820 }
Eric Christophereec89c22013-06-18 00:03:50 +00003821
Eric Christopher0d403d22014-02-14 01:27:03 +00003822 // -gdwarf-aranges turns on the emission of the aranges section in the
3823 // backend.
3824 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3825 CmdArgs.push_back("-backend-option");
3826 CmdArgs.push_back("-generate-arange-section");
3827 }
3828
David Blaikief36d9ba2014-01-27 18:52:43 +00003829 if (Args.hasFlag(options::OPT_fdebug_types_section,
3830 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003831 CmdArgs.push_back("-backend-option");
3832 CmdArgs.push_back("-generate-type-units");
3833 }
Eric Christophereec89c22013-06-18 00:03:50 +00003834
Ed Schouten6e576152015-03-26 17:50:28 +00003835 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3836 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3837
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003838 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003839 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003840 CmdArgs.push_back("-ffunction-sections");
3841 }
3842
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003843 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3844 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003845 CmdArgs.push_back("-fdata-sections");
3846 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003847
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003848 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003849 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003850 CmdArgs.push_back("-fno-unique-section-names");
3851
Chris Lattner3c77a352010-06-22 00:03:40 +00003852 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3853
Diego Novilloa0545962015-07-10 18:00:07 +00003854 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003855
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003856 // Pass options for controlling the default header search paths.
3857 if (Args.hasArg(options::OPT_nostdinc)) {
3858 CmdArgs.push_back("-nostdsysteminc");
3859 CmdArgs.push_back("-nobuiltininc");
3860 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003861 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003862 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003863 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3864 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3865 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003866
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003867 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003868 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003869 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003870
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003871 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3872
Ted Kremenekf7639e12012-03-06 20:06:33 +00003873 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003874 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003875 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003876 options::OPT_ccc_arcmt_modify,
3877 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003878 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003879 switch (A->getOption().getID()) {
3880 default:
3881 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003882 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003883 CmdArgs.push_back("-arcmt-check");
3884 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003885 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003886 CmdArgs.push_back("-arcmt-modify");
3887 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003888 case options::OPT_ccc_arcmt_migrate:
3889 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003890 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003891 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003892
3893 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3894 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003895 break;
John McCalld70fb982011-06-15 23:25:17 +00003896 }
3897 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003898 } else {
3899 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3900 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3901 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003902 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003903
Ted Kremenekf7639e12012-03-06 20:06:33 +00003904 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3905 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3907 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003908 }
3909 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003910 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003911
3912 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003913 options::OPT_objcmt_migrate_subscripting,
3914 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003915 // None specified, means enable them all.
3916 CmdArgs.push_back("-objcmt-migrate-literals");
3917 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003918 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003919 } else {
3920 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3921 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003922 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003923 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003924 } else {
3925 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3926 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3927 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3930 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003931 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003932 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3934 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3935 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3936 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3937 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3938 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003939 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003940 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003941 }
3942
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003943 // Add preprocessing options like -I, -D, etc. if we are using the
3944 // preprocessor.
3945 //
3946 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003947 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003948 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003949
Rafael Espindolaa7431922011-07-21 23:40:37 +00003950 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3951 // that "The compiler can only warn and ignore the option if not recognized".
3952 // When building with ccache, it will pass -D options to clang even on
3953 // preprocessed inputs and configure concludes that -fPIC is not supported.
3954 Args.ClaimAllArgs(options::OPT_D);
3955
Alp Toker7874bdc2013-11-15 20:40:58 +00003956 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003957 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3958 if (A->getOption().matches(options::OPT_O4)) {
3959 CmdArgs.push_back("-O3");
3960 D.Diag(diag::warn_O4_is_O3);
3961 } else {
3962 A->render(Args, CmdArgs);
3963 }
3964 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003965
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003966 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003967 for (const Arg *A :
3968 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3969 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003970 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003971 }
3972
Rafael Espindola577637a2015-01-03 00:06:04 +00003973 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003974
Richard Smith3be1cb22014-08-07 00:24:21 +00003975 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003976 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003977 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3978 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003979 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003980 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003981
3982 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003983 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003984 //
3985 // If a std is supplied, only add -trigraphs if it follows the
3986 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003987 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003988 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3989 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003990 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003991 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003992 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003993 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003994 else
3995 Std->render(Args, CmdArgs);
3996
Nico Weber00721502014-12-23 22:32:37 +00003997 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003998 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003999 options::OPT_ftrigraphs,
4000 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004001 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004002 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004003 } else {
4004 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004005 //
4006 // FIXME: Clang doesn't correctly handle -std= when the input language
4007 // doesn't match. For the time being just ignore this for C++ inputs;
4008 // eventually we want to do all the standard defaulting here instead of
4009 // splitting it between the driver and clang -cc1.
4010 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004011 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4012 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004013 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004014 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004015
Nico Weber00721502014-12-23 22:32:37 +00004016 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4017 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004018 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004019
Richard Smith282b4492013-09-04 22:50:31 +00004020 // GCC's behavior for -Wwrite-strings is a bit strange:
4021 // * In C, this "warning flag" changes the types of string literals from
4022 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4023 // for the discarded qualifier.
4024 // * In C++, this is just a normal warning flag.
4025 //
4026 // Implementing this warning correctly in C is hard, so we follow GCC's
4027 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4028 // a non-const char* in C, rather than using this crude hack.
4029 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004030 // FIXME: This should behave just like a warning flag, and thus should also
4031 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4032 Arg *WriteStrings =
4033 Args.getLastArg(options::OPT_Wwrite_strings,
4034 options::OPT_Wno_write_strings, options::OPT_w);
4035 if (WriteStrings &&
4036 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004037 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004038 }
4039
Chandler Carruth61fbf622011-04-23 09:27:53 +00004040 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004041 // during C++ compilation, which it is by default. GCC keeps this define even
4042 // in the presence of '-w', match this behavior bug-for-bug.
4043 if (types::isCXX(InputType) &&
4044 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4045 true)) {
4046 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004047 }
4048
Chandler Carruthe0391482010-05-22 02:21:53 +00004049 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4050 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4051 if (Asm->getOption().matches(options::OPT_fasm))
4052 CmdArgs.push_back("-fgnu-keywords");
4053 else
4054 CmdArgs.push_back("-fno-gnu-keywords");
4055 }
4056
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004057 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4058 CmdArgs.push_back("-fno-dwarf-directory-asm");
4059
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004060 if (ShouldDisableAutolink(Args, getToolChain()))
4061 CmdArgs.push_back("-fno-autolink");
4062
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004063 // Add in -fdebug-compilation-dir if necessary.
4064 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004065
Richard Smith9a568822011-11-21 19:36:32 +00004066 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4067 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004068 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004069 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004070 }
4071
Richard Smith79c927b2013-11-06 19:31:51 +00004072 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4073 CmdArgs.push_back("-foperator-arrow-depth");
4074 CmdArgs.push_back(A->getValue());
4075 }
4076
Richard Smith9a568822011-11-21 19:36:32 +00004077 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4078 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004079 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004080 }
4081
Richard Smitha3d3bd22013-05-08 02:12:03 +00004082 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4083 CmdArgs.push_back("-fconstexpr-steps");
4084 CmdArgs.push_back(A->getValue());
4085 }
4086
Richard Smithb3a14522013-02-22 01:59:51 +00004087 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4088 CmdArgs.push_back("-fbracket-depth");
4089 CmdArgs.push_back(A->getValue());
4090 }
4091
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004092 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4093 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004094 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004095 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004096 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4097 } else
4098 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004099 }
4100
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004101 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004102 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004103
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004104 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4105 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004106 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004107 }
David Chisnall5778fce2009-08-31 16:41:57 +00004108
Chris Lattnere23003d2010-01-09 21:54:33 +00004109 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4110 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004111 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004112 }
4113
Chris Lattnerb35583d2010-04-07 20:49:23 +00004114 CmdArgs.push_back("-ferror-limit");
4115 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004116 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004117 else
4118 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004119
Chandler Carrutha77a7272010-05-06 04:55:18 +00004120 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4121 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004122 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004123 }
4124
4125 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4126 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004127 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004128 }
4129
Richard Smithf6f003a2011-12-16 19:06:07 +00004130 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4131 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004132 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004133 }
4134
Nick Lewycky24653262014-12-16 21:39:02 +00004135 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4136 CmdArgs.push_back("-fspell-checking-limit");
4137 CmdArgs.push_back(A->getValue());
4138 }
4139
Daniel Dunbar2c978472009-11-04 06:24:47 +00004140 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004141 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004142 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004143 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004144 } else {
4145 // If -fmessage-length=N was not specified, determine whether this is a
4146 // terminal and, if so, implicitly define -fmessage-length appropriately.
4147 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004148 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004149 }
4150
John McCallb4a99d32013-02-19 01:57:35 +00004151 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4152 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4153 options::OPT_fvisibility_ms_compat)) {
4154 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4155 CmdArgs.push_back("-fvisibility");
4156 CmdArgs.push_back(A->getValue());
4157 } else {
4158 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4159 CmdArgs.push_back("-fvisibility");
4160 CmdArgs.push_back("hidden");
4161 CmdArgs.push_back("-ftype-visibility");
4162 CmdArgs.push_back("default");
4163 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004164 }
4165
Douglas Gregor08329632010-06-15 17:05:35 +00004166 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004167
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004168 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4169
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004170 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004171 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4172 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004173 CmdArgs.push_back("-ffreestanding");
4174
Daniel Dunbare357d562009-12-03 18:42:11 +00004175 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004176 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004177 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004178 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4179 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004180 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004181 // Emulated TLS is enabled by default on Android, and can be enabled manually
4182 // with -femulated-tls.
4183 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4184 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4185 EmulatedTLSDefault))
4186 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004187 // AltiVec-like language extensions aren't relevant for assembling.
4188 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004189 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004190 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4191 }
Richard Trieu91844232012-06-26 18:18:47 +00004192 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4193 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004194
Alexey Bataevdb390212015-05-20 04:24:19 +00004195 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004196 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4197 options::OPT_fno_openmp, false))
4198 switch (getOpenMPRuntime(getToolChain(), Args)) {
4199 case OMPRT_OMP:
4200 case OMPRT_IOMP5:
4201 // Clang can generate useful OpenMP code for these two runtime libraries.
4202 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004203
4204 // If no option regarding the use of TLS in OpenMP codegeneration is
4205 // given, decide a default based on the target. Otherwise rely on the
4206 // options and pass the right information to the frontend.
4207 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004208 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004209 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004210 break;
4211 default:
4212 // By default, if Clang doesn't know how to generate useful OpenMP code
4213 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4214 // down to the actual compilation.
4215 // FIXME: It would be better to have a mode which *only* omits IR
4216 // generation based on the OpenMP support so that we get consistent
4217 // semantic analysis, etc.
4218 break;
4219 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004220
Peter Collingbourne32701642013-11-01 18:16:25 +00004221 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004222 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004223
Eric Christopher459d2712013-02-19 06:16:53 +00004224 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004225 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4226 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4227 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4228 Arch == llvm::Triple::ppc64le))
4229 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4230 << "ppc/ppc64/ppc64le";
4231 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004232
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004233 // -fzvector is incompatible with -faltivec.
4234 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4235 if (Args.hasArg(options::OPT_faltivec))
4236 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4237 << "-faltivec";
4238
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004239 if (getToolChain().SupportsProfiling())
4240 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004241
4242 // -flax-vector-conversions is default.
4243 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4244 options::OPT_fno_lax_vector_conversions))
4245 CmdArgs.push_back("-fno-lax-vector-conversions");
4246
John Brawna7b4ec02015-08-10 11:11:28 +00004247 if (Args.getLastArg(options::OPT_fapple_kext) ||
4248 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004249 CmdArgs.push_back("-fapple-kext");
4250
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004251 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004252 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004253 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004254 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4255 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004256
4257 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4258 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004259 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004260 }
4261
Bob Wilson14adb362012-02-03 06:27:22 +00004262 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004263
Chandler Carruth6e501032011-03-27 00:04:55 +00004264 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4265 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004266 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004267 if (A->getOption().matches(options::OPT_fwrapv))
4268 CmdArgs.push_back("-fwrapv");
4269 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4270 options::OPT_fno_strict_overflow)) {
4271 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4272 CmdArgs.push_back("-fwrapv");
4273 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004274
4275 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4276 options::OPT_fno_reroll_loops))
4277 if (A->getOption().matches(options::OPT_freroll_loops))
4278 CmdArgs.push_back("-freroll-loops");
4279
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004280 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004281 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4282 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004283
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004284 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4285
Daniel Dunbar4930e332009-11-17 08:07:36 +00004286 // -stack-protector=0 is default.
4287 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004288 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4289 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4290 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4291 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4292 Args.ClaimAllArgs(options::OPT_fstack_protector);
4293 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004294 options::OPT_fstack_protector_all,
4295 options::OPT_fstack_protector_strong,
4296 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004297 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004298 StackProtectorLevel = std::max<unsigned>(
4299 LangOptions::SSPOn,
4300 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004301 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004302 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004303 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004304 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004305 } else {
4306 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004307 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004308 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004309 if (StackProtectorLevel) {
4310 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004311 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004312 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004313
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004314 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004315 for (const Arg *A : Args.filtered(options::OPT__param)) {
4316 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004317 if (Str.startswith("ssp-buffer-size=")) {
4318 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004319 CmdArgs.push_back("-stack-protector-buffer-size");
4320 // FIXME: Verify the argument is a valid integer.
4321 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004322 }
Sean Silva14facf32015-06-09 01:57:17 +00004323 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004324 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004325 }
4326
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004327 // Translate -mstackrealign
4328 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004329 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004330 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004331
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004332 if (Args.hasArg(options::OPT_mstack_alignment)) {
4333 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4334 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004335 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004336
Hans Wennborg77dc2362015-01-20 19:45:50 +00004337 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4338 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4339
4340 if (!Size.empty())
4341 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4342 else
4343 CmdArgs.push_back("-mstack-probe-size=0");
4344 }
4345
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004346 switch (getToolChain().getArch()) {
4347 case llvm::Triple::aarch64:
4348 case llvm::Triple::aarch64_be:
4349 case llvm::Triple::arm:
4350 case llvm::Triple::armeb:
4351 case llvm::Triple::thumb:
4352 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004353 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004354 break;
4355
4356 default:
4357 break;
4358 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004359
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004360 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4361 options::OPT_mno_restrict_it)) {
4362 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4363 CmdArgs.push_back("-backend-option");
4364 CmdArgs.push_back("-arm-restrict-it");
4365 } else {
4366 CmdArgs.push_back("-backend-option");
4367 CmdArgs.push_back("-arm-no-restrict-it");
4368 }
James Y Knight2db38f32015-08-15 03:45:25 +00004369 } else if (Triple.isOSWindows() &&
4370 (Triple.getArch() == llvm::Triple::arm ||
4371 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004372 // Windows on ARM expects restricted IT blocks
4373 CmdArgs.push_back("-backend-option");
4374 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004375 }
4376
Daniel Dunbard18049a2009-04-07 21:16:11 +00004377 // Forward -f options with positive and negative forms; we translate
4378 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004379 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4380 StringRef fname = A->getValue();
4381 if (!llvm::sys::fs::exists(fname))
4382 D.Diag(diag::err_drv_no_such_file) << fname;
4383 else
4384 A->render(Args, CmdArgs);
4385 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004386
John Brawna7b4ec02015-08-10 11:11:28 +00004387 // -fbuiltin is default unless -mkernel is used
4388 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4389 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004390 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004391
Nuno Lopes13c88c72009-12-16 16:59:22 +00004392 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4393 options::OPT_fno_assume_sane_operator_new))
4394 CmdArgs.push_back("-fno-assume-sane-operator-new");
4395
Daniel Dunbar4930e332009-11-17 08:07:36 +00004396 // -fblocks=0 is default.
4397 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004398 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004399 (Args.hasArg(options::OPT_fgnu_runtime) &&
4400 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4401 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004402 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004403
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004404 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004405 !getToolChain().hasBlocksRuntime())
4406 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004407 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004408
Richard Smith47972af2015-06-16 00:08:24 +00004409 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004410 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004411 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004412 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004413 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004414 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4415 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004416 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004417 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004418 HaveModules = true;
4419 }
4420 }
4421
Richard Smith47972af2015-06-16 00:08:24 +00004422 // -fmodule-maps enables implicit reading of module map files. By default,
4423 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004424 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4425 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004426 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004427 }
4428
Daniel Jasperac42b752013-10-21 06:34:34 +00004429 // -fmodules-decluse checks that modules used are declared so (off by
4430 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004431 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004432 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004433 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004434 }
4435
Daniel Jasper962b38e2014-04-11 11:47:45 +00004436 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4437 // all #included headers are part of modules.
4438 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004439 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004440 CmdArgs.push_back("-fmodules-strict-decluse");
4441 }
4442
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004443 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4444 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4445 options::OPT_fno_implicit_modules)) {
4446 CmdArgs.push_back("-fno-implicit-modules");
4447 }
4448
Daniel Jasperac42b752013-10-21 06:34:34 +00004449 // -fmodule-name specifies the module that is currently being built (or
4450 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004451 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004452
Richard Smith9887d792014-10-17 01:42:53 +00004453 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004454 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004455 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004456
Richard Smithe842a472014-10-22 02:05:46 +00004457 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004458 if (HaveModules)
4459 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4460 else
4461 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004462
4463 // -fmodule-cache-path specifies where our implicitly-built module files
4464 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004465 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004466 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004467 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004468 if (HaveModules) {
4469 if (C.isForDiagnostics()) {
4470 // When generating crash reports, we want to emit the modules along with
4471 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004472 Path = Output.getFilename();
4473 llvm::sys::path::replace_extension(Path, ".cache");
4474 llvm::sys::path::append(Path, "modules");
4475 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004476 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004477 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004478 llvm::sys::path::append(Path, "org.llvm.clang.");
4479 appendUserToPath(Path);
4480 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004481 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004482 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004483 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4484 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004485 }
4486
4487 // When building modules and generating crashdumps, we need to dump a module
4488 // dependency VFS alongside the output.
4489 if (HaveModules && C.isForDiagnostics()) {
4490 SmallString<128> VFSDir(Output.getFilename());
4491 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004492 // Add the cache directory as a temp so the crash diagnostics pick it up.
4493 C.addTempFile(Args.MakeArgString(VFSDir));
4494
Justin Bognera88f0122014-06-20 22:59:50 +00004495 llvm::sys::path::append(VFSDir, "vfs");
4496 CmdArgs.push_back("-module-dependency-dir");
4497 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004498 }
4499
Richard Smith9887d792014-10-17 01:42:53 +00004500 if (HaveModules)
4501 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004502
Douglas Gregor35b04d62013-02-07 19:01:24 +00004503 // Pass through all -fmodules-ignore-macro arguments.
4504 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004505 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4506 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004507
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004508 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4509
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004510 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4511 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4512 D.Diag(diag::err_drv_argument_not_allowed_with)
4513 << A->getAsString(Args) << "-fbuild-session-timestamp";
4514
4515 llvm::sys::fs::file_status Status;
4516 if (llvm::sys::fs::status(A->getValue(), Status))
4517 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004518 CmdArgs.push_back(Args.MakeArgString(
4519 "-fbuild-session-timestamp=" +
4520 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004521 }
4522
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004523 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004524 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4525 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004526 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4527
4528 Args.AddLastArg(CmdArgs,
4529 options::OPT_fmodules_validate_once_per_build_session);
4530 }
4531
Ben Langmuirdcf73862014-03-12 00:06:17 +00004532 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4533
John McCalldfea9982010-04-09 19:12:06 +00004534 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004535 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004536 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004537 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004538
Anders Carlssond470fef2010-11-21 00:09:52 +00004539 // -felide-constructors is the default.
4540 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004541 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004542 CmdArgs.push_back("-fno-elide-constructors");
4543
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004544 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004545
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004546 if (KernelOrKext || (types::isCXX(InputType) &&
4547 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4548 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004549 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004550
Tony Linthicum76329bf2011-12-12 21:14:55 +00004551 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004552 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4553 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004554 CmdArgs.push_back("-fshort-enums");
4555
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004556 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004557 if (Arg *A = Args.getLastArg(
4558 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4559 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4560 if (A->getOption().matches(options::OPT_funsigned_char) ||
4561 A->getOption().matches(options::OPT_fno_signed_char)) {
4562 CmdArgs.push_back("-fno-signed-char");
4563 }
4564 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004565 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004566 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004567
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004568 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004569 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4570 options::OPT_fno_use_cxa_atexit,
4571 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004572 getToolChain().getArch() != llvm::Triple::hexagon &&
4573 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004574 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004575 CmdArgs.push_back("-fno-use-cxa-atexit");
4576
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004577 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004578 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004579 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004580 CmdArgs.push_back("-fms-extensions");
4581
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004582 // -fno-use-line-directives is default.
4583 if (Args.hasFlag(options::OPT_fuse_line_directives,
4584 options::OPT_fno_use_line_directives, false))
4585 CmdArgs.push_back("-fuse-line-directives");
4586
Francois Pichet1b4f1632011-09-17 04:32:15 +00004587 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004588 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004589 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004590 (IsWindowsMSVC &&
4591 Args.hasFlag(options::OPT_fms_extensions,
4592 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004593 CmdArgs.push_back("-fms-compatibility");
4594
David Majnemerc371ff02015-03-22 08:39:22 +00004595 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004596 VersionTuple MSVT = visualstudio::getMSVCVersion(
4597 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4598 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004599 CmdArgs.push_back(
4600 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004601
David Majnemer8db91762015-05-18 04:49:30 +00004602 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4603 if (ImplyVCPPCXXVer) {
4604 if (IsMSVC2015Compatible)
4605 CmdArgs.push_back("-std=c++14");
4606 else
4607 CmdArgs.push_back("-std=c++11");
4608 }
4609
Eric Christopher5ecce122013-02-18 00:38:31 +00004610 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004611 if (Args.hasFlag(options::OPT_fborland_extensions,
4612 options::OPT_fno_borland_extensions, false))
4613 CmdArgs.push_back("-fborland-extensions");
4614
David Majnemerc371ff02015-03-22 08:39:22 +00004615 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4616 // than 19.
4617 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4618 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004619 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004620 CmdArgs.push_back("-fno-threadsafe-statics");
4621
Francois Pichet02744872011-09-01 16:38:08 +00004622 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4623 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004624 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004625 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004626 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004627
Chandler Carruthe03aa552010-04-17 20:17:31 +00004628 // -fgnu-keywords default varies depending on language; only pass if
4629 // specified.
4630 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004631 options::OPT_fno_gnu_keywords))
4632 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004633
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004634 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004635 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004636 CmdArgs.push_back("-fgnu89-inline");
4637
Chad Rosier9c76d242012-03-15 22:31:42 +00004638 if (Args.hasArg(options::OPT_fno_inline))
4639 CmdArgs.push_back("-fno-inline");
4640
Chad Rosier64d6be92012-03-06 21:17:19 +00004641 if (Args.hasArg(options::OPT_fno_inline_functions))
4642 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004643
John McCall5fb5df92012-06-20 06:18:46 +00004644 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004645
John McCall5fb5df92012-06-20 06:18:46 +00004646 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004647 // legacy is the default. Except for deployment taget of 10.5,
4648 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4649 // gets ignored silently.
4650 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004651 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4652 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004653 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004654 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004655 if (getToolChain().UseObjCMixedDispatch())
4656 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4657 else
4658 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4659 }
4660 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004661
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004662 // When ObjectiveC legacy runtime is in effect on MacOSX,
4663 // turn on the option to do Array/Dictionary subscripting
4664 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004665 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004666 getToolChain().getTriple().isMacOSX() &&
4667 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4668 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004669 objcRuntime.isNeXTFamily())
4670 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004671
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004672 // -fencode-extended-block-signature=1 is default.
4673 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4674 CmdArgs.push_back("-fencode-extended-block-signature");
4675 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004676
John McCall24fc0de2011-07-06 00:26:06 +00004677 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4678 // NOTE: This logic is duplicated in ToolChains.cpp.
4679 bool ARC = isObjCAutoRefCount(Args);
4680 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004681 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004682
John McCall24fc0de2011-07-06 00:26:06 +00004683 CmdArgs.push_back("-fobjc-arc");
4684
Chandler Carruth491db322011-11-04 07:34:47 +00004685 // FIXME: It seems like this entire block, and several around it should be
4686 // wrapped in isObjC, but for now we just use it here as this is where it
4687 // was being used previously.
4688 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4689 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4690 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4691 else
4692 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4693 }
4694
John McCall24fc0de2011-07-06 00:26:06 +00004695 // Allow the user to enable full exceptions code emission.
4696 // We define off for Objective-CC, on for Objective-C++.
4697 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4698 options::OPT_fno_objc_arc_exceptions,
4699 /*default*/ types::isCXX(InputType)))
4700 CmdArgs.push_back("-fobjc-arc-exceptions");
4701 }
4702
4703 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4704 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004705 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004706 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004707
John McCall24fc0de2011-07-06 00:26:06 +00004708 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4709 // takes precedence.
4710 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4711 if (!GCArg)
4712 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4713 if (GCArg) {
4714 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004715 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004716 } else if (getToolChain().SupportsObjCGC()) {
4717 GCArg->render(Args, CmdArgs);
4718 } else {
4719 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004720 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004721 }
4722 }
4723
Bob Wilsonb111ec92015-03-02 19:01:14 +00004724 if (Args.hasFlag(options::OPT_fapplication_extension,
4725 options::OPT_fno_application_extension, false))
4726 CmdArgs.push_back("-fapplication-extension");
4727
Reid Klecknerc542d372014-06-27 17:02:02 +00004728 // Handle GCC-style exception args.
4729 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004730 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4731 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004732
4733 if (getToolChain().UseSjLjExceptions())
4734 CmdArgs.push_back("-fsjlj-exceptions");
4735
4736 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004737 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4738 options::OPT_fno_assume_sane_operator_new))
4739 CmdArgs.push_back("-fno-assume-sane-operator-new");
4740
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004741 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4742 // most platforms.
4743 if (Args.hasFlag(options::OPT_fsized_deallocation,
4744 options::OPT_fno_sized_deallocation, false))
4745 CmdArgs.push_back("-fsized-deallocation");
4746
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004747 // -fconstant-cfstrings is default, and may be subject to argument translation
4748 // on Darwin.
4749 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4750 options::OPT_fno_constant_cfstrings) ||
4751 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4752 options::OPT_mno_constant_cfstrings))
4753 CmdArgs.push_back("-fno-constant-cfstrings");
4754
John Thompsoned4e2952009-11-05 20:14:16 +00004755 // -fshort-wchar default varies depending on platform; only
4756 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004757 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4758 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004759 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004760
Hans Wennborg28c96312013-07-31 23:39:13 +00004761 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004762 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004763 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004764 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004765
Daniel Dunbar096ed292011-10-05 21:04:55 +00004766 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4767 // -fno-pack-struct doesn't apply to -fpack-struct=.
4768 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004769 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004770 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004771 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004772 } else if (Args.hasFlag(options::OPT_fpack_struct,
4773 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004774 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004775 }
4776
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004777 // Handle -fmax-type-align=N and -fno-type-align
4778 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4779 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4780 if (!SkipMaxTypeAlign) {
4781 std::string MaxTypeAlignStr = "-fmax-type-align=";
4782 MaxTypeAlignStr += A->getValue();
4783 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4784 }
4785 } else if (getToolChain().getTriple().isOSDarwin()) {
4786 if (!SkipMaxTypeAlign) {
4787 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4788 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4789 }
4790 }
4791
John Brawna7b4ec02015-08-10 11:11:28 +00004792 // -fcommon is the default unless compiling kernel code or the target says so
4793 bool NoCommonDefault =
4794 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4795 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4796 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004797 CmdArgs.push_back("-fno-common");
4798
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004799 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004800 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004801 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004802 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004803 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004804 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004805
Daniel Dunbar6358d682010-10-15 22:30:42 +00004806 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004807 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004808 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004809 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004810
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004811 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004812 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4813 StringRef value = inputCharset->getValue();
4814 if (value != "UTF-8")
4815 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4816 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004817 }
4818
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004819 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004820 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4821 StringRef value = execCharset->getValue();
4822 if (value != "UTF-8")
4823 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4824 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004825 }
4826
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004827 // -fcaret-diagnostics is default.
4828 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4829 options::OPT_fno_caret_diagnostics, true))
4830 CmdArgs.push_back("-fno-caret-diagnostics");
4831
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004832 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004833 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004834 options::OPT_fno_diagnostics_fixit_info))
4835 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004836
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004837 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004838 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004839 options::OPT_fno_diagnostics_show_option))
4840 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004841
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004842 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004843 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004844 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004845 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004846 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004847
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004848 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004849 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004850 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004851 }
4852
Chandler Carruthb6766f02011-03-27 01:50:55 +00004853 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004854 options::OPT_fdiagnostics_show_note_include_stack,
4855 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004856 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004858 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4859 else
4860 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4861 }
4862
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004863 // Color diagnostics are the default, unless the terminal doesn't support
4864 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004865 // Support both clang's -f[no-]color-diagnostics and gcc's
4866 // -f[no-]diagnostics-colors[=never|always|auto].
4867 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004868 for (const auto &Arg : Args) {
4869 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004870 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4871 !O.matches(options::OPT_fdiagnostics_color) &&
4872 !O.matches(options::OPT_fno_color_diagnostics) &&
4873 !O.matches(options::OPT_fno_diagnostics_color) &&
4874 !O.matches(options::OPT_fdiagnostics_color_EQ))
4875 continue;
4876
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004877 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004878 if (O.matches(options::OPT_fcolor_diagnostics) ||
4879 O.matches(options::OPT_fdiagnostics_color)) {
4880 ShowColors = Colors_On;
4881 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4882 O.matches(options::OPT_fno_diagnostics_color)) {
4883 ShowColors = Colors_Off;
4884 } else {
4885 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004886 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004887 if (value == "always")
4888 ShowColors = Colors_On;
4889 else if (value == "never")
4890 ShowColors = Colors_Off;
4891 else if (value == "auto")
4892 ShowColors = Colors_Auto;
4893 else
4894 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004895 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004896 }
4897 }
4898 if (ShowColors == Colors_On ||
4899 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004900 CmdArgs.push_back("-fcolor-diagnostics");
4901
Nico Rieck7857d462013-09-11 00:38:02 +00004902 if (Args.hasArg(options::OPT_fansi_escape_codes))
4903 CmdArgs.push_back("-fansi-escape-codes");
4904
Daniel Dunbardb097022009-06-08 21:13:54 +00004905 if (!Args.hasFlag(options::OPT_fshow_source_location,
4906 options::OPT_fno_show_source_location))
4907 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004909 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004910 true))
4911 CmdArgs.push_back("-fno-show-column");
4912
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004913 if (!Args.hasFlag(options::OPT_fspell_checking,
4914 options::OPT_fno_spell_checking))
4915 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004916
Chad Rosierc8e56e82012-12-05 21:08:21 +00004917 // -fno-asm-blocks is default.
4918 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4919 false))
4920 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004921
Steven Wucb0d13f2015-01-16 23:05:28 +00004922 // -fgnu-inline-asm is default.
4923 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4924 options::OPT_fno_gnu_inline_asm, true))
4925 CmdArgs.push_back("-fno-gnu-inline-asm");
4926
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004927 // Enable vectorization per default according to the optimization level
4928 // selected. For optimization levels that want vectorization we use the alias
4929 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004930 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004931 OptSpecifier VectorizeAliasOption =
4932 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004933 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004934 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004935 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004936
Chad Rosier136d67d2014-04-28 19:30:57 +00004937 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004938 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004939 OptSpecifier SLPVectAliasOption =
4940 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004941 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004942 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004943 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004944
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004945 // -fno-slp-vectorize-aggressive is default.
4946 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004947 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004948 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004949
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004950 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4951 A->render(Args, CmdArgs);
4952
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004953 // -fdollars-in-identifiers default varies depending on platform and
4954 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004955 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004956 options::OPT_fno_dollars_in_identifiers)) {
4957 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004958 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004959 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004960 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004961 }
4962
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004963 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4964 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004965 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004966 options::OPT_fno_unit_at_a_time)) {
4967 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004968 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004969 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004970
Eli Friedman055c9702011-11-02 01:53:16 +00004971 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4972 options::OPT_fno_apple_pragma_pack, false))
4973 CmdArgs.push_back("-fapple-pragma-pack");
4974
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004975 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004976 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4977 // by default.
4978 if (getToolChain().getArch() == llvm::Triple::le32) {
4979 CmdArgs.push_back("-fno-math-builtin");
4980 }
4981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004982// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4983//
4984// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004985#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004986 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004987 (getToolChain().getArch() == llvm::Triple::arm ||
4988 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004989 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4990 CmdArgs.push_back("-fno-builtin-strcat");
4991 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4992 CmdArgs.push_back("-fno-builtin-strcpy");
4993 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004994#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004995
Justin Bognera88f0122014-06-20 22:59:50 +00004996 // Enable rewrite includes if the user's asked for it or if we're generating
4997 // diagnostics.
4998 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4999 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005000 if (Args.hasFlag(options::OPT_frewrite_includes,
5001 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005002 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005003 CmdArgs.push_back("-frewrite-includes");
5004
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005005 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005006 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005007 options::OPT_traditional_cpp)) {
5008 if (isa<PreprocessJobAction>(JA))
5009 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005010 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005011 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005012 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005013
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005014 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005015 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005016
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005017 // Handle serialized diagnostics.
5018 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5019 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005020 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005021 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005022
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005023 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5024 CmdArgs.push_back("-fretain-comments-from-system-headers");
5025
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005026 // Forward -fcomment-block-commands to -cc1.
5027 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005028 // Forward -fparse-all-comments to -cc1.
5029 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005030
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005031 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5032 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005033 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005034 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5035 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005036
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005037 // We translate this by hand to the -cc1 argument, since nightly test uses
5038 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005039 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005040 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005041 } else
Sean Silva14facf32015-06-09 01:57:17 +00005042 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005043 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005044
Bob Wilson23a55f12014-12-21 07:00:00 +00005045 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005046 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5047 // by the frontend.
5048 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5049 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005050
Daniel Dunbard67a3222009-03-30 06:36:42 +00005051 if (Output.getType() == types::TY_Dependencies) {
5052 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005053 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005054 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005055 CmdArgs.push_back(Output.getFilename());
5056 } else {
5057 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005058 }
5059
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005060 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005061
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005062 if (Input.isFilename())
5063 CmdArgs.push_back(Input.getFilename());
5064 else
5065 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005066
Chris Lattnere9d7d782009-11-03 19:50:27 +00005067 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5068
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005069 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005070
5071 // Optionally embed the -cc1 level arguments into the debug info, for build
5072 // analysis.
5073 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005074 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005075 for (const auto &Arg : Args)
5076 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005077
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005078 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005079 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005080 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005081 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005082 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005083 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005084 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005085 }
5086 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005087 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005088 }
5089
Eric Christopherd3804002013-02-22 20:12:52 +00005090 // Add the split debug info name to the command lines here so we
5091 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005092 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005093 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5094 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005095 const char *SplitDwarfOut;
5096 if (SplitDwarf) {
5097 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005098 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005099 CmdArgs.push_back(SplitDwarfOut);
5100 }
5101
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005102 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5103 // Include them with -fcuda-include-gpubinary.
5104 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005105 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005106 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005107 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005108 }
5109
Eric Christopherd3804002013-02-22 20:12:52 +00005110 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005111 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005112 Output.getType() == types::TY_Object &&
5113 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005114 auto CLCommand =
5115 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005116 C.addCommand(llvm::make_unique<FallbackCommand>(
5117 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005118 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005119 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005120 }
5121
Eric Christopherf1545832013-02-22 23:50:16 +00005122 // Handle the debug info splitting at object creation time if we're
5123 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005124 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005125 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005126 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005127
Roman Divacky178e01602011-02-10 16:52:03 +00005128 if (Arg *A = Args.getLastArg(options::OPT_pg))
5129 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005130 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5131 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005132
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005133 // Claim some arguments which clang supports automatically.
5134
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005135 // -fpch-preprocess is used with gcc to add a special marker in the output to
5136 // include the PCH file. Clang's PTH solution is completely transparent, so we
5137 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005138 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005139
Daniel Dunbar17731772009-03-23 19:03:36 +00005140 // Claim some arguments which clang doesn't support, but we don't
5141 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005142 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5143 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005144
Rafael Espindolab0092d72013-09-04 19:37:35 +00005145 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005146 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005147}
5148
John McCall5fb5df92012-06-20 06:18:46 +00005149/// Add options related to the Objective-C runtime/ABI.
5150///
5151/// Returns true if the runtime is non-fragile.
5152ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5153 ArgStringList &cmdArgs,
5154 RewriteKind rewriteKind) const {
5155 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005156 Arg *runtimeArg =
5157 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5158 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005159
5160 // Just forward -fobjc-runtime= to the frontend. This supercedes
5161 // options about fragility.
5162 if (runtimeArg &&
5163 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5164 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005165 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005166 if (runtime.tryParse(value)) {
5167 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005168 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005169 }
5170
5171 runtimeArg->render(args, cmdArgs);
5172 return runtime;
5173 }
5174
5175 // Otherwise, we'll need the ABI "version". Version numbers are
5176 // slightly confusing for historical reasons:
5177 // 1 - Traditional "fragile" ABI
5178 // 2 - Non-fragile ABI, version 1
5179 // 3 - Non-fragile ABI, version 2
5180 unsigned objcABIVersion = 1;
5181 // If -fobjc-abi-version= is present, use that to set the version.
5182 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005183 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005184 if (value == "1")
5185 objcABIVersion = 1;
5186 else if (value == "2")
5187 objcABIVersion = 2;
5188 else if (value == "3")
5189 objcABIVersion = 3;
5190 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005191 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005192 } else {
5193 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005194 bool nonFragileABIIsDefault =
5195 (rewriteKind == RK_NonFragile ||
5196 (rewriteKind == RK_None &&
5197 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005198 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5199 options::OPT_fno_objc_nonfragile_abi,
5200 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005201// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005202#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5203 unsigned nonFragileABIVersion = 1;
5204#else
5205 unsigned nonFragileABIVersion = 2;
5206#endif
5207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005208 if (Arg *abiArg =
5209 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005210 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005211 if (value == "1")
5212 nonFragileABIVersion = 1;
5213 else if (value == "2")
5214 nonFragileABIVersion = 2;
5215 else
5216 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005217 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005218 }
5219
5220 objcABIVersion = 1 + nonFragileABIVersion;
5221 } else {
5222 objcABIVersion = 1;
5223 }
5224 }
5225
5226 // We don't actually care about the ABI version other than whether
5227 // it's non-fragile.
5228 bool isNonFragile = objcABIVersion != 1;
5229
5230 // If we have no runtime argument, ask the toolchain for its default runtime.
5231 // However, the rewriter only really supports the Mac runtime, so assume that.
5232 ObjCRuntime runtime;
5233 if (!runtimeArg) {
5234 switch (rewriteKind) {
5235 case RK_None:
5236 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5237 break;
5238 case RK_Fragile:
5239 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5240 break;
5241 case RK_NonFragile:
5242 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5243 break;
5244 }
5245
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005246 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005247 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5248 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005249 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005250 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5251
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005252 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005253 } else {
5254 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5255 }
5256
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005257 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005258 } else {
5259 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005260 // Legacy behaviour is to target the gnustep runtime if we are i
5261 // non-fragile mode or the GCC runtime in fragile mode.
5262 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005263 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005264 else
5265 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005266 }
5267
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005268 cmdArgs.push_back(
5269 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005270 return runtime;
5271}
5272
Reid Klecknerc542d372014-06-27 17:02:02 +00005273static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5274 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5275 I += HaveDash;
5276 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005277}
Reid Klecknerc542d372014-06-27 17:02:02 +00005278
5279struct EHFlags {
5280 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5281 bool Synch;
5282 bool Asynch;
5283 bool NoExceptC;
5284};
5285
5286/// /EH controls whether to run destructor cleanups when exceptions are
5287/// thrown. There are three modifiers:
5288/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5289/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5290/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5291/// - c: Assume that extern "C" functions are implicitly noexcept. This
5292/// modifier is an optimization, so we ignore it for now.
5293/// The default is /EHs-c-, meaning cleanups are disabled.
5294static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5295 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005296
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 std::vector<std::string> EHArgs =
5298 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005299 for (auto EHVal : EHArgs) {
5300 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5301 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 case 'a':
5303 EH.Asynch = maybeConsumeDash(EHVal, I);
5304 continue;
5305 case 'c':
5306 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5307 continue;
5308 case 's':
5309 EH.Synch = maybeConsumeDash(EHVal, I);
5310 continue;
5311 default:
5312 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005313 }
5314 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5315 break;
5316 }
5317 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005318
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005319 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5320 // can use -Xclang to manually enable C++ EH until then.
5321 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005322
Reid Klecknerc542d372014-06-27 17:02:02 +00005323 return EH;
5324}
5325
Hans Wennborg75958c42013-08-08 00:17:41 +00005326void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5327 unsigned RTOptionID = options::OPT__SLASH_MT;
5328
Hans Wennborgf1a74252013-09-10 20:18:04 +00005329 if (Args.hasArg(options::OPT__SLASH_LDd))
5330 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5331 // but defining _DEBUG is sticky.
5332 RTOptionID = options::OPT__SLASH_MTd;
5333
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005334 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005335 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005336
David Majnemere2afb472015-07-24 06:49:13 +00005337 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005338 switch (RTOptionID) {
5339 case options::OPT__SLASH_MD:
5340 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005341 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005342 CmdArgs.push_back("-D_MT");
5343 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005344 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005345 break;
5346 case options::OPT__SLASH_MDd:
5347 CmdArgs.push_back("-D_DEBUG");
5348 CmdArgs.push_back("-D_MT");
5349 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005350 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005351 break;
5352 case options::OPT__SLASH_MT:
5353 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005354 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005355 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005356 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005357 break;
5358 case options::OPT__SLASH_MTd:
5359 CmdArgs.push_back("-D_DEBUG");
5360 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005361 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005362 break;
5363 default:
5364 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005365 }
5366
David Majnemere2afb472015-07-24 06:49:13 +00005367 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5368 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5369 } else {
5370 CmdArgs.push_back(FlagForCRT.data());
5371
5372 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5373 // users want. The /Za flag to cl.exe turns this off, but it's not
5374 // implemented in clang.
5375 CmdArgs.push_back("--dependent-lib=oldnames");
5376 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005377
Hans Wennborg8858a032014-07-21 23:42:07 +00005378 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5379 // would produce interleaved output, so ignore /showIncludes in such cases.
5380 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5381 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5382 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005383
David Majnemerf6072342014-07-01 22:24:56 +00005384 // This controls whether or not we emit RTTI data for polymorphic types.
5385 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5386 /*default=*/false))
5387 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005388
Reid Kleckner124955a2015-08-05 18:51:13 +00005389 // Emit CodeView if -Z7 is present.
5390 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5391 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5392 // If we are emitting CV but not DWARF, don't build information that LLVM
5393 // can't yet process.
5394 if (EmitCodeView && !EmitDwarf)
5395 CmdArgs.push_back("-gline-tables-only");
5396 if (EmitCodeView)
5397 CmdArgs.push_back("-gcodeview");
5398
Reid Klecknerc542d372014-06-27 17:02:02 +00005399 const Driver &D = getToolChain().getDriver();
5400 EHFlags EH = parseClangCLEHFlags(D, Args);
5401 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005402 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005403 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005404 CmdArgs.push_back("-fexceptions");
5405 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005406
Hans Wennborge50cec32014-06-13 20:59:54 +00005407 // /EP should expand to -E -P.
5408 if (Args.hasArg(options::OPT__SLASH_EP)) {
5409 CmdArgs.push_back("-E");
5410 CmdArgs.push_back("-P");
5411 }
5412
David Majnemera5b195a2015-02-14 01:35:12 +00005413 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005414 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5415 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005416 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5417 else
5418 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5419
5420 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5421 VolatileOptionID = A->getOption().getID();
5422
5423 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5424 CmdArgs.push_back("-fms-volatile");
5425
David Majnemer86c318f2014-02-11 21:05:00 +00005426 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5427 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5428 if (MostGeneralArg && BestCaseArg)
5429 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5430 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5431
5432 if (MostGeneralArg) {
5433 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5434 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5435 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5436
5437 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5438 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5439 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5440 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5441 << FirstConflict->getAsString(Args)
5442 << SecondConflict->getAsString(Args);
5443
5444 if (SingleArg)
5445 CmdArgs.push_back("-fms-memptr-rep=single");
5446 else if (MultipleArg)
5447 CmdArgs.push_back("-fms-memptr-rep=multiple");
5448 else
5449 CmdArgs.push_back("-fms-memptr-rep=virtual");
5450 }
5451
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005452 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5453 A->render(Args, CmdArgs);
5454
Hans Wennborg81f74482013-09-10 01:07:07 +00005455 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5456 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005457 if (Args.hasArg(options::OPT__SLASH_fallback))
5458 CmdArgs.push_back("msvc-fallback");
5459 else
5460 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005461 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005462}
5463
Douglas Katzman95354292015-06-23 20:42:09 +00005464visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005465 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005466 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005467 return CLFallback.get();
5468}
5469
Daniel Sanders7f933f42015-01-30 17:35:23 +00005470void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5471 ArgStringList &CmdArgs) const {
5472 StringRef CPUName;
5473 StringRef ABIName;
5474 const llvm::Triple &Triple = getToolChain().getTriple();
5475 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5476
5477 CmdArgs.push_back("-target-abi");
5478 CmdArgs.push_back(ABIName.data());
5479}
5480
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005481void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005482 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005483 const ArgList &Args,
5484 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005485 ArgStringList CmdArgs;
5486
5487 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5488 const InputInfo &Input = Inputs[0];
5489
James Y Knight2db38f32015-08-15 03:45:25 +00005490 std::string TripleStr =
5491 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5492 const llvm::Triple Triple(TripleStr);
5493
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005494 // Don't warn about "clang -w -c foo.s"
5495 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005496 // and "clang -emit-llvm -c foo.s"
5497 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005498
Rafael Espindola577637a2015-01-03 00:06:04 +00005499 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005500
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005501 // Invoke ourselves in -cc1as mode.
5502 //
5503 // FIXME: Implement custom jobs for internal actions.
5504 CmdArgs.push_back("-cc1as");
5505
5506 // Add the "effective" target triple.
5507 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005508 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5509
5510 // Set the output mode, we currently only expect to be used as a real
5511 // assembler.
5512 CmdArgs.push_back("-filetype");
5513 CmdArgs.push_back("obj");
5514
Eric Christopher45f2e712012-12-18 00:31:10 +00005515 // Set the main file name, so that debug info works even with
5516 // -save-temps or preprocessed assembly.
5517 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005518 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005519
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005520 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005521 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005522 if (!CPU.empty()) {
5523 CmdArgs.push_back("-target-cpu");
5524 CmdArgs.push_back(Args.MakeArgString(CPU));
5525 }
5526
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005527 // Add the target features
5528 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005529 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005530
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005531 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005532 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005533
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005534 // Pass along any -I options so we get proper .include search paths.
5535 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5536
Eric Christopherfc3ee562012-01-10 00:38:01 +00005537 // Determine the original source input.
5538 const Action *SourceAction = &JA;
5539 while (SourceAction->getKind() != Action::InputClass) {
5540 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5541 SourceAction = SourceAction->getInputs()[0];
5542 }
5543
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005544 // Forward -g and handle debug info related flags, assuming we are dealing
5545 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005546 if (SourceAction->getType() == types::TY_Asm ||
5547 SourceAction->getType() == types::TY_PP_Asm) {
5548 Args.ClaimAllArgs(options::OPT_g_Group);
5549 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5550 if (!A->getOption().matches(options::OPT_g0))
5551 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005552
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005553 if (Args.hasArg(options::OPT_gdwarf_2))
5554 CmdArgs.push_back("-gdwarf-2");
5555 if (Args.hasArg(options::OPT_gdwarf_3))
5556 CmdArgs.push_back("-gdwarf-3");
5557 if (Args.hasArg(options::OPT_gdwarf_4))
5558 CmdArgs.push_back("-gdwarf-4");
5559
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005560 // Add the -fdebug-compilation-dir flag if needed.
5561 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005562
5563 // Set the AT_producer to the clang version when using the integrated
5564 // assembler on assembly source files.
5565 CmdArgs.push_back("-dwarf-debug-producer");
5566 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005567
5568 // And pass along -I options
5569 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005570 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005571
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005572 // Handle -fPIC et al -- the relocation-model affects the assembler
5573 // for some targets.
5574 llvm::Reloc::Model RelocationModel;
5575 unsigned PICLevel;
5576 bool IsPIE;
5577 std::tie(RelocationModel, PICLevel, IsPIE) =
5578 ParsePICArgs(getToolChain(), Triple, Args);
5579
5580 const char *RMName = RelocationModelName(RelocationModel);
5581 if (RMName) {
5582 CmdArgs.push_back("-mrelocation-model");
5583 CmdArgs.push_back(RMName);
5584 }
5585
Kevin Enderby292dc082011-12-22 19:31:58 +00005586 // Optionally embed the -cc1as level arguments into the debug info, for build
5587 // analysis.
5588 if (getToolChain().UseDwarfDebugFlags()) {
5589 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005590 for (const auto &Arg : Args)
5591 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005592
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005593 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005594 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5595 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005596 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005597 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005598 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005599 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005600 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005601 }
5602 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005603 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005604 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005605
5606 // FIXME: Add -static support, once we have it.
5607
Daniel Sanders7f933f42015-01-30 17:35:23 +00005608 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005609 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005610 default:
5611 break;
5612
5613 case llvm::Triple::mips:
5614 case llvm::Triple::mipsel:
5615 case llvm::Triple::mips64:
5616 case llvm::Triple::mips64el:
5617 AddMIPSTargetArgs(Args, CmdArgs);
5618 break;
5619 }
5620
David Blaikie372d9502014-01-17 03:17:40 +00005621 // Consume all the warning flags. Usually this would be handled more
5622 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5623 // doesn't handle that so rather than warning about unused flags that are
5624 // actually used, we'll lie by omission instead.
5625 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005626 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5627 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005628
David Blaikie9260ed62013-07-25 21:19:01 +00005629 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5630 getToolChain().getDriver());
5631
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005632 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005633
5634 assert(Output.isFilename() && "Unexpected lipo output.");
5635 CmdArgs.push_back("-o");
5636 CmdArgs.push_back(Output.getFilename());
5637
Daniel Dunbarb440f562010-08-02 02:38:21 +00005638 assert(Input.isFilename() && "Invalid input.");
5639 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005640
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005641 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005642 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005643
5644 // Handle the debug info splitting at object creation time if we're
5645 // creating an object.
5646 // TODO: Currently only works on linux with newer objcopy.
5647 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005648 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005649 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005650 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005651}
5652
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005653void GnuTool::anchor() {}
5654
Daniel Dunbara3246a02009-03-18 08:07:30 +00005655void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005656 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005657 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005658 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005659 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005660 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005661
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005662 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005663 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005664 // Don't forward any -g arguments to assembly steps.
5665 if (isa<AssembleJobAction>(JA) &&
5666 A->getOption().matches(options::OPT_g_Group))
5667 continue;
5668
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005669 // Don't forward any -W arguments to assembly and link steps.
5670 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5671 A->getOption().matches(options::OPT_W_Group))
5672 continue;
5673
Daniel Dunbar2da02722009-03-19 07:55:12 +00005674 // It is unfortunate that we have to claim here, as this means
5675 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005676 // platforms using a generic gcc, even if we are just using gcc
5677 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005678 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005679 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005680 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005681 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005682
Daniel Dunbar4e295052010-01-25 22:35:08 +00005683 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005684
5685 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005686 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005687 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005688 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005689 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005690 }
5691
Daniel Dunbar5716d872009-05-02 21:41:52 +00005692 // Try to force gcc to match the tool chain we want, if we recognize
5693 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005694 //
5695 // FIXME: The triple class should directly provide the information we want
5696 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005697 switch (getToolChain().getArch()) {
5698 default:
5699 break;
5700 case llvm::Triple::x86:
5701 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005702 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005703 break;
5704 case llvm::Triple::x86_64:
5705 case llvm::Triple::ppc64:
5706 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005707 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005708 break;
5709 case llvm::Triple::sparcel:
5710 CmdArgs.push_back("-EL");
5711 break;
5712 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005713
Daniel Dunbarb440f562010-08-02 02:38:21 +00005714 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005715 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005716 CmdArgs.push_back(Output.getFilename());
5717 } else {
5718 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005719 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005720 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005721
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005722 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005723
5724 // Only pass -x if gcc will understand it; otherwise hope gcc
5725 // understands the suffix correctly. The main use case this would go
5726 // wrong in is for linker inputs if they happened to have an odd
5727 // suffix; really the only way to get this to happen is a command
5728 // like '-x foobar a.c' which will treat a.c like a linker input.
5729 //
5730 // FIXME: For the linker case specifically, can we safely convert
5731 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005732 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005733 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005734 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5735 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005736 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005737 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005738 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005739 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005740 else if (II.getType() == types::TY_ModuleFile)
5741 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005743
Daniel Dunbara3246a02009-03-18 08:07:30 +00005744 if (types::canTypeBeUserSpecified(II.getType())) {
5745 CmdArgs.push_back("-x");
5746 CmdArgs.push_back(types::getTypeName(II.getType()));
5747 }
5748
Daniel Dunbarb440f562010-08-02 02:38:21 +00005749 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005750 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005751 else {
5752 const Arg &A = II.getInputArg();
5753
5754 // Reverse translate some rewritten options.
5755 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5756 CmdArgs.push_back("-lstdc++");
5757 continue;
5758 }
5759
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005760 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005761 A.render(Args, CmdArgs);
5762 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005763 }
5764
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005765 const std::string customGCCName = D.getCCCGenericGCCName();
5766 const char *GCCName;
5767 if (!customGCCName.empty())
5768 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005769 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005770 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005771 } else
5772 GCCName = "gcc";
5773
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005774 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005775 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005776}
5777
Douglas Katzman95354292015-06-23 20:42:09 +00005778void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5779 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005780 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005781}
5782
Douglas Katzman95354292015-06-23 20:42:09 +00005783void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5784 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005785 const Driver &D = getToolChain().getDriver();
5786
Eric Christophercc7ff502015-01-29 00:56:17 +00005787 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005788 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005789 case types::TY_LLVM_IR:
5790 case types::TY_LTO_IR:
5791 case types::TY_LLVM_BC:
5792 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005793 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005794 break;
5795 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005796 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005797 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005798 case types::TY_Nothing:
5799 CmdArgs.push_back("-fsyntax-only");
5800 break;
5801 default:
5802 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005803 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005804}
5805
Douglas Katzman95354292015-06-23 20:42:09 +00005806void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5807 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005808 // The types are (hopefully) good enough.
5809}
5810
Tony Linthicum76329bf2011-12-12 21:14:55 +00005811// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005812void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5813 ArgStringList &CmdArgs) const {}
5814void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5815 const InputInfo &Output,
5816 const InputInfoList &Inputs,
5817 const ArgList &Args,
5818 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005819 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005820
5821 const Driver &D = getToolChain().getDriver();
5822 ArgStringList CmdArgs;
5823
5824 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005825 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005826 CmdArgs.push_back(Args.MakeArgString(MarchString));
5827
5828 RenderExtraToolArgs(JA, CmdArgs);
5829
5830 if (Output.isFilename()) {
5831 CmdArgs.push_back("-o");
5832 CmdArgs.push_back(Output.getFilename());
5833 } else {
5834 assert(Output.isNothing() && "Unexpected output");
5835 CmdArgs.push_back("-fsyntax-only");
5836 }
5837
Douglas Katzman54366072015-07-27 16:53:08 +00005838 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005839 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005840
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005841 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005842
Tony Linthicum76329bf2011-12-12 21:14:55 +00005843 // Only pass -x if gcc will understand it; otherwise hope gcc
5844 // understands the suffix correctly. The main use case this would go
5845 // wrong in is for linker inputs if they happened to have an odd
5846 // suffix; really the only way to get this to happen is a command
5847 // like '-x foobar a.c' which will treat a.c like a linker input.
5848 //
5849 // FIXME: For the linker case specifically, can we safely convert
5850 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005851 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005852 // Don't try to pass LLVM or AST inputs to a generic gcc.
5853 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5854 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5855 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005856 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005857 else if (II.getType() == types::TY_AST)
5858 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005860 else if (II.getType() == types::TY_ModuleFile)
5861 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005862 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005863
5864 if (II.isFilename())
5865 CmdArgs.push_back(II.getFilename());
5866 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005867 // Don't render as input, we need gcc to do the translations.
5868 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005869 II.getInputArg().render(Args, CmdArgs);
5870 }
5871
5872 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005873 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005874 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005875}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005876
Douglas Katzman95354292015-06-23 20:42:09 +00005877void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5878 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005879 // The types are (hopefully) good enough.
5880}
5881
Douglas Katzman54366072015-07-27 16:53:08 +00005882static void
5883constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5884 const toolchains::HexagonToolChain &ToolChain,
5885 const InputInfo &Output, const InputInfoList &Inputs,
5886 const ArgList &Args, ArgStringList &CmdArgs,
5887 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005888
Matthew Curtise689b052012-12-06 15:46:07 +00005889 const Driver &D = ToolChain.getDriver();
5890
Matthew Curtise689b052012-12-06 15:46:07 +00005891 //----------------------------------------------------------------------------
5892 //
5893 //----------------------------------------------------------------------------
5894 bool hasStaticArg = Args.hasArg(options::OPT_static);
5895 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005896 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005897 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5898 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5899 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005900 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005901 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005902
Matthew Curtise689b052012-12-06 15:46:07 +00005903 //----------------------------------------------------------------------------
5904 // Silence warnings for various options
5905 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005906
Matthew Curtise689b052012-12-06 15:46:07 +00005907 Args.ClaimAllArgs(options::OPT_g_Group);
5908 Args.ClaimAllArgs(options::OPT_emit_llvm);
5909 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5910 // handled somewhere else.
5911 Args.ClaimAllArgs(options::OPT_static_libgcc);
5912
5913 //----------------------------------------------------------------------------
5914 //
5915 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005916 for (const auto &Opt : ToolChain.ExtraOpts)
5917 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005918
Douglas Katzman54366072015-07-27 16:53:08 +00005919 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005920 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005921
Matthew Curtise689b052012-12-06 15:46:07 +00005922 if (buildingLib) {
5923 CmdArgs.push_back("-shared");
5924 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5925 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005926 }
5927
Matthew Curtise689b052012-12-06 15:46:07 +00005928 if (hasStaticArg)
5929 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005930
Matthew Curtise8f80a12012-12-06 17:49:03 +00005931 if (buildPIE && !buildingLib)
5932 CmdArgs.push_back("-pie");
5933
Douglas Katzman54366072015-07-27 16:53:08 +00005934 if (const char *v =
5935 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005936 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005937 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005938 }
5939
Matthew Curtise689b052012-12-06 15:46:07 +00005940 //----------------------------------------------------------------------------
5941 //
5942 //----------------------------------------------------------------------------
5943 CmdArgs.push_back("-o");
5944 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005945
Matthew Curtise689b052012-12-06 15:46:07 +00005946 const std::string MarchSuffix = "/" + MarchString;
5947 const std::string G0Suffix = "/G0";
5948 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005949 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005950 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005951 const std::string StartFilesDir =
5952 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005953
5954 //----------------------------------------------------------------------------
5955 // moslib
5956 //----------------------------------------------------------------------------
5957 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005958 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005959
Sean Silva14facf32015-06-09 01:57:17 +00005960 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5961 A->claim();
5962 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005963 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005964 }
Matthew Curtise689b052012-12-06 15:46:07 +00005965 if (oslibs.empty()) {
5966 oslibs.push_back("standalone");
5967 hasStandalone = true;
5968 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005969
Matthew Curtise689b052012-12-06 15:46:07 +00005970 //----------------------------------------------------------------------------
5971 // Start Files
5972 //----------------------------------------------------------------------------
5973 if (incStdLib && incStartFiles) {
5974
5975 if (!buildingLib) {
5976 if (hasStandalone) {
5977 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005978 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005979 }
5980 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5981 }
5982 std::string initObj = useShared ? "/initS.o" : "/init.o";
5983 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5984 }
5985
5986 //----------------------------------------------------------------------------
5987 // Library Search Paths
5988 //----------------------------------------------------------------------------
5989 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005990 for (const auto &LibPath : LibPaths)
5991 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005992
5993 //----------------------------------------------------------------------------
5994 //
5995 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005996 Args.AddAllArgs(CmdArgs,
5997 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5998 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005999
6000 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6001
6002 //----------------------------------------------------------------------------
6003 // Libraries
6004 //----------------------------------------------------------------------------
6005 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006006 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006007 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6008 CmdArgs.push_back("-lm");
6009 }
6010
6011 CmdArgs.push_back("--start-group");
6012
6013 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006014 for (const std::string &Lib : oslibs)
6015 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006016 CmdArgs.push_back("-lc");
6017 }
6018 CmdArgs.push_back("-lgcc");
6019
6020 CmdArgs.push_back("--end-group");
6021 }
6022
6023 //----------------------------------------------------------------------------
6024 // End files
6025 //----------------------------------------------------------------------------
6026 if (incStdLib && incStartFiles) {
6027 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6028 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6029 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006030}
6031
Douglas Katzman95354292015-06-23 20:42:09 +00006032void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6033 const InputInfo &Output,
6034 const InputInfoList &Inputs,
6035 const ArgList &Args,
6036 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006037
Douglas Katzman54366072015-07-27 16:53:08 +00006038 const toolchains::HexagonToolChain &ToolChain =
6039 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006040
6041 ArgStringList CmdArgs;
6042 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6043 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006044
6045 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006046 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006047 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006048}
6049// Hexagon tools end.
6050
Tom Stellard8fa33092015-07-18 01:49:05 +00006051void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6052 const InputInfo &Output,
6053 const InputInfoList &Inputs,
6054 const ArgList &Args,
6055 const char *LinkingOutput) const {
6056
6057 std::string Linker = getToolChain().GetProgramPath(getShortName());
6058 ArgStringList CmdArgs;
6059 CmdArgs.push_back("-flavor");
6060 CmdArgs.push_back("gnu");
6061 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006062 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006063 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6064 CmdArgs.push_back("-o");
6065 CmdArgs.push_back(Output.getFilename());
6066 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6067 CmdArgs, Inputs));
6068}
6069// AMDGPU tools end.
6070
Renato Golin7c542b42015-07-27 23:44:45 +00006071const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006072 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006073 if (!Arch.empty())
6074 MArch = Arch;
6075 else
Bernard Ogden31561762013-12-12 13:27:11 +00006076 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006077 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006078
6079 // Handle -march=native.
6080 if (MArch == "native") {
6081 std::string CPU = llvm::sys::getHostCPUName();
6082 if (CPU != "generic") {
6083 // Translate the native cpu into the architecture suffix for that CPU.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006084 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
John Brawn94fd9632015-05-21 12:19:49 +00006085 // If there is no valid architecture suffix for this CPU we don't know how
6086 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006087 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006088 MArch = "";
6089 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006090 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006091 }
6092 }
6093
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006094 return MArch;
6095}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006096
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006097/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006098StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006099 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006100 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6101 // here means an -march=native that we can't handle, so instead return no CPU.
6102 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006103 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006104
John Brawna95c1a82015-05-08 12:52:18 +00006105 // We need to return an empty string here on invalid MArch values as the
6106 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006107 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006108}
6109
6110/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006111std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006112 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006113 // FIXME: Warn on inconsistent use of -mcpu and -march.
6114 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006115 if (!CPU.empty()) {
6116 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006117 // Handle -mcpu=native.
6118 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006119 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006120 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006121 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006122 }
6123
Renato Goline17c5802015-07-27 23:44:42 +00006124 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006125}
6126
6127/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006128/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006129// FIXME: This is redundant with -mcpu, why does LLVM use this.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006130StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00006131 if (CPU == "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006132 return llvm::ARM::getSubArch(
6133 llvm::ARM::parseArch(Arch));
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006134
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006135 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin3c007252015-05-28 15:05:53 +00006136 if (ArchKind == llvm::ARM::AK_INVALID)
6137 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006138 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006139}
6140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006141void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006142 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006143 if (Args.hasArg(options::OPT_r))
6144 return;
6145
John Brawn94fd9632015-05-21 12:19:49 +00006146 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6147 // to generate BE-8 executables.
6148 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6149 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006150}
6151
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006152mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6153 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6154 .Case("mips1", NanLegacy)
6155 .Case("mips2", NanLegacy)
6156 .Case("mips3", NanLegacy)
6157 .Case("mips4", NanLegacy)
6158 .Case("mips5", NanLegacy)
6159 .Case("mips32", NanLegacy)
6160 .Case("mips32r2", NanLegacy)
6161 .Case("mips32r3", NanLegacy | Nan2008)
6162 .Case("mips32r5", NanLegacy | Nan2008)
6163 .Case("mips32r6", Nan2008)
6164 .Case("mips64", NanLegacy)
6165 .Case("mips64r2", NanLegacy)
6166 .Case("mips64r3", NanLegacy | Nan2008)
6167 .Case("mips64r5", NanLegacy | Nan2008)
6168 .Case("mips64r6", Nan2008)
6169 .Default(NanLegacy);
6170}
6171
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006172bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6173 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6174 return A && (A->getValue() == StringRef(Value));
6175}
6176
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006177bool mips::isUCLibc(const ArgList &Args) {
6178 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006179 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006180}
6181
Daniel Sanders2bf13662014-07-10 14:40:57 +00006182bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006183 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6184 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006185 .Case("2008", true)
6186 .Case("legacy", false)
6187 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006188
6189 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006190 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006191 .Cases("mips32r6", "mips64r6", true)
6192 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006193
6194 return false;
6195}
6196
Daniel Sanders379d44b2014-07-16 11:52:23 +00006197bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006198 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006199 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006200 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006201 return false;
6202
6203 if (ABIName != "32")
6204 return false;
6205
Toma Tabacu94ea6862015-06-16 13:54:13 +00006206 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6207 // present.
6208 if (FloatABI == "soft")
6209 return false;
6210
Daniel Sanders379d44b2014-07-16 11:52:23 +00006211 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006212 .Cases("mips2", "mips3", "mips4", "mips5", true)
6213 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6214 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6215 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006216}
6217
Toma Tabacu94ea6862015-06-16 13:54:13 +00006218bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6219 StringRef CPUName, StringRef ABIName,
6220 StringRef FloatABI) {
6221 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6222
6223 // FPXX shouldn't be used if -msingle-float is present.
6224 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6225 options::OPT_mdouble_float))
6226 if (A->getOption().matches(options::OPT_msingle_float))
6227 UseFPXX = false;
6228
6229 return UseFPXX;
6230}
6231
Tim Northover157d9112014-01-16 08:48:16 +00006232llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006233 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6234 // archs which Darwin doesn't use.
6235
6236 // The matching this routine does is fairly pointless, since it is neither the
6237 // complete architecture list, nor a reasonable subset. The problem is that
6238 // historically the driver driver accepts this and also ties its -march=
6239 // handling to the architecture name, so we need to be careful before removing
6240 // support for it.
6241
6242 // This code must be kept in sync with Clang's Darwin specific argument
6243 // translation.
6244
6245 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006246 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6247 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6248 .Case("ppc64", llvm::Triple::ppc64)
6249 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6250 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6251 llvm::Triple::x86)
6252 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6253 // This is derived from the driver driver.
6254 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6255 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6256 .Cases("armv7s", "xscale", llvm::Triple::arm)
6257 .Case("arm64", llvm::Triple::aarch64)
6258 .Case("r600", llvm::Triple::r600)
6259 .Case("amdgcn", llvm::Triple::amdgcn)
6260 .Case("nvptx", llvm::Triple::nvptx)
6261 .Case("nvptx64", llvm::Triple::nvptx64)
6262 .Case("amdil", llvm::Triple::amdil)
6263 .Case("spir", llvm::Triple::spir)
6264 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006265}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006266
Tim Northover157d9112014-01-16 08:48:16 +00006267void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006268 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006269 T.setArch(Arch);
6270
6271 if (Str == "x86_64h")
6272 T.setArchName(Str);
6273 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6274 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006275 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006276 }
6277}
6278
Bob Wilsondecc03e2012-11-23 06:14:39 +00006279const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006280 const InputInfo &Input) {
6281 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006282}
6283
Bob Wilsondecc03e2012-11-23 06:14:39 +00006284const char *Clang::getBaseInputStem(const ArgList &Args,
6285 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006286 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006287
Chris Lattner906bb902011-01-16 08:14:11 +00006288 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006289 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006290
6291 return Str;
6292}
6293
Bob Wilsondecc03e2012-11-23 06:14:39 +00006294const char *Clang::getDependencyFileName(const ArgList &Args,
6295 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006296 // FIXME: Think about this more.
6297 std::string Res;
6298
6299 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006300 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006301 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006302 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006303 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006304 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006305 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006306}
6307
Douglas Katzman95354292015-06-23 20:42:09 +00006308void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6309 const InputInfo &Output,
6310 const InputInfoList &Inputs,
6311 const ArgList &Args,
6312 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006313 const ToolChain &ToolChain = getToolChain();
6314 const Driver &D = ToolChain.getDriver();
6315 ArgStringList CmdArgs;
6316
6317 // Silence warning for "clang -g foo.o -o foo"
6318 Args.ClaimAllArgs(options::OPT_g_Group);
6319 // and "clang -emit-llvm foo.o -o foo"
6320 Args.ClaimAllArgs(options::OPT_emit_llvm);
6321 // and for "clang -w foo.o -o foo". Other warning options are already
6322 // handled somewhere else.
6323 Args.ClaimAllArgs(options::OPT_w);
6324
6325 if (!D.SysRoot.empty())
6326 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6327
6328 // CloudABI only supports static linkage.
6329 CmdArgs.push_back("-Bstatic");
6330 CmdArgs.push_back("--eh-frame-hdr");
6331 CmdArgs.push_back("--gc-sections");
6332
6333 if (Output.isFilename()) {
6334 CmdArgs.push_back("-o");
6335 CmdArgs.push_back(Output.getFilename());
6336 } else {
6337 assert(Output.isNothing() && "Invalid output.");
6338 }
6339
6340 if (!Args.hasArg(options::OPT_nostdlib) &&
6341 !Args.hasArg(options::OPT_nostartfiles)) {
6342 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6343 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6344 }
6345
6346 Args.AddAllArgs(CmdArgs, options::OPT_L);
6347 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6348 for (const auto &Path : Paths)
6349 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006350 Args.AddAllArgs(CmdArgs,
6351 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6352 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006353
Alexey Samsonov907880e2015-06-19 19:57:46 +00006354 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006355 AddGoldPlugin(ToolChain, Args, CmdArgs);
6356
6357 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6358
6359 if (!Args.hasArg(options::OPT_nostdlib) &&
6360 !Args.hasArg(options::OPT_nodefaultlibs)) {
6361 if (D.CCCIsCXX())
6362 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6363 CmdArgs.push_back("-lc");
6364 CmdArgs.push_back("-lcompiler_rt");
6365 }
6366
6367 if (!Args.hasArg(options::OPT_nostdlib) &&
6368 !Args.hasArg(options::OPT_nostartfiles))
6369 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6370
6371 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006372 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006373}
6374
Douglas Katzman95354292015-06-23 20:42:09 +00006375void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6376 const InputInfo &Output,
6377 const InputInfoList &Inputs,
6378 const ArgList &Args,
6379 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006380 ArgStringList CmdArgs;
6381
6382 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6383 const InputInfo &Input = Inputs[0];
6384
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006385 // Determine the original source input.
6386 const Action *SourceAction = &JA;
6387 while (SourceAction->getKind() != Action::InputClass) {
6388 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6389 SourceAction = SourceAction->getInputs()[0];
6390 }
6391
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006392 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006393 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006394 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6395 // FIXME: at run-time detect assembler capabilities or rely on version
6396 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006397 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006398 const llvm::Triple &T(getToolChain().getTriple());
6399 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006400 CmdArgs.push_back("-Q");
6401 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006402
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006403 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006404 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006405 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006406 if (Args.hasArg(options::OPT_gstabs))
6407 CmdArgs.push_back("--gstabs");
6408 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006409 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006410 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006411
Daniel Dunbarbe220842009-03-20 16:06:39 +00006412 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006413 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006414
Daniel Dunbar6d484762010-07-22 01:47:22 +00006415 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006416 if (getToolChain().getArch() == llvm::Triple::x86 ||
6417 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006418 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6419 CmdArgs.push_back("-force_cpusubtype_ALL");
6420
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006421 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006422 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006423 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006424 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006425 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006426 CmdArgs.push_back("-static");
6427
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006428 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006429
6430 assert(Output.isFilename() && "Unexpected lipo output.");
6431 CmdArgs.push_back("-o");
6432 CmdArgs.push_back(Output.getFilename());
6433
Daniel Dunbarb440f562010-08-02 02:38:21 +00006434 assert(Input.isFilename() && "Invalid input.");
6435 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006436
6437 // asm_final spec is empty.
6438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006439 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006440 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006441}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006442
Tim Northover157d9112014-01-16 08:48:16 +00006443void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006444
Tim Northover157d9112014-01-16 08:48:16 +00006445void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6446 ArgStringList &CmdArgs) const {
6447 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006448
Daniel Dunbarc1964212009-03-26 16:23:12 +00006449 // Derived from darwin_arch spec.
6450 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006451 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006452
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006453 // FIXME: Is this needed anymore?
6454 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006455 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006456}
6457
Douglas Katzman95354292015-06-23 20:42:09 +00006458bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006459 // We only need to generate a temp path for LTO if we aren't compiling object
6460 // files. When compiling source files, we run 'dsymutil' after linking. We
6461 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006462 for (const auto &Input : Inputs)
6463 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006464 return true;
6465
6466 return false;
6467}
6468
Douglas Katzman95354292015-06-23 20:42:09 +00006469void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6470 ArgStringList &CmdArgs,
6471 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006472 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006473 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006475 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006476 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6477 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006478 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6479 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006480 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006481 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006482 }
6483
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006484 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006485 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006486 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6487 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006488
Bob Wilson3d27dad2013-08-02 22:25:34 +00006489 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6490 CmdArgs.push_back("-export_dynamic");
6491
Bob Wilsonb111ec92015-03-02 19:01:14 +00006492 // If we are using App Extension restrictions, pass a flag to the linker
6493 // telling it that the compiled code has been audited.
6494 if (Args.hasFlag(options::OPT_fapplication_extension,
6495 options::OPT_fno_application_extension, false))
6496 CmdArgs.push_back("-application_extension");
6497
Bill Wendling313b6bf2012-11-16 23:03:00 +00006498 // If we are using LTO, then automatically create a temporary file path for
6499 // the linker to use, so that it's lifetime will extend past a possible
6500 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006501 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006502 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006503 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006504 C.addTempFile(TmpPath);
6505 CmdArgs.push_back("-object_path_lto");
6506 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006507 }
6508
Daniel Dunbarc1964212009-03-26 16:23:12 +00006509 // Derived from the "link" spec.
6510 Args.AddAllArgs(CmdArgs, options::OPT_static);
6511 if (!Args.hasArg(options::OPT_static))
6512 CmdArgs.push_back("-dynamic");
6513 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6514 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6515 // here. How do we wish to handle such things?
6516 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006517
Daniel Dunbarc1964212009-03-26 16:23:12 +00006518 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006519 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006520 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006521 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006522
6523 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6524 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6525 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6526
6527 Arg *A;
6528 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6529 (A = Args.getLastArg(options::OPT_current__version)) ||
6530 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006531 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6532 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006533
6534 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6535 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6536 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6537 } else {
6538 CmdArgs.push_back("-dylib");
6539
6540 Arg *A;
6541 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6542 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6543 (A = Args.getLastArg(options::OPT_client__name)) ||
6544 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6545 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6546 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006547 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6548 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006549
Daniel Dunbarc1964212009-03-26 16:23:12 +00006550 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6551 "-dylib_compatibility_version");
6552 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6553 "-dylib_current_version");
6554
Tim Northover157d9112014-01-16 08:48:16 +00006555 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006556
6557 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6558 "-dylib_install_name");
6559 }
6560
6561 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6562 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6563 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006564 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006565 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006566 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6567 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6568 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6569 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6570 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6571 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006572 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006573 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6574 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6575 Args.AddAllArgs(CmdArgs, options::OPT_init);
6576
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006577 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006578 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006579
Daniel Dunbarc1964212009-03-26 16:23:12 +00006580 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6581 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6582 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6583 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6584 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006585
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006586 if (const Arg *A =
6587 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6588 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006589 if (A->getOption().matches(options::OPT_fpie) ||
6590 A->getOption().matches(options::OPT_fPIE))
6591 CmdArgs.push_back("-pie");
6592 else
6593 CmdArgs.push_back("-no_pie");
6594 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006595
6596 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6597 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6598 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6599 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6600 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6601 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6602 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6603 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6604 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6605 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6606 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6607 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6608 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6609 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6610 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6611 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006612
Daniel Dunbar84384642011-05-02 21:03:47 +00006613 // Give --sysroot= preference, over the Apple specific behavior to also use
6614 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006615 StringRef sysroot = C.getSysRoot();
6616 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006617 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006618 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006619 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6620 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006621 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006622 }
6623
Daniel Dunbarc1964212009-03-26 16:23:12 +00006624 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6625 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6626 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6627 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6628 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006629 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006630 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6631 Args.AddAllArgs(CmdArgs, options::OPT_y);
6632 Args.AddLastArg(CmdArgs, options::OPT_w);
6633 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6634 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6635 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6636 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6637 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6638 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6639 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6640 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6641 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6642 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6643 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6644 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6645}
6646
Douglas Katzman95354292015-06-23 20:42:09 +00006647void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6648 const InputInfo &Output,
6649 const InputInfoList &Inputs,
6650 const ArgList &Args,
6651 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006652 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006653
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006654 // If the number of arguments surpasses the system limits, we will encode the
6655 // input files in a separate file, shortening the command line. To this end,
6656 // build a list of input file names that can be passed via a file with the
6657 // -filelist linker option.
6658 llvm::opt::ArgStringList InputFileList;
6659
Daniel Dunbarc1964212009-03-26 16:23:12 +00006660 // The logic here is derived from gcc's behavior; most of which
6661 // comes from specs (starting with link_command). Consult gcc for
6662 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006663 ArgStringList CmdArgs;
6664
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006665 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6666 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6667 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006668 for (const auto &Arg : Args)
6669 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006670 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006671 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006672 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006673 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006674 return;
6675 }
6676
Daniel Dunbarc1964212009-03-26 16:23:12 +00006677 // I'm not sure why this particular decomposition exists in gcc, but
6678 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006679 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006680
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006681 // It seems that the 'e' option is completely ignored for dynamic executables
6682 // (the default), and with static executables, the last one wins, as expected.
6683 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6684 options::OPT_Z_Flag, options::OPT_u_Group,
6685 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006686
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006687 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6688 // members of static archive libraries which implement Objective-C classes or
6689 // categories.
6690 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6691 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006692
Daniel Dunbarc1964212009-03-26 16:23:12 +00006693 CmdArgs.push_back("-o");
6694 CmdArgs.push_back(Output.getFilename());
6695
Chad Rosier06fd3c62012-05-16 23:45:12 +00006696 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006697 !Args.hasArg(options::OPT_nostartfiles))
6698 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006699
Peter Collingbournec4122c12015-06-15 21:08:13 +00006700 // SafeStack requires its own runtime libraries
6701 // These libraries should be linked first, to make sure the
6702 // __safestack_init constructor executes before everything else
6703 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6704 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6705 "libclang_rt.safestack_osx.a",
6706 /*AlwaysLink=*/true);
6707 }
6708
Daniel Dunbarc1964212009-03-26 16:23:12 +00006709 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006710
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006711 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6712 options::OPT_fno_openmp, false)) {
6713 switch (getOpenMPRuntime(getToolChain(), Args)) {
6714 case OMPRT_OMP:
6715 CmdArgs.push_back("-lomp");
6716 break;
6717 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006718 CmdArgs.push_back("-lgomp");
6719 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006720 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006721 CmdArgs.push_back("-liomp5");
6722 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006723 case OMPRT_Unknown:
6724 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006725 break;
6726 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006727 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006728
Douglas Gregor9295df02012-05-15 21:00:27 +00006729 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006730 // Build the input file for -filelist (list of linker input files) in case we
6731 // need it later
6732 for (const auto &II : Inputs) {
6733 if (!II.isFilename()) {
6734 // This is a linker input argument.
6735 // We cannot mix input arguments and file names in a -filelist input, thus
6736 // we prematurely stop our list (remaining files shall be passed as
6737 // arguments).
6738 if (InputFileList.size() > 0)
6739 break;
6740
6741 continue;
6742 }
6743
6744 InputFileList.push_back(II.getFilename());
6745 }
6746
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006747 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006748 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006749 // We use arclite library for both ARC and subscripting support.
6750 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6751
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006752 CmdArgs.push_back("-framework");
6753 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006754 // Link libobj.
6755 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006756 }
John McCall31168b02011-06-15 23:02:42 +00006757
Daniel Dunbarc1964212009-03-26 16:23:12 +00006758 if (LinkingOutput) {
6759 CmdArgs.push_back("-arch_multiple");
6760 CmdArgs.push_back("-final_output");
6761 CmdArgs.push_back(LinkingOutput);
6762 }
6763
Daniel Dunbarc1964212009-03-26 16:23:12 +00006764 if (Args.hasArg(options::OPT_fnested_functions))
6765 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006766
Justin Bognerc7701242015-05-12 05:44:36 +00006767 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6768 // paths are different enough from other toolchains that this needs a fair
6769 // amount of refactoring done first.
6770 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6771
Daniel Dunbarc1964212009-03-26 16:23:12 +00006772 if (!Args.hasArg(options::OPT_nostdlib) &&
6773 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006774 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006775 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006776
Daniel Dunbarc1964212009-03-26 16:23:12 +00006777 // link_ssp spec is empty.
6778
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006779 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006780 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006781 }
6782
Chad Rosier06fd3c62012-05-16 23:45:12 +00006783 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006784 !Args.hasArg(options::OPT_nostartfiles)) {
6785 // endfile_spec is empty.
6786 }
6787
6788 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6789 Args.AddAllArgs(CmdArgs, options::OPT_F);
6790
Steven Wu3ffb61b2015-02-06 18:08:29 +00006791 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006792 for (const Arg *A : Args.filtered(options::OPT_iframework))
6793 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006794
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006795 if (!Args.hasArg(options::OPT_nostdlib) &&
6796 !Args.hasArg(options::OPT_nodefaultlibs)) {
6797 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6798 if (A->getValue() == StringRef("Accelerate")) {
6799 CmdArgs.push_back("-framework");
6800 CmdArgs.push_back("Accelerate");
6801 }
6802 }
6803 }
6804
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006805 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006806 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006807 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006808 Cmd->setInputFileList(std::move(InputFileList));
6809 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006810}
6811
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006812void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006813 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006814 const InputInfoList &Inputs,
6815 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006816 const char *LinkingOutput) const {
6817 ArgStringList CmdArgs;
6818
6819 CmdArgs.push_back("-create");
6820 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006821
6822 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006823 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006824
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006825 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006826 assert(II.isFilename() && "Unexpected lipo input.");
6827 CmdArgs.push_back(II.getFilename());
6828 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006829
6830 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006831 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006832}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006833
Daniel Dunbar88299622010-06-04 18:28:36 +00006834void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006835 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006836 const InputInfoList &Inputs,
6837 const ArgList &Args,
6838 const char *LinkingOutput) const {
6839 ArgStringList CmdArgs;
6840
Daniel Dunbareb86b042011-05-09 17:23:16 +00006841 CmdArgs.push_back("-o");
6842 CmdArgs.push_back(Output.getFilename());
6843
Daniel Dunbar88299622010-06-04 18:28:36 +00006844 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6845 const InputInfo &Input = Inputs[0];
6846 assert(Input.isFilename() && "Unexpected dsymutil input.");
6847 CmdArgs.push_back(Input.getFilename());
6848
Daniel Dunbar88299622010-06-04 18:28:36 +00006849 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006850 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006851 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006852}
6853
Eric Christopher551ef452011-08-23 17:56:55 +00006854void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006855 const InputInfo &Output,
6856 const InputInfoList &Inputs,
6857 const ArgList &Args,
6858 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006859 ArgStringList CmdArgs;
6860 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006861 CmdArgs.push_back("--debug-info");
6862 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006863 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006864
6865 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6866 const InputInfo &Input = Inputs[0];
6867 assert(Input.isFilename() && "Unexpected verify input");
6868
6869 // Grabbing the output of the earlier dsymutil run.
6870 CmdArgs.push_back(Input.getFilename());
6871
6872 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006873 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006874 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006875}
6876
Douglas Katzman95354292015-06-23 20:42:09 +00006877void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006878 const InputInfo &Output,
6879 const InputInfoList &Inputs,
6880 const ArgList &Args,
6881 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006882 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006883 ArgStringList CmdArgs;
6884
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006885 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006886
6887 CmdArgs.push_back("-o");
6888 CmdArgs.push_back(Output.getFilename());
6889
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006890 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006891 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006892
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006893 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006894 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006895}
6896
Douglas Katzman95354292015-06-23 20:42:09 +00006897void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6898 const InputInfo &Output,
6899 const InputInfoList &Inputs,
6900 const ArgList &Args,
6901 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006902 ArgStringList CmdArgs;
6903
David Chisnall272a0712012-02-29 15:06:12 +00006904 // Demangle C++ names in errors
6905 CmdArgs.push_back("-C");
6906
David Chisnallf571cde2012-02-15 13:39:01 +00006907 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6908 (!Args.hasArg(options::OPT_shared))) {
6909 CmdArgs.push_back("-e");
6910 CmdArgs.push_back("_start");
6911 }
6912
6913 if (Args.hasArg(options::OPT_static)) {
6914 CmdArgs.push_back("-Bstatic");
6915 CmdArgs.push_back("-dn");
6916 } else {
6917 CmdArgs.push_back("-Bdynamic");
6918 if (Args.hasArg(options::OPT_shared)) {
6919 CmdArgs.push_back("-shared");
6920 } else {
6921 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006922 CmdArgs.push_back(
6923 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006924 }
6925 }
6926
6927 if (Output.isFilename()) {
6928 CmdArgs.push_back("-o");
6929 CmdArgs.push_back(Output.getFilename());
6930 } else {
6931 assert(Output.isNothing() && "Invalid output.");
6932 }
6933
6934 if (!Args.hasArg(options::OPT_nostdlib) &&
6935 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006936 if (!Args.hasArg(options::OPT_shared))
6937 CmdArgs.push_back(
6938 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6939
6940 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6941 CmdArgs.push_back(
6942 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6943 CmdArgs.push_back(
6944 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6945
Hans Wennborg70850d82013-07-18 20:29:38 +00006946 if (getToolChain().getDriver().CCCIsCXX())
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006947 CmdArgs.push_back(
6948 Args.MakeArgString(getToolChain().GetFilePath("cxa_finalize.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006949 }
6950
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006951 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6952 for (const auto &Path : Paths)
6953 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006954
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006955 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6956 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006957
6958 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6959
6960 if (!Args.hasArg(options::OPT_nostdlib) &&
6961 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006962 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006963 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006964 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00006965 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006966 if (!Args.hasArg(options::OPT_shared)) {
6967 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00006968 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006969 }
David Chisnallf571cde2012-02-15 13:39:01 +00006970 }
6971
6972 if (!Args.hasArg(options::OPT_nostdlib) &&
6973 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006974 CmdArgs.push_back(
6975 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006976 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006977 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006978
Alexey Samsonov7811d192014-02-20 13:57:37 +00006979 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006980
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006981 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006982 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006983}
6984
Douglas Katzman95354292015-06-23 20:42:09 +00006985void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6986 const InputInfo &Output,
6987 const InputInfoList &Inputs,
6988 const ArgList &Args,
6989 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006990 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006991 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006992 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006993
Rafael Espindolacc126272014-02-28 01:55:21 +00006994 switch (getToolChain().getArch()) {
6995 case llvm::Triple::x86:
6996 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6997 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006998 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006999 break;
7000
7001 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007002 CmdArgs.push_back("-mppc");
7003 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007004 break;
7005
7006 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007007 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007008 CmdArgs.push_back("-32");
7009 NeedsKPIC = true;
7010 break;
7011
7012 case llvm::Triple::sparcv9:
7013 CmdArgs.push_back("-64");
7014 CmdArgs.push_back("-Av9a");
7015 NeedsKPIC = true;
7016 break;
7017
7018 case llvm::Triple::mips64:
7019 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007020 StringRef CPUName;
7021 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007022 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007023
7024 CmdArgs.push_back("-mabi");
7025 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7026
7027 if (getToolChain().getArch() == llvm::Triple::mips64)
7028 CmdArgs.push_back("-EB");
7029 else
7030 CmdArgs.push_back("-EL");
7031
Rafael Espindolacc126272014-02-28 01:55:21 +00007032 NeedsKPIC = true;
7033 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007034 }
7035
Rafael Espindolacc126272014-02-28 01:55:21 +00007036 default:
7037 break;
7038 }
7039
7040 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007041 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007042
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007043 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007044
7045 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007046 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007047
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007048 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007049 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007050
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007051 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007052 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007053}
7054
Douglas Katzman95354292015-06-23 20:42:09 +00007055void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7056 const InputInfo &Output,
7057 const InputInfoList &Inputs,
7058 const ArgList &Args,
7059 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007060 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007061 ArgStringList CmdArgs;
7062
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007063 // Silence warning for "clang -g foo.o -o foo"
7064 Args.ClaimAllArgs(options::OPT_g_Group);
7065 // and "clang -emit-llvm foo.o -o foo"
7066 Args.ClaimAllArgs(options::OPT_emit_llvm);
7067 // and for "clang -w foo.o -o foo". Other warning options are already
7068 // handled somewhere else.
7069 Args.ClaimAllArgs(options::OPT_w);
7070
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007071 if (getToolChain().getArch() == llvm::Triple::mips64)
7072 CmdArgs.push_back("-EB");
7073 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7074 CmdArgs.push_back("-EL");
7075
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007076 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007077 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007078 CmdArgs.push_back("-e");
7079 CmdArgs.push_back("__start");
7080 }
7081
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007082 if (Args.hasArg(options::OPT_static)) {
7083 CmdArgs.push_back("-Bstatic");
7084 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007085 if (Args.hasArg(options::OPT_rdynamic))
7086 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007087 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007088 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007089 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007090 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007091 } else {
7092 CmdArgs.push_back("-dynamic-linker");
7093 CmdArgs.push_back("/usr/libexec/ld.so");
7094 }
7095 }
7096
Rafael Espindola044f7832013-06-05 04:28:55 +00007097 if (Args.hasArg(options::OPT_nopie))
7098 CmdArgs.push_back("-nopie");
7099
Daniel Dunbarb440f562010-08-02 02:38:21 +00007100 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007101 CmdArgs.push_back("-o");
7102 CmdArgs.push_back(Output.getFilename());
7103 } else {
7104 assert(Output.isNothing() && "Invalid output.");
7105 }
7106
7107 if (!Args.hasArg(options::OPT_nostdlib) &&
7108 !Args.hasArg(options::OPT_nostartfiles)) {
7109 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007110 if (Args.hasArg(options::OPT_pg))
7111 CmdArgs.push_back(
7112 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007113 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007114 CmdArgs.push_back(
7115 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7116 CmdArgs.push_back(
7117 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007118 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007119 CmdArgs.push_back(
7120 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007121 }
7122 }
7123
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007124 std::string Triple = getToolChain().getTripleString();
7125 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007126 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007127 CmdArgs.push_back(
7128 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007129
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007130 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7131 options::OPT_e, options::OPT_s, options::OPT_t,
7132 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007133
Daniel Dunbar54423b22010-09-17 00:24:54 +00007134 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007135
7136 if (!Args.hasArg(options::OPT_nostdlib) &&
7137 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007138 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007139 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007140 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007141 CmdArgs.push_back("-lm_p");
7142 else
7143 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007144 }
7145
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007146 // FIXME: For some reason GCC passes -lgcc before adding
7147 // the default system libraries. Just mimic this for now.
7148 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007149
Eric Christopher17674ec2012-09-13 06:32:34 +00007150 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007151 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7152 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007153 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007154 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007155 }
7156
Chandler Carruth45661652011-12-17 22:32:42 +00007157 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007158 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007159 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007160 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007161 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007162 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007163
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007164 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007165 }
7166
7167 if (!Args.hasArg(options::OPT_nostdlib) &&
7168 !Args.hasArg(options::OPT_nostartfiles)) {
7169 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007170 CmdArgs.push_back(
7171 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007172 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007173 CmdArgs.push_back(
7174 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007175 }
7176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007177 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007178 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007179}
Ed Schoutene33194b2009-04-02 19:13:12 +00007180
Douglas Katzman95354292015-06-23 20:42:09 +00007181void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7182 const InputInfo &Output,
7183 const InputInfoList &Inputs,
7184 const ArgList &Args,
7185 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007186 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007187 ArgStringList CmdArgs;
7188
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007189 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007190
7191 CmdArgs.push_back("-o");
7192 CmdArgs.push_back(Output.getFilename());
7193
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007194 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007195 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007196
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007197 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007198 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007199}
7200
Douglas Katzman95354292015-06-23 20:42:09 +00007201void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7202 const InputInfo &Output,
7203 const InputInfoList &Inputs,
7204 const ArgList &Args,
7205 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007206 const Driver &D = getToolChain().getDriver();
7207 ArgStringList CmdArgs;
7208
7209 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7210 (!Args.hasArg(options::OPT_shared))) {
7211 CmdArgs.push_back("-e");
7212 CmdArgs.push_back("__start");
7213 }
7214
7215 if (Args.hasArg(options::OPT_static)) {
7216 CmdArgs.push_back("-Bstatic");
7217 } else {
7218 if (Args.hasArg(options::OPT_rdynamic))
7219 CmdArgs.push_back("-export-dynamic");
7220 CmdArgs.push_back("--eh-frame-hdr");
7221 CmdArgs.push_back("-Bdynamic");
7222 if (Args.hasArg(options::OPT_shared)) {
7223 CmdArgs.push_back("-shared");
7224 } else {
7225 CmdArgs.push_back("-dynamic-linker");
7226 CmdArgs.push_back("/usr/libexec/ld.so");
7227 }
7228 }
7229
7230 if (Output.isFilename()) {
7231 CmdArgs.push_back("-o");
7232 CmdArgs.push_back(Output.getFilename());
7233 } else {
7234 assert(Output.isNothing() && "Invalid output.");
7235 }
7236
7237 if (!Args.hasArg(options::OPT_nostdlib) &&
7238 !Args.hasArg(options::OPT_nostartfiles)) {
7239 if (!Args.hasArg(options::OPT_shared)) {
7240 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007241 CmdArgs.push_back(
7242 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007243 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007244 CmdArgs.push_back(
7245 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7246 CmdArgs.push_back(
7247 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007248 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007249 CmdArgs.push_back(
7250 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007251 }
7252 }
7253
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007254 Args.AddAllArgs(CmdArgs,
7255 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007256
7257 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7258
7259 if (!Args.hasArg(options::OPT_nostdlib) &&
7260 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007261 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007262 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7263 if (Args.hasArg(options::OPT_pg))
7264 CmdArgs.push_back("-lm_p");
7265 else
7266 CmdArgs.push_back("-lm");
7267 }
7268
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007269 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007270 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007271 CmdArgs.push_back("-lpthread_p");
7272 else
7273 CmdArgs.push_back("-lpthread");
7274 }
7275
Eli Friedman9fa28852012-08-08 23:57:20 +00007276 if (!Args.hasArg(options::OPT_shared)) {
7277 if (Args.hasArg(options::OPT_pg))
7278 CmdArgs.push_back("-lc_p");
7279 else
7280 CmdArgs.push_back("-lc");
7281 }
7282
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007283 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007284 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007285 case llvm::Triple::arm:
7286 MyArch = "arm";
7287 break;
7288 case llvm::Triple::x86:
7289 MyArch = "i386";
7290 break;
7291 case llvm::Triple::x86_64:
7292 MyArch = "amd64";
7293 break;
7294 default:
7295 llvm_unreachable("Unsupported architecture");
7296 }
7297 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007298 }
7299
7300 if (!Args.hasArg(options::OPT_nostdlib) &&
7301 !Args.hasArg(options::OPT_nostartfiles)) {
7302 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007303 CmdArgs.push_back(
7304 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007305 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007306 CmdArgs.push_back(
7307 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007308 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007310 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007311 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007312}
7313
Douglas Katzman95354292015-06-23 20:42:09 +00007314void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7315 const InputInfo &Output,
7316 const InputInfoList &Inputs,
7317 const ArgList &Args,
7318 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007319 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007320 ArgStringList CmdArgs;
7321
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007322 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7323 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007324 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007325 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007326 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007327 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007328 else if (getToolChain().getArch() == llvm::Triple::mips ||
7329 getToolChain().getArch() == llvm::Triple::mipsel ||
7330 getToolChain().getArch() == llvm::Triple::mips64 ||
7331 getToolChain().getArch() == llvm::Triple::mips64el) {
7332 StringRef CPUName;
7333 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007334 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007335
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007336 CmdArgs.push_back("-march");
7337 CmdArgs.push_back(CPUName.data());
7338
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007339 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007340 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007341
7342 if (getToolChain().getArch() == llvm::Triple::mips ||
7343 getToolChain().getArch() == llvm::Triple::mips64)
7344 CmdArgs.push_back("-EB");
7345 else
7346 CmdArgs.push_back("-EL");
7347
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007348 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007349 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007350 getToolChain().getArch() == llvm::Triple::armeb ||
7351 getToolChain().getArch() == llvm::Triple::thumb ||
7352 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007353 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007354 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007355 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7356
7357 if (FloatABI == "hard") {
7358 CmdArgs.push_back("-mfpu=vfp");
7359 } else {
7360 CmdArgs.push_back("-mfpu=softvfp");
7361 }
7362
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007363 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007364 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007365 case llvm::Triple::GNUEABI:
7366 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007367 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007368 break;
7369
7370 default:
7371 CmdArgs.push_back("-matpcs");
7372 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007373 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007374 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007375 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007376 if (getToolChain().getArch() == llvm::Triple::sparc)
7377 CmdArgs.push_back("-Av8plusa");
7378 else
7379 CmdArgs.push_back("-Av9a");
7380
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007381 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007382 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007383
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007384 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007385
7386 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007387 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007388
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007389 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007390 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007391
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007392 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007393 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007394}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007395
Douglas Katzman95354292015-06-23 20:42:09 +00007396void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7397 const InputInfo &Output,
7398 const InputInfoList &Inputs,
7399 const ArgList &Args,
7400 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007401 const toolchains::FreeBSD &ToolChain =
7402 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007403 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007404 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007405 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007406 !Args.hasArg(options::OPT_shared) &&
7407 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007408 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007409
7410 // Silence warning for "clang -g foo.o -o foo"
7411 Args.ClaimAllArgs(options::OPT_g_Group);
7412 // and "clang -emit-llvm foo.o -o foo"
7413 Args.ClaimAllArgs(options::OPT_emit_llvm);
7414 // and for "clang -w foo.o -o foo". Other warning options are already
7415 // handled somewhere else.
7416 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007417
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007418 if (!D.SysRoot.empty())
7419 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7420
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007421 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007422 CmdArgs.push_back("-pie");
7423
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007424 if (Args.hasArg(options::OPT_static)) {
7425 CmdArgs.push_back("-Bstatic");
7426 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007427 if (Args.hasArg(options::OPT_rdynamic))
7428 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007429 CmdArgs.push_back("--eh-frame-hdr");
7430 if (Args.hasArg(options::OPT_shared)) {
7431 CmdArgs.push_back("-Bshareable");
7432 } else {
7433 CmdArgs.push_back("-dynamic-linker");
7434 CmdArgs.push_back("/libexec/ld-elf.so.1");
7435 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007436 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007437 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7438 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7439 CmdArgs.push_back("--hash-style=both");
7440 }
7441 }
7442 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007443 }
7444
7445 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7446 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007447 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007448 CmdArgs.push_back("-m");
7449 CmdArgs.push_back("elf_i386_fbsd");
7450 }
7451
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007452 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007453 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007454 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007455 }
7456
Daniel Dunbarb440f562010-08-02 02:38:21 +00007457 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007458 CmdArgs.push_back("-o");
7459 CmdArgs.push_back(Output.getFilename());
7460 } else {
7461 assert(Output.isNothing() && "Invalid output.");
7462 }
7463
7464 if (!Args.hasArg(options::OPT_nostdlib) &&
7465 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007466 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007467 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007468 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007469 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007470 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007471 crt1 = "Scrt1.o";
7472 else
7473 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007474 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007475 if (crt1)
7476 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7477
7478 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7479
Craig Topper92fc2df2014-05-17 16:56:41 +00007480 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007481 if (Args.hasArg(options::OPT_static))
7482 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007483 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007484 crtbegin = "crtbeginS.o";
7485 else
7486 crtbegin = "crtbegin.o";
7487
7488 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007489 }
7490
7491 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007492 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007493 for (const auto &Path : Paths)
7494 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007495 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7496 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007497 Args.AddAllArgs(CmdArgs, options::OPT_s);
7498 Args.AddAllArgs(CmdArgs, options::OPT_t);
7499 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7500 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007501
Alexey Samsonov907880e2015-06-19 19:57:46 +00007502 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007503 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007504
Alexey Samsonov52550342014-09-15 19:58:40 +00007505 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007506 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007507
7508 if (!Args.hasArg(options::OPT_nostdlib) &&
7509 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007510 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007511 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007512 if (Args.hasArg(options::OPT_pg))
7513 CmdArgs.push_back("-lm_p");
7514 else
7515 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007516 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007517 if (NeedsSanitizerDeps)
7518 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007519 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7520 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007521 if (Args.hasArg(options::OPT_pg))
7522 CmdArgs.push_back("-lgcc_p");
7523 else
7524 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007525 if (Args.hasArg(options::OPT_static)) {
7526 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007527 } else if (Args.hasArg(options::OPT_pg)) {
7528 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007529 } else {
7530 CmdArgs.push_back("--as-needed");
7531 CmdArgs.push_back("-lgcc_s");
7532 CmdArgs.push_back("--no-as-needed");
7533 }
7534
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007535 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007536 if (Args.hasArg(options::OPT_pg))
7537 CmdArgs.push_back("-lpthread_p");
7538 else
7539 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007540 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007541
Roman Divacky66f22762011-02-10 16:59:40 +00007542 if (Args.hasArg(options::OPT_pg)) {
7543 if (Args.hasArg(options::OPT_shared))
7544 CmdArgs.push_back("-lc");
7545 else
7546 CmdArgs.push_back("-lc_p");
7547 CmdArgs.push_back("-lgcc_p");
7548 } else {
7549 CmdArgs.push_back("-lc");
7550 CmdArgs.push_back("-lgcc");
7551 }
7552
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007553 if (Args.hasArg(options::OPT_static)) {
7554 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007555 } else if (Args.hasArg(options::OPT_pg)) {
7556 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007557 } else {
7558 CmdArgs.push_back("--as-needed");
7559 CmdArgs.push_back("-lgcc_s");
7560 CmdArgs.push_back("--no-as-needed");
7561 }
7562 }
7563
7564 if (!Args.hasArg(options::OPT_nostdlib) &&
7565 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007566 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007567 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007568 else
7569 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007570 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007571 }
7572
Alexey Samsonov7811d192014-02-20 13:57:37 +00007573 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007574
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007575 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007576 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007577}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007578
Douglas Katzman95354292015-06-23 20:42:09 +00007579void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007580 const InputInfo &Output,
7581 const InputInfoList &Inputs,
7582 const ArgList &Args,
7583 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007584 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007585 ArgStringList CmdArgs;
7586
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007587 // GNU as needs different flags for creating the correct output format
7588 // on architectures with different ABIs or optional feature sets.
7589 switch (getToolChain().getArch()) {
7590 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007591 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007592 break;
7593 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007594 case llvm::Triple::armeb:
7595 case llvm::Triple::thumb:
7596 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007597 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007598 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7599 std::string Arch =
7600 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007601 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007602 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007603 }
7604
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007605 case llvm::Triple::mips:
7606 case llvm::Triple::mipsel:
7607 case llvm::Triple::mips64:
7608 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007609 StringRef CPUName;
7610 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007611 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007612
7613 CmdArgs.push_back("-march");
7614 CmdArgs.push_back(CPUName.data());
7615
7616 CmdArgs.push_back("-mabi");
7617 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7618
7619 if (getToolChain().getArch() == llvm::Triple::mips ||
7620 getToolChain().getArch() == llvm::Triple::mips64)
7621 CmdArgs.push_back("-EB");
7622 else
7623 CmdArgs.push_back("-EL");
7624
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007625 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007626 break;
7627 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007628
7629 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007630 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007631 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007632 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007633 break;
7634
7635 case llvm::Triple::sparcv9:
7636 CmdArgs.push_back("-64");
7637 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007638 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007639 break;
7640
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007641 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007642 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007643 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007644
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007645 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007646
7647 CmdArgs.push_back("-o");
7648 CmdArgs.push_back(Output.getFilename());
7649
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007650 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007651 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007652
David Chisnallddbd68f2011-09-27 22:03:18 +00007653 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007654 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007655}
7656
Douglas Katzman95354292015-06-23 20:42:09 +00007657void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7658 const InputInfo &Output,
7659 const InputInfoList &Inputs,
7660 const ArgList &Args,
7661 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007662 const Driver &D = getToolChain().getDriver();
7663 ArgStringList CmdArgs;
7664
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007665 if (!D.SysRoot.empty())
7666 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7667
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007668 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007669 if (Args.hasArg(options::OPT_static)) {
7670 CmdArgs.push_back("-Bstatic");
7671 } else {
7672 if (Args.hasArg(options::OPT_rdynamic))
7673 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007674 if (Args.hasArg(options::OPT_shared)) {
7675 CmdArgs.push_back("-Bshareable");
7676 } else {
7677 CmdArgs.push_back("-dynamic-linker");
7678 CmdArgs.push_back("/libexec/ld.elf_so");
7679 }
7680 }
7681
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007682 // Many NetBSD architectures support more than one ABI.
7683 // Determine the correct emulation for ld.
7684 switch (getToolChain().getArch()) {
7685 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007686 CmdArgs.push_back("-m");
7687 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007688 break;
7689 case llvm::Triple::arm:
7690 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007691 CmdArgs.push_back("-m");
7692 switch (getToolChain().getTriple().getEnvironment()) {
7693 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007694 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007695 CmdArgs.push_back("armelf_nbsd_eabi");
7696 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007697 case llvm::Triple::EABIHF:
7698 case llvm::Triple::GNUEABIHF:
7699 CmdArgs.push_back("armelf_nbsd_eabihf");
7700 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007701 default:
7702 CmdArgs.push_back("armelf_nbsd");
7703 break;
7704 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007705 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007706 case llvm::Triple::armeb:
7707 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007708 arm::appendEBLinkFlags(
7709 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007710 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007711 CmdArgs.push_back("-m");
7712 switch (getToolChain().getTriple().getEnvironment()) {
7713 case llvm::Triple::EABI:
7714 case llvm::Triple::GNUEABI:
7715 CmdArgs.push_back("armelfb_nbsd_eabi");
7716 break;
7717 case llvm::Triple::EABIHF:
7718 case llvm::Triple::GNUEABIHF:
7719 CmdArgs.push_back("armelfb_nbsd_eabihf");
7720 break;
7721 default:
7722 CmdArgs.push_back("armelfb_nbsd");
7723 break;
7724 }
7725 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007726 case llvm::Triple::mips64:
7727 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007728 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007729 CmdArgs.push_back("-m");
7730 if (getToolChain().getArch() == llvm::Triple::mips64)
7731 CmdArgs.push_back("elf32btsmip");
7732 else
7733 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007734 } else if (mips::hasMipsAbiArg(Args, "64")) {
7735 CmdArgs.push_back("-m");
7736 if (getToolChain().getArch() == llvm::Triple::mips64)
7737 CmdArgs.push_back("elf64btsmip");
7738 else
7739 CmdArgs.push_back("elf64ltsmip");
7740 }
7741 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007742 case llvm::Triple::ppc:
7743 CmdArgs.push_back("-m");
7744 CmdArgs.push_back("elf32ppc_nbsd");
7745 break;
7746
7747 case llvm::Triple::ppc64:
7748 case llvm::Triple::ppc64le:
7749 CmdArgs.push_back("-m");
7750 CmdArgs.push_back("elf64ppc");
7751 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007752
7753 case llvm::Triple::sparc:
7754 CmdArgs.push_back("-m");
7755 CmdArgs.push_back("elf32_sparc");
7756 break;
7757
7758 case llvm::Triple::sparcv9:
7759 CmdArgs.push_back("-m");
7760 CmdArgs.push_back("elf64_sparc");
7761 break;
7762
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007763 default:
7764 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007765 }
7766
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007767 if (Output.isFilename()) {
7768 CmdArgs.push_back("-o");
7769 CmdArgs.push_back(Output.getFilename());
7770 } else {
7771 assert(Output.isNothing() && "Invalid output.");
7772 }
7773
7774 if (!Args.hasArg(options::OPT_nostdlib) &&
7775 !Args.hasArg(options::OPT_nostartfiles)) {
7776 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007777 CmdArgs.push_back(
7778 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7779 CmdArgs.push_back(
7780 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7781 CmdArgs.push_back(
7782 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007783 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007784 CmdArgs.push_back(
7785 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7786 CmdArgs.push_back(
7787 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007788 }
7789 }
7790
7791 Args.AddAllArgs(CmdArgs, options::OPT_L);
7792 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7793 Args.AddAllArgs(CmdArgs, options::OPT_e);
7794 Args.AddAllArgs(CmdArgs, options::OPT_s);
7795 Args.AddAllArgs(CmdArgs, options::OPT_t);
7796 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7797 Args.AddAllArgs(CmdArgs, options::OPT_r);
7798
7799 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7800
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007801 unsigned Major, Minor, Micro;
7802 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7803 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007804 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007805 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007806 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007807 case llvm::Triple::arm:
7808 case llvm::Triple::armeb:
7809 case llvm::Triple::thumb:
7810 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007811 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007812 case llvm::Triple::ppc64:
7813 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007814 case llvm::Triple::x86:
7815 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007816 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007817 break;
7818 default:
7819 break;
7820 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007821 }
7822
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007823 if (!Args.hasArg(options::OPT_nostdlib) &&
7824 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007825 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007826 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7827 CmdArgs.push_back("-lm");
7828 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007829 if (Args.hasArg(options::OPT_pthread))
7830 CmdArgs.push_back("-lpthread");
7831 CmdArgs.push_back("-lc");
7832
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007833 if (useLibgcc) {
7834 if (Args.hasArg(options::OPT_static)) {
7835 // libgcc_eh depends on libc, so resolve as much as possible,
7836 // pull in any new requirements from libc and then get the rest
7837 // of libgcc.
7838 CmdArgs.push_back("-lgcc_eh");
7839 CmdArgs.push_back("-lc");
7840 CmdArgs.push_back("-lgcc");
7841 } else {
7842 CmdArgs.push_back("-lgcc");
7843 CmdArgs.push_back("--as-needed");
7844 CmdArgs.push_back("-lgcc_s");
7845 CmdArgs.push_back("--no-as-needed");
7846 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007847 }
7848 }
7849
7850 if (!Args.hasArg(options::OPT_nostdlib) &&
7851 !Args.hasArg(options::OPT_nostartfiles)) {
7852 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007853 CmdArgs.push_back(
7854 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007855 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007856 CmdArgs.push_back(
7857 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7858 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007859 }
7860
Alexey Samsonov7811d192014-02-20 13:57:37 +00007861 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007862
Logan Chieneb9162f2014-06-26 14:23:45 +00007863 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007864 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007865}
7866
Douglas Katzman95354292015-06-23 20:42:09 +00007867void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7868 const InputInfo &Output,
7869 const InputInfoList &Inputs,
7870 const ArgList &Args,
7871 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007872 claimNoWarnArgs(Args);
7873
James Y Knight2db38f32015-08-15 03:45:25 +00007874 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7875 llvm::Triple Triple = llvm::Triple(TripleStr);
7876
Rafael Espindola92b00932010-08-10 00:25:48 +00007877 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007878 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007879
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007880 llvm::Reloc::Model RelocationModel;
7881 unsigned PICLevel;
7882 bool IsPIE;
7883 std::tie(RelocationModel, PICLevel, IsPIE) =
7884 ParsePICArgs(getToolChain(), Triple, Args);
7885
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007886 switch (getToolChain().getArch()) {
7887 default:
7888 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007889 // Add --32/--64 to make sure we get the format we want.
7890 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007891 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007892 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007893 break;
7894 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007895 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7896 CmdArgs.push_back("--x32");
7897 else
7898 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007899 break;
7900 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007901 CmdArgs.push_back("-a32");
7902 CmdArgs.push_back("-mppc");
7903 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007904 break;
7905 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007906 CmdArgs.push_back("-a64");
7907 CmdArgs.push_back("-mppc64");
7908 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007909 break;
7910 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007911 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007912 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007913 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007914 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007915 break;
7916 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007917 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007918 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007919 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007920 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007921 break;
7922 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007923 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007924 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007925 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007926 break;
7927 case llvm::Triple::arm:
7928 case llvm::Triple::armeb:
7929 case llvm::Triple::thumb:
7930 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007931 const llvm::Triple &Triple2 = getToolChain().getTriple();
7932 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007933 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007934 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007935 break;
7936 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007937 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007938 break;
7939 default:
7940 break;
7941 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007942
James Y Knight2db38f32015-08-15 03:45:25 +00007943 StringRef ARMFloatABI =
7944 tools::arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple);
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007945 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007946
7947 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007948
7949 // FIXME: remove krait check when GNU tools support krait cpu
7950 // for now replace it with -march=armv7-a to avoid a lower
7951 // march from being picked in the absence of a cpu flag.
7952 Arg *A;
7953 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007954 StringRef(A->getValue()).lower() == "krait")
7955 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007956 else
7957 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007958 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007959 break;
7960 }
7961 case llvm::Triple::mips:
7962 case llvm::Triple::mipsel:
7963 case llvm::Triple::mips64:
7964 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007965 StringRef CPUName;
7966 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007967 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007968 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007969
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007970 CmdArgs.push_back("-march");
7971 CmdArgs.push_back(CPUName.data());
7972
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007973 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007974 CmdArgs.push_back(ABIName.data());
7975
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007976 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7977 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007978 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007979 CmdArgs.push_back("-mno-shared");
7980
Daniel Sanders379d44b2014-07-16 11:52:23 +00007981 // LLVM doesn't support -mplt yet and acts as if it is always given.
7982 // However, -mplt has no effect with the N64 ABI.
7983 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007984
7985 if (getToolChain().getArch() == llvm::Triple::mips ||
7986 getToolChain().getArch() == llvm::Triple::mips64)
7987 CmdArgs.push_back("-EB");
7988 else
7989 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007990
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007991 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7992 if (StringRef(A->getValue()) == "2008")
7993 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7994 }
7995
Daniel Sanders379d44b2014-07-16 11:52:23 +00007996 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007997 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007998 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7999 options::OPT_mfp64)) {
8000 A->claim();
8001 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00008002 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
8003 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008004 CmdArgs.push_back("-mfpxx");
8005
8006 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8007 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008008 if (Arg *A =
8009 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008010 if (A->getOption().matches(options::OPT_mips16)) {
8011 A->claim();
8012 A->render(Args, CmdArgs);
8013 } else {
8014 A->claim();
8015 CmdArgs.push_back("-no-mips16");
8016 }
8017 }
8018
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008019 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8020 options::OPT_mno_micromips);
8021 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8022 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8023
Simon Atanasyanbd986632013-11-26 11:58:04 +00008024 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8025 // Do not use AddLastArg because not all versions of MIPS assembler
8026 // support -mmsa / -mno-msa options.
8027 if (A->getOption().matches(options::OPT_mmsa))
8028 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8029 }
8030
Daniel Sanders379d44b2014-07-16 11:52:23 +00008031 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8032 options::OPT_msoft_float);
8033
Toma Tabacub36d6102015-06-11 12:13:18 +00008034 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8035 options::OPT_msingle_float);
8036
Daniel Sanders379d44b2014-07-16 11:52:23 +00008037 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8038 options::OPT_mno_odd_spreg);
8039
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008040 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008041 break;
8042 }
8043 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008044 // Always pass an -march option, since our default of z10 is later
8045 // than the GNU assembler's default.
8046 StringRef CPUName = getSystemZTargetCPU(Args);
8047 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008048 break;
8049 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008050 }
8051
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008052 if (NeedsKPIC) {
8053 if (RelocationModel != llvm::Reloc::Static)
8054 CmdArgs.push_back("-KPIC");
8055 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008056
Renato Golina74bbc72015-07-22 15:32:36 +00008057 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008058 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008059
8060 CmdArgs.push_back("-o");
8061 CmdArgs.push_back(Output.getFilename());
8062
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008063 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008064 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008065
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008066 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008067 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008068
8069 // Handle the debug info splitting at object creation time if we're
8070 // creating an object.
8071 // TODO: Currently only works on linux with newer objcopy.
8072 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008073 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008074 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008075 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008076}
8077
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008078static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008079 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008080 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008081 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008082 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8083 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008084 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008085 CmdArgs.push_back("-lgcc");
8086
Logan Chien3d3373c2012-11-19 12:04:11 +00008087 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008088 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008089 CmdArgs.push_back("-lgcc");
8090 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008091 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008092 CmdArgs.push_back("--as-needed");
8093 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008094 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008095 CmdArgs.push_back("--no-as-needed");
8096 }
8097
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008098 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008099 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008100 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008101 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008102
8103 // According to Android ABI, we have to link with libdl if we are
8104 // linking with non-static libgcc.
8105 //
8106 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8107 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8108 if (isAndroid && !StaticLibgcc)
8109 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008110}
8111
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008112static std::string getLinuxDynamicLinker(const ArgList &Args,
8113 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008114 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8115
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008116 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8117 if (ToolChain.getTriple().isArch64Bit())
8118 return "/system/bin/linker64";
8119 else
8120 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008121 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8122 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008123 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008124 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008125 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008126 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008127 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008128 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008129 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8130 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008131 return "/lib/ld-linux-armhf.so.3";
8132 else
8133 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008134 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8135 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008136 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8137 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008138 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008139 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008140 return "/lib/ld-linux.so.3";
8141 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8142 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008143 StringRef CPUName;
8144 StringRef ABIName;
8145 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8146 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8147
8148 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8149 .Case("o32", "/lib")
8150 .Case("n32", "/lib32")
8151 .Case("n64", "/lib64")
8152 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008153 StringRef LibName;
8154 if (mips::isUCLibc(Args))
8155 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8156 else
8157 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008158
8159 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008160 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008161 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008162 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008163 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8164 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008165 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008166 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008167 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8168 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008169 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008170 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008171 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008172 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008173 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008174 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008175 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8176 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008177 else
8178 return "/lib64/ld-linux-x86-64.so.2";
8179}
8180
Renato Golinc4b49242014-02-13 10:01:16 +00008181static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008182 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008183 // Make use of compiler-rt if --rtlib option is used
8184 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8185
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008186 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008187 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008188 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008189 default:
8190 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008191 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008192 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008193 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008194 break;
8195 }
Renato Golinc4b49242014-02-13 10:01:16 +00008196 break;
8197 case ToolChain::RLT_Libgcc:
8198 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8199 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008200 }
8201}
8202
Rafael Espindola1e085772014-08-15 17:14:35 +00008203static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8204 switch (T.getArch()) {
8205 case llvm::Triple::x86:
8206 return "elf_i386";
8207 case llvm::Triple::aarch64:
8208 return "aarch64linux";
8209 case llvm::Triple::aarch64_be:
8210 return "aarch64_be_linux";
8211 case llvm::Triple::arm:
8212 case llvm::Triple::thumb:
8213 return "armelf_linux_eabi";
8214 case llvm::Triple::armeb:
8215 case llvm::Triple::thumbeb:
8216 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8217 case llvm::Triple::ppc:
8218 return "elf32ppclinux";
8219 case llvm::Triple::ppc64:
8220 return "elf64ppc";
8221 case llvm::Triple::ppc64le:
8222 return "elf64lppc";
8223 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008224 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008225 return "elf32_sparc";
8226 case llvm::Triple::sparcv9:
8227 return "elf64_sparc";
8228 case llvm::Triple::mips:
8229 return "elf32btsmip";
8230 case llvm::Triple::mipsel:
8231 return "elf32ltsmip";
8232 case llvm::Triple::mips64:
8233 if (mips::hasMipsAbiArg(Args, "n32"))
8234 return "elf32btsmipn32";
8235 return "elf64btsmip";
8236 case llvm::Triple::mips64el:
8237 if (mips::hasMipsAbiArg(Args, "n32"))
8238 return "elf32ltsmipn32";
8239 return "elf64ltsmip";
8240 case llvm::Triple::systemz:
8241 return "elf64_s390";
8242 case llvm::Triple::x86_64:
8243 if (T.getEnvironment() == llvm::Triple::GNUX32)
8244 return "elf32_x86_64";
8245 return "elf_x86_64";
8246 default:
8247 llvm_unreachable("Unexpected arch");
8248 }
8249}
8250
Douglas Katzman95354292015-06-23 20:42:09 +00008251void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8252 const InputInfo &Output,
8253 const InputInfoList &Inputs,
8254 const ArgList &Args,
8255 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008256 const toolchains::Linux &ToolChain =
8257 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008258 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008259
8260 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8261 llvm::Triple Triple = llvm::Triple(TripleStr);
8262
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008263 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008264 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008265 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008266 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008267 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8268 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008269
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008270 ArgStringList CmdArgs;
8271
Rafael Espindolad1002f62010-11-15 18:28:16 +00008272 // Silence warning for "clang -g foo.o -o foo"
8273 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008274 // and "clang -emit-llvm foo.o -o foo"
8275 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008276 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008277 // handled somewhere else.
8278 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008279
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008280 if (!D.SysRoot.empty())
8281 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008282
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008283 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008284 CmdArgs.push_back("-pie");
8285
Rafael Espindola1c76c592010-11-07 22:57:16 +00008286 if (Args.hasArg(options::OPT_rdynamic))
8287 CmdArgs.push_back("-export-dynamic");
8288
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008289 if (Args.hasArg(options::OPT_s))
8290 CmdArgs.push_back("-s");
8291
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008292 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008293 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008294
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008295 for (const auto &Opt : ToolChain.ExtraOpts)
8296 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008297
8298 if (!Args.hasArg(options::OPT_static)) {
8299 CmdArgs.push_back("--eh-frame-hdr");
8300 }
8301
8302 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008303 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008304
8305 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008306 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8307 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008308 CmdArgs.push_back("-Bstatic");
8309 else
8310 CmdArgs.push_back("-static");
8311 } else if (Args.hasArg(options::OPT_shared)) {
8312 CmdArgs.push_back("-shared");
8313 }
8314
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008315 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8316 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008317 (!Args.hasArg(options::OPT_static) &&
8318 !Args.hasArg(options::OPT_shared))) {
8319 CmdArgs.push_back("-dynamic-linker");
8320 CmdArgs.push_back(Args.MakeArgString(
8321 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8322 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008323
8324 CmdArgs.push_back("-o");
8325 CmdArgs.push_back(Output.getFilename());
8326
Rafael Espindola81937ec2010-12-01 01:52:43 +00008327 if (!Args.hasArg(options::OPT_nostdlib) &&
8328 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008329 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008330 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008331 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008332 if (Args.hasArg(options::OPT_pg))
8333 crt1 = "gcrt1.o";
8334 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008335 crt1 = "Scrt1.o";
8336 else
8337 crt1 = "crt1.o";
8338 }
8339 if (crt1)
8340 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008341
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008342 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8343 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008344
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008345 const char *crtbegin;
8346 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008347 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008348 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008349 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008350 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008351 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008352 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008353 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008354 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008355
8356 // Add crtfastmath.o if available and fast math is enabled.
8357 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008358 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008359
8360 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008361 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008362
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008363 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008364
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008365 for (const auto &Path : Paths)
8366 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008367
Alexey Samsonov907880e2015-06-19 19:57:46 +00008368 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008369 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008370
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008371 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8372 CmdArgs.push_back("--no-demangle");
8373
Alexey Samsonov52550342014-09-15 19:58:40 +00008374 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008375 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008376 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008377 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008378
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008379 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008380 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008381 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008382 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008383 if (OnlyLibstdcxxStatic)
8384 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008385 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008386 if (OnlyLibstdcxxStatic)
8387 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008388 CmdArgs.push_back("-lm");
8389 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008390 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8391 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008392
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008393 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008394 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8395 if (Args.hasArg(options::OPT_static))
8396 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008397
Alexey Samsonov52550342014-09-15 19:58:40 +00008398 if (NeedsSanitizerDeps)
8399 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8400
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008401 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8402 Args.hasArg(options::OPT_pthreads);
8403
8404 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8405 options::OPT_fno_openmp, false)) {
8406 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8407 // FIXME: Does this really make sense for all GNU toolchains?
8408 WantPthread = true;
8409
8410 // Also link the particular OpenMP runtimes.
8411 switch (getOpenMPRuntime(ToolChain, Args)) {
8412 case OMPRT_OMP:
8413 CmdArgs.push_back("-lomp");
8414 break;
8415 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008416 CmdArgs.push_back("-lgomp");
8417
8418 // FIXME: Exclude this for platforms with libgomp that don't require
8419 // librt. Most modern Linux platforms require it, but some may not.
8420 CmdArgs.push_back("-lrt");
8421 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008422 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008423 CmdArgs.push_back("-liomp5");
8424 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008425 case OMPRT_Unknown:
8426 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008427 break;
8428 }
Chandler Carruth01538002013-01-17 13:19:29 +00008429 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008430
Renato Golinc4b49242014-02-13 10:01:16 +00008431 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008432
Richard Smith31d1de22015-05-20 22:48:44 +00008433 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008434 CmdArgs.push_back("-lpthread");
8435
8436 CmdArgs.push_back("-lc");
8437
8438 if (Args.hasArg(options::OPT_static))
8439 CmdArgs.push_back("--end-group");
8440 else
Renato Golinc4b49242014-02-13 10:01:16 +00008441 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008442 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008443
Rafael Espindola81937ec2010-12-01 01:52:43 +00008444 if (!Args.hasArg(options::OPT_nostartfiles)) {
8445 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008446 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008447 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008448 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008449 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008450 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008451 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008452
Rafael Espindola81937ec2010-12-01 01:52:43 +00008453 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008454 if (!isAndroid)
8455 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008456 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008457 }
8458
Justin Bognerd3371d82015-07-17 03:35:54 +00008459 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8460 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008461}
8462
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008463// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8464// for the various SFI requirements like register masking. The assembly tool
8465// inserts the file containing the macros as an input into all the assembly
8466// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008467void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8468 const InputInfo &Output,
8469 const InputInfoList &Inputs,
8470 const ArgList &Args,
8471 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008472 const toolchains::NaClToolChain &ToolChain =
8473 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008474 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8475 "nacl-arm-macros.s");
8476 InputInfoList NewInputs;
8477 NewInputs.push_back(NaClMacros);
8478 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008479 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8480 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008481}
8482
Douglas Katzman750cfc52015-06-29 18:42:16 +00008483// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008484// we use static by default, do not yet support sanitizers or LTO, and a few
8485// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008486// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008487void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8488 const InputInfo &Output,
8489 const InputInfoList &Inputs,
8490 const ArgList &Args,
8491 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008492
Douglas Katzman54366072015-07-27 16:53:08 +00008493 const toolchains::NaClToolChain &ToolChain =
8494 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008495 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008496 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008497 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008498 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008499
8500 ArgStringList CmdArgs;
8501
8502 // Silence warning for "clang -g foo.o -o foo"
8503 Args.ClaimAllArgs(options::OPT_g_Group);
8504 // and "clang -emit-llvm foo.o -o foo"
8505 Args.ClaimAllArgs(options::OPT_emit_llvm);
8506 // and for "clang -w foo.o -o foo". Other warning options are already
8507 // handled somewhere else.
8508 Args.ClaimAllArgs(options::OPT_w);
8509
8510 if (!D.SysRoot.empty())
8511 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8512
8513 if (Args.hasArg(options::OPT_rdynamic))
8514 CmdArgs.push_back("-export-dynamic");
8515
8516 if (Args.hasArg(options::OPT_s))
8517 CmdArgs.push_back("-s");
8518
Douglas Katzman54366072015-07-27 16:53:08 +00008519 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8520 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008521 CmdArgs.push_back("--build-id");
8522
8523 if (!IsStatic)
8524 CmdArgs.push_back("--eh-frame-hdr");
8525
8526 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008527 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008528 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008529 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008530 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008531 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008532 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008533 else if (Arch == llvm::Triple::mipsel)
8534 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008535 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008536 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8537 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008538
8539 if (IsStatic)
8540 CmdArgs.push_back("-static");
8541 else if (Args.hasArg(options::OPT_shared))
8542 CmdArgs.push_back("-shared");
8543
8544 CmdArgs.push_back("-o");
8545 CmdArgs.push_back(Output.getFilename());
8546 if (!Args.hasArg(options::OPT_nostdlib) &&
8547 !Args.hasArg(options::OPT_nostartfiles)) {
8548 if (!Args.hasArg(options::OPT_shared))
8549 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8550 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8551
8552 const char *crtbegin;
8553 if (IsStatic)
8554 crtbegin = "crtbeginT.o";
8555 else if (Args.hasArg(options::OPT_shared))
8556 crtbegin = "crtbeginS.o";
8557 else
8558 crtbegin = "crtbegin.o";
8559 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8560 }
8561
8562 Args.AddAllArgs(CmdArgs, options::OPT_L);
8563 Args.AddAllArgs(CmdArgs, options::OPT_u);
8564
8565 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8566
8567 for (const auto &Path : Paths)
8568 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8569
8570 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8571 CmdArgs.push_back("--no-demangle");
8572
8573 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8574
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008575 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008576 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008577 bool OnlyLibstdcxxStatic =
8578 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008579 if (OnlyLibstdcxxStatic)
8580 CmdArgs.push_back("-Bstatic");
8581 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8582 if (OnlyLibstdcxxStatic)
8583 CmdArgs.push_back("-Bdynamic");
8584 CmdArgs.push_back("-lm");
8585 }
8586
8587 if (!Args.hasArg(options::OPT_nostdlib)) {
8588 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8589 // Always use groups, since it has no effect on dynamic libraries.
8590 CmdArgs.push_back("--start-group");
8591 CmdArgs.push_back("-lc");
8592 // NaCl's libc++ currently requires libpthread, so just always include it
8593 // in the group for C++.
8594 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008595 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008596 // Gold, used by Mips, handles nested groups differently than ld, and
8597 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8598 // which is not a desired behaviour here.
8599 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8600 if (getToolChain().getArch() == llvm::Triple::mipsel)
8601 CmdArgs.push_back("-lnacl");
8602
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008603 CmdArgs.push_back("-lpthread");
8604 }
8605
8606 CmdArgs.push_back("-lgcc");
8607 CmdArgs.push_back("--as-needed");
8608 if (IsStatic)
8609 CmdArgs.push_back("-lgcc_eh");
8610 else
8611 CmdArgs.push_back("-lgcc_s");
8612 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008613
8614 // Mips needs to create and use pnacl_legacy library that contains
8615 // definitions from bitcode/pnaclmm.c and definitions for
8616 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8617 if (getToolChain().getArch() == llvm::Triple::mipsel)
8618 CmdArgs.push_back("-lpnacl_legacy");
8619
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008620 CmdArgs.push_back("--end-group");
8621 }
8622
8623 if (!Args.hasArg(options::OPT_nostartfiles)) {
8624 const char *crtend;
8625 if (Args.hasArg(options::OPT_shared))
8626 crtend = "crtendS.o";
8627 else
8628 crtend = "crtend.o";
8629
8630 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8631 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8632 }
8633 }
8634
Justin Bognerd3371d82015-07-17 03:35:54 +00008635 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8636 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008637}
8638
Douglas Katzman95354292015-06-23 20:42:09 +00008639void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8640 const InputInfo &Output,
8641 const InputInfoList &Inputs,
8642 const ArgList &Args,
8643 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008644 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008645 ArgStringList CmdArgs;
8646
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008647 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008648
8649 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008650 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008651
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008652 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008653 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008654
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008655 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008656 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008657}
8658
Douglas Katzman95354292015-06-23 20:42:09 +00008659void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8660 const InputInfo &Output,
8661 const InputInfoList &Inputs,
8662 const ArgList &Args,
8663 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008664 const Driver &D = getToolChain().getDriver();
8665 ArgStringList CmdArgs;
8666
Daniel Dunbarb440f562010-08-02 02:38:21 +00008667 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008668 CmdArgs.push_back("-o");
8669 CmdArgs.push_back(Output.getFilename());
8670 } else {
8671 assert(Output.isNothing() && "Invalid output.");
8672 }
8673
8674 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008675 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008676 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8677 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8678 CmdArgs.push_back(
8679 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8680 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008681 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008682
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008683 Args.AddAllArgs(CmdArgs,
8684 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008685
Daniel Dunbar54423b22010-09-17 00:24:54 +00008686 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008687
Alexey Samsonov7811d192014-02-20 13:57:37 +00008688 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008689
Chris Lattner3e2ee142010-07-07 16:01:42 +00008690 if (!Args.hasArg(options::OPT_nostdlib) &&
8691 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008692 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008693 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008694 CmdArgs.push_back("-lm");
8695 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008696 }
8697
8698 if (!Args.hasArg(options::OPT_nostdlib) &&
8699 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008700 if (Args.hasArg(options::OPT_pthread))
8701 CmdArgs.push_back("-lpthread");
8702 CmdArgs.push_back("-lc");
8703 CmdArgs.push_back("-lCompilerRT-Generic");
8704 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8705 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008706 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008707 }
8708
Logan Chieneb9162f2014-06-26 14:23:45 +00008709 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008710 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008711}
8712
Daniel Dunbarcc912342009-05-02 18:28:39 +00008713/// DragonFly Tools
8714
8715// For now, DragonFly Assemble does just about the same as for
8716// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008717void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8718 const InputInfo &Output,
8719 const InputInfoList &Inputs,
8720 const ArgList &Args,
8721 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008722 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008723 ArgStringList CmdArgs;
8724
8725 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8726 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008727 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008728 CmdArgs.push_back("--32");
8729
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008730 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008731
8732 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008733 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008734
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008735 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008736 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008737
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008738 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008739 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008740}
8741
Douglas Katzman95354292015-06-23 20:42:09 +00008742void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8743 const InputInfo &Output,
8744 const InputInfoList &Inputs,
8745 const ArgList &Args,
8746 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008747 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008748 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008749 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008750
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008751 if (!D.SysRoot.empty())
8752 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8753
John McCall65b8da02013-04-11 22:55:55 +00008754 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008755 if (Args.hasArg(options::OPT_static)) {
8756 CmdArgs.push_back("-Bstatic");
8757 } else {
John McCall65b8da02013-04-11 22:55:55 +00008758 if (Args.hasArg(options::OPT_rdynamic))
8759 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008760 if (Args.hasArg(options::OPT_shared))
8761 CmdArgs.push_back("-Bshareable");
8762 else {
8763 CmdArgs.push_back("-dynamic-linker");
8764 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8765 }
John McCall65b8da02013-04-11 22:55:55 +00008766 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008767 }
8768
8769 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8770 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008771 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008772 CmdArgs.push_back("-m");
8773 CmdArgs.push_back("elf_i386");
8774 }
8775
Daniel Dunbarb440f562010-08-02 02:38:21 +00008776 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008777 CmdArgs.push_back("-o");
8778 CmdArgs.push_back(Output.getFilename());
8779 } else {
8780 assert(Output.isNothing() && "Invalid output.");
8781 }
8782
8783 if (!Args.hasArg(options::OPT_nostdlib) &&
8784 !Args.hasArg(options::OPT_nostartfiles)) {
8785 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008786 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008787 CmdArgs.push_back(
8788 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008789 else {
8790 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008791 CmdArgs.push_back(
8792 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008793 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008794 CmdArgs.push_back(
8795 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008796 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008797 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008798 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008799 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008800 CmdArgs.push_back(
8801 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008802 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008803 CmdArgs.push_back(
8804 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008805 }
8806
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008807 Args.AddAllArgs(CmdArgs,
8808 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008809
Daniel Dunbar54423b22010-09-17 00:24:54 +00008810 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008811
8812 if (!Args.hasArg(options::OPT_nostdlib) &&
8813 !Args.hasArg(options::OPT_nodefaultlibs)) {
8814 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8815 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008816 if (UseGCC47)
8817 CmdArgs.push_back("-L/usr/lib/gcc47");
8818 else
8819 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008820
8821 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008822 if (UseGCC47) {
8823 CmdArgs.push_back("-rpath");
8824 CmdArgs.push_back("/usr/lib/gcc47");
8825 } else {
8826 CmdArgs.push_back("-rpath");
8827 CmdArgs.push_back("/usr/lib/gcc44");
8828 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008829 }
8830
Hans Wennborg70850d82013-07-18 20:29:38 +00008831 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008832 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008833 CmdArgs.push_back("-lm");
8834 }
8835
Daniel Dunbarcc912342009-05-02 18:28:39 +00008836 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008837 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008838
8839 if (!Args.hasArg(options::OPT_nolibc)) {
8840 CmdArgs.push_back("-lc");
8841 }
8842
John McCall65b8da02013-04-11 22:55:55 +00008843 if (UseGCC47) {
8844 if (Args.hasArg(options::OPT_static) ||
8845 Args.hasArg(options::OPT_static_libgcc)) {
8846 CmdArgs.push_back("-lgcc");
8847 CmdArgs.push_back("-lgcc_eh");
8848 } else {
8849 if (Args.hasArg(options::OPT_shared_libgcc)) {
8850 CmdArgs.push_back("-lgcc_pic");
8851 if (!Args.hasArg(options::OPT_shared))
8852 CmdArgs.push_back("-lgcc");
8853 } else {
8854 CmdArgs.push_back("-lgcc");
8855 CmdArgs.push_back("--as-needed");
8856 CmdArgs.push_back("-lgcc_pic");
8857 CmdArgs.push_back("--no-as-needed");
8858 }
8859 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008860 } else {
John McCall65b8da02013-04-11 22:55:55 +00008861 if (Args.hasArg(options::OPT_shared)) {
8862 CmdArgs.push_back("-lgcc_pic");
8863 } else {
8864 CmdArgs.push_back("-lgcc");
8865 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008866 }
8867 }
8868
8869 if (!Args.hasArg(options::OPT_nostdlib) &&
8870 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008871 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008872 CmdArgs.push_back(
8873 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008874 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008875 CmdArgs.push_back(
8876 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8877 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008878 }
8879
Alexey Samsonov7811d192014-02-20 13:57:37 +00008880 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008881
Logan Chieneb9162f2014-06-26 14:23:45 +00008882 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008883 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008884}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008885
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008886// Try to find Exe from a Visual Studio distribution. This first tries to find
8887// an installed copy of Visual Studio and, failing that, looks in the PATH,
8888// making sure that whatever executable that's found is not a same-named exe
8889// from clang itself to prevent clang from falling back to itself.
8890static std::string FindVisualStudioExecutable(const ToolChain &TC,
8891 const char *Exe,
8892 const char *ClangProgramPath) {
8893 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8894 std::string visualStudioBinDir;
8895 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8896 visualStudioBinDir)) {
8897 SmallString<128> FilePath(visualStudioBinDir);
8898 llvm::sys::path::append(FilePath, Exe);
8899 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8900 return FilePath.str();
8901 }
8902
8903 return Exe;
8904}
8905
Douglas Katzman95354292015-06-23 20:42:09 +00008906void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8907 const InputInfo &Output,
8908 const InputInfoList &Inputs,
8909 const ArgList &Args,
8910 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008911 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008912 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008913
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008914 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8915 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008916 CmdArgs.push_back(
8917 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008918
8919 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008920 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008921 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008922
Zachary Turner10d75b22014-10-22 20:40:43 +00008923 if (!llvm::sys::Process::GetEnv("LIB")) {
8924 // If the VC environment hasn't been configured (perhaps because the user
8925 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008926 // the environment variable is set however, assume the user knows what
8927 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008928 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008929 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008930 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8931 SmallString<128> LibDir(VisualStudioDir);
8932 llvm::sys::path::append(LibDir, "VC", "lib");
8933 switch (MSVC.getArch()) {
8934 case llvm::Triple::x86:
8935 // x86 just puts the libraries directly in lib
8936 break;
8937 case llvm::Triple::x86_64:
8938 llvm::sys::path::append(LibDir, "amd64");
8939 break;
8940 case llvm::Triple::arm:
8941 llvm::sys::path::append(LibDir, "arm");
8942 break;
8943 default:
8944 break;
8945 }
8946 CmdArgs.push_back(
8947 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008948
8949 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8950 std::string UniversalCRTLibPath;
8951 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8952 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8953 UniversalCRTLibPath.c_str()));
8954 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008955 }
8956
8957 std::string WindowsSdkLibPath;
8958 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8959 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8960 WindowsSdkLibPath.c_str()));
8961 }
8962
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008963 CmdArgs.push_back("-nologo");
8964
Reid Kleckner124955a2015-08-05 18:51:13 +00008965 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008966 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008967
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008968 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008969 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008970 if (DLL) {
8971 CmdArgs.push_back(Args.MakeArgString("-dll"));
8972
8973 SmallString<128> ImplibName(Output.getFilename());
8974 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008975 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008976 }
8977
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008978 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008979 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008980 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008981 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008982 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008983 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008984 };
8985 for (const auto &Component : CompilerRTComponents)
8986 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008987 // Make sure the dynamic runtime thunk is not optimized out at link time
8988 // to ensure proper SEH handling.
8989 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008990 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008991 CmdArgs.push_back(
8992 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008993 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008994 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008995 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008996 };
8997 for (const auto &Component : CompilerRTComponents)
8998 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008999 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009000 }
9001
Hans Wennborg2e274592013-08-13 23:38:57 +00009002 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009003
Alexey Bataevc7e84352015-08-19 04:49:01 +00009004 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9005 options::OPT_fno_openmp, false)) {
9006 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9007 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9008 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9009 TC.getDriver().Dir + "/../lib"));
9010 switch (getOpenMPRuntime(getToolChain(), Args)) {
9011 case OMPRT_OMP:
9012 CmdArgs.push_back("-defaultlib:libomp.lib");
9013 break;
9014 case OMPRT_IOMP5:
9015 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9016 break;
9017 case OMPRT_GOMP:
9018 break;
9019 case OMPRT_Unknown:
9020 // Already diagnosed.
9021 break;
9022 }
9023 }
9024
Reid Kleckner337188f2014-09-16 19:22:00 +00009025 // Add filenames, libraries, and other linker inputs.
9026 for (const auto &Input : Inputs) {
9027 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009028 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009029 continue;
9030 }
9031
9032 const Arg &A = Input.getInputArg();
9033
9034 // Render -l options differently for the MSVC linker.
9035 if (A.getOption().matches(options::OPT_l)) {
9036 StringRef Lib = A.getValue();
9037 const char *LinkLibArg;
9038 if (Lib.endswith(".lib"))
9039 LinkLibArg = Args.MakeArgString(Lib);
9040 else
9041 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9042 CmdArgs.push_back(LinkLibArg);
9043 continue;
9044 }
9045
9046 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9047 // or -L. Render it, even if MSVC doesn't understand it.
9048 A.renderAsInput(Args, CmdArgs);
9049 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009050
Zachary Turner719f58c2014-12-01 23:06:47 +00009051 // We need to special case some linker paths. In the case of lld, we need to
9052 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9053 // linker, we need to use a special search algorithm.
9054 llvm::SmallString<128> linkPath;
9055 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9056 if (Linker.equals_lower("lld"))
9057 Linker = "lld-link";
9058
9059 if (Linker.equals_lower("link")) {
9060 // If we're using the MSVC linker, it's not sufficient to just use link
9061 // from the program PATH, because other environments like GnuWin32 install
9062 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009063 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009064 C.getDriver().getClangProgramPath());
9065 } else {
9066 linkPath = Linker;
9067 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009068 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009069 }
9070
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009071 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009072 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009073}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009074
Douglas Katzman95354292015-06-23 20:42:09 +00009075void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9076 const InputInfo &Output,
9077 const InputInfoList &Inputs,
9078 const ArgList &Args,
9079 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009080 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9081}
9082
Douglas Katzman95354292015-06-23 20:42:09 +00009083std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009084 Compilation &C, const JobAction &JA, const InputInfo &Output,
9085 const InputInfoList &Inputs, const ArgList &Args,
9086 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009087 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009088 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009089 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009090 CmdArgs.push_back("/W0"); // No warnings.
9091
9092 // The goal is to be able to invoke this tool correctly based on
9093 // any flag accepted by clang-cl.
9094
9095 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009096 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009097
9098 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009099 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9100 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9101 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009102 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9103 if (A->getOption().getID() == options::OPT_O0) {
9104 CmdArgs.push_back("/Od");
9105 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009106 CmdArgs.push_back("/Og");
9107
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009108 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009109 if (OptLevel == "s" || OptLevel == "z")
9110 CmdArgs.push_back("/Os");
9111 else
9112 CmdArgs.push_back("/Ot");
9113
9114 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009115 }
9116 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009117 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9118 options::OPT_fno_omit_frame_pointer))
9119 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9120 ? "/Oy"
9121 : "/Oy-");
9122 if (!Args.hasArg(options::OPT_fwritable_strings))
9123 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009124
Nico Weber3f8dafb2015-03-12 19:37:10 +00009125 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009126 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9127
David Majnemerf6072342014-07-01 22:24:56 +00009128 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9129 /*default=*/false))
9130 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009131 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9132 options::OPT_fno_function_sections))
9133 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9134 ? "/Gy"
9135 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009136 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9137 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009138 CmdArgs.push_back(
9139 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009140 if (Args.hasArg(options::OPT_fsyntax_only))
9141 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009142 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9143 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009144 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009145
Nico Weber3f8dafb2015-03-12 19:37:10 +00009146 std::vector<std::string> Includes =
9147 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009148 for (const auto &Include : Includes)
9149 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009150
Hans Wennborg87cfa712013-09-19 20:32:16 +00009151 // Flags that can simply be passed through.
9152 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9153 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009154 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009155 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009156
9157 // The order of these flags is relevant, so pick the last one.
9158 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9159 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9160 A->render(Args, CmdArgs);
9161
Hans Wennborg87cfa712013-09-19 20:32:16 +00009162 // Input filename.
9163 assert(Inputs.size() == 1);
9164 const InputInfo &II = Inputs[0];
9165 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9166 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9167 if (II.isFilename())
9168 CmdArgs.push_back(II.getFilename());
9169 else
9170 II.getInputArg().renderAsInput(Args, CmdArgs);
9171
9172 // Output filename.
9173 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009174 const char *Fo =
9175 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009176 CmdArgs.push_back(Fo);
9177
Hans Wennborg188382e2013-09-20 18:16:35 +00009178 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009179 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9180 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009181 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009182 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009183}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009184
Yaron Keren1c0070c2015-07-02 04:45:27 +00009185/// MinGW Tools
9186void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9187 const InputInfo &Output,
9188 const InputInfoList &Inputs,
9189 const ArgList &Args,
9190 const char *LinkingOutput) const {
9191 claimNoWarnArgs(Args);
9192 ArgStringList CmdArgs;
9193
9194 if (getToolChain().getArch() == llvm::Triple::x86) {
9195 CmdArgs.push_back("--32");
9196 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9197 CmdArgs.push_back("--64");
9198 }
9199
9200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9201
9202 CmdArgs.push_back("-o");
9203 CmdArgs.push_back(Output.getFilename());
9204
9205 for (const auto &II : Inputs)
9206 CmdArgs.push_back(II.getFilename());
9207
9208 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009209 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009210
9211 if (Args.hasArg(options::OPT_gsplit_dwarf))
9212 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9213 SplitDebugName(Args, Inputs[0]));
9214}
9215
9216void MinGW::Linker::AddLibGCC(const ArgList &Args,
9217 ArgStringList &CmdArgs) const {
9218 if (Args.hasArg(options::OPT_mthreads))
9219 CmdArgs.push_back("-lmingwthrd");
9220 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009221
Yaron Kerenaa281332015-08-09 00:24:07 +00009222 // Make use of compiler-rt if --rtlib option is used
9223 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9224 if (RLT == ToolChain::RLT_Libgcc) {
9225 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9226 Args.hasArg(options::OPT_static);
9227 bool Shared = Args.hasArg(options::OPT_shared);
9228 bool CXX = getToolChain().getDriver().CCCIsCXX();
9229
9230 if (Static || (!CXX && !Shared)) {
9231 CmdArgs.push_back("-lgcc");
9232 CmdArgs.push_back("-lgcc_eh");
9233 } else {
9234 CmdArgs.push_back("-lgcc_s");
9235 CmdArgs.push_back("-lgcc");
9236 }
9237 } else {
9238 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9239 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009240
Yaron Keren1c0070c2015-07-02 04:45:27 +00009241 CmdArgs.push_back("-lmoldname");
9242 CmdArgs.push_back("-lmingwex");
9243 CmdArgs.push_back("-lmsvcrt");
9244}
9245
9246void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9247 const InputInfo &Output,
9248 const InputInfoList &Inputs,
9249 const ArgList &Args,
9250 const char *LinkingOutput) const {
9251 const ToolChain &TC = getToolChain();
9252 const Driver &D = TC.getDriver();
9253 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9254
9255 ArgStringList CmdArgs;
9256
9257 // Silence warning for "clang -g foo.o -o foo"
9258 Args.ClaimAllArgs(options::OPT_g_Group);
9259 // and "clang -emit-llvm foo.o -o foo"
9260 Args.ClaimAllArgs(options::OPT_emit_llvm);
9261 // and for "clang -w foo.o -o foo". Other warning options are already
9262 // handled somewhere else.
9263 Args.ClaimAllArgs(options::OPT_w);
9264
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009265 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9266 if (LinkerName.equals_lower("lld")) {
9267 CmdArgs.push_back("-flavor");
9268 CmdArgs.push_back("gnu");
9269 }
9270
Yaron Keren1c0070c2015-07-02 04:45:27 +00009271 if (!D.SysRoot.empty())
9272 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9273
9274 if (Args.hasArg(options::OPT_s))
9275 CmdArgs.push_back("-s");
9276
9277 CmdArgs.push_back("-m");
9278 if (TC.getArch() == llvm::Triple::x86)
9279 CmdArgs.push_back("i386pe");
9280 if (TC.getArch() == llvm::Triple::x86_64)
9281 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009282 if (TC.getArch() == llvm::Triple::arm)
9283 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009284
9285 if (Args.hasArg(options::OPT_mwindows)) {
9286 CmdArgs.push_back("--subsystem");
9287 CmdArgs.push_back("windows");
9288 } else if (Args.hasArg(options::OPT_mconsole)) {
9289 CmdArgs.push_back("--subsystem");
9290 CmdArgs.push_back("console");
9291 }
9292
9293 if (Args.hasArg(options::OPT_static))
9294 CmdArgs.push_back("-Bstatic");
9295 else {
9296 if (Args.hasArg(options::OPT_mdll))
9297 CmdArgs.push_back("--dll");
9298 else if (Args.hasArg(options::OPT_shared))
9299 CmdArgs.push_back("--shared");
9300 CmdArgs.push_back("-Bdynamic");
9301 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9302 CmdArgs.push_back("-e");
9303 if (TC.getArch() == llvm::Triple::x86)
9304 CmdArgs.push_back("_DllMainCRTStartup@12");
9305 else
9306 CmdArgs.push_back("DllMainCRTStartup");
9307 CmdArgs.push_back("--enable-auto-image-base");
9308 }
9309 }
9310
9311 CmdArgs.push_back("-o");
9312 CmdArgs.push_back(Output.getFilename());
9313
9314 Args.AddAllArgs(CmdArgs, options::OPT_e);
9315 // FIXME: add -N, -n flags
9316 Args.AddLastArg(CmdArgs, options::OPT_r);
9317 Args.AddLastArg(CmdArgs, options::OPT_s);
9318 Args.AddLastArg(CmdArgs, options::OPT_t);
9319 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9320 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9321
9322 if (!Args.hasArg(options::OPT_nostdlib) &&
9323 !Args.hasArg(options::OPT_nostartfiles)) {
9324 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9325 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9326 } else {
9327 if (Args.hasArg(options::OPT_municode))
9328 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9329 else
9330 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9331 }
9332 if (Args.hasArg(options::OPT_pg))
9333 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9334 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9335 }
9336
9337 Args.AddAllArgs(CmdArgs, options::OPT_L);
9338 const ToolChain::path_list Paths = TC.getFilePaths();
9339 for (const auto &Path : Paths)
9340 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9341
9342 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9343
9344 // TODO: Add ASan stuff here
9345
9346 // TODO: Add profile stuff here
9347
9348 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9349 !Args.hasArg(options::OPT_nodefaultlibs)) {
9350 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9351 !Args.hasArg(options::OPT_static);
9352 if (OnlyLibstdcxxStatic)
9353 CmdArgs.push_back("-Bstatic");
9354 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9355 if (OnlyLibstdcxxStatic)
9356 CmdArgs.push_back("-Bdynamic");
9357 }
9358
9359 if (!Args.hasArg(options::OPT_nostdlib)) {
9360 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9361 if (Args.hasArg(options::OPT_static))
9362 CmdArgs.push_back("--start-group");
9363
9364 if (Args.hasArg(options::OPT_fstack_protector) ||
9365 Args.hasArg(options::OPT_fstack_protector_strong) ||
9366 Args.hasArg(options::OPT_fstack_protector_all)) {
9367 CmdArgs.push_back("-lssp_nonshared");
9368 CmdArgs.push_back("-lssp");
9369 }
9370 if (Args.hasArg(options::OPT_fopenmp))
9371 CmdArgs.push_back("-lgomp");
9372
9373 AddLibGCC(Args, CmdArgs);
9374
9375 if (Args.hasArg(options::OPT_pg))
9376 CmdArgs.push_back("-lgmon");
9377
Yaron Kerenadce68e2015-07-06 18:52:19 +00009378 if (Args.hasArg(options::OPT_pthread))
9379 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009380
9381 // add system libraries
9382 if (Args.hasArg(options::OPT_mwindows)) {
9383 CmdArgs.push_back("-lgdi32");
9384 CmdArgs.push_back("-lcomdlg32");
9385 }
9386 CmdArgs.push_back("-ladvapi32");
9387 CmdArgs.push_back("-lshell32");
9388 CmdArgs.push_back("-luser32");
9389 CmdArgs.push_back("-lkernel32");
9390
9391 if (Args.hasArg(options::OPT_static))
9392 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009393 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009394 AddLibGCC(Args, CmdArgs);
9395 }
9396
9397 if (!Args.hasArg(options::OPT_nostartfiles)) {
9398 // Add crtfastmath.o if available and fast math is enabled.
9399 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9400
9401 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9402 }
9403 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009404 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009405 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009406}
9407
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009408/// XCore Tools
9409// We pass assemble and link construction to the xcc tool.
9410
Douglas Katzman95354292015-06-23 20:42:09 +00009411void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9412 const InputInfo &Output,
9413 const InputInfoList &Inputs,
9414 const ArgList &Args,
9415 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009416 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009417 ArgStringList CmdArgs;
9418
9419 CmdArgs.push_back("-o");
9420 CmdArgs.push_back(Output.getFilename());
9421
9422 CmdArgs.push_back("-c");
9423
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009424 if (Args.hasArg(options::OPT_v))
9425 CmdArgs.push_back("-v");
9426
Robert Lytton894d25c2014-05-02 09:33:25 +00009427 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9428 if (!A->getOption().matches(options::OPT_g0))
9429 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009430
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009431 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9432 false))
9433 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009434
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009435 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009436
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009437 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009438 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009439
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009440 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009441 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009442}
9443
Douglas Katzman95354292015-06-23 20:42:09 +00009444void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9445 const InputInfo &Output,
9446 const InputInfoList &Inputs,
9447 const ArgList &Args,
9448 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009449 ArgStringList CmdArgs;
9450
9451 if (Output.isFilename()) {
9452 CmdArgs.push_back("-o");
9453 CmdArgs.push_back(Output.getFilename());
9454 } else {
9455 assert(Output.isNothing() && "Invalid output.");
9456 }
9457
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009458 if (Args.hasArg(options::OPT_v))
9459 CmdArgs.push_back("-v");
9460
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009461 // Pass -fexceptions through to the linker if it was present.
9462 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9463 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009464 CmdArgs.push_back("-fexceptions");
9465
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009466 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9467
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009468 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009469 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009470}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009471
Douglas Katzman95354292015-06-23 20:42:09 +00009472void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9473 const InputInfo &Output,
9474 const InputInfoList &Inputs,
9475 const ArgList &Args,
9476 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009477 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009478 const auto &TC =
9479 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9480 ArgStringList CmdArgs;
9481 const char *Exec;
9482
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 break;
9489 case llvm::Triple::x86:
9490 CmdArgs.push_back("--32");
9491 break;
9492 case llvm::Triple::x86_64:
9493 CmdArgs.push_back("--64");
9494 break;
9495 }
9496
9497 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9498
9499 CmdArgs.push_back("-o");
9500 CmdArgs.push_back(Output.getFilename());
9501
9502 for (const auto &Input : Inputs)
9503 CmdArgs.push_back(Input.getFilename());
9504
9505 const std::string Assembler = TC.GetProgramPath("as");
9506 Exec = Args.MakeArgString(Assembler);
9507
Justin Bognerd3371d82015-07-17 03:35:54 +00009508 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009509}
9510
Douglas Katzman95354292015-06-23 20:42:09 +00009511void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9512 const InputInfo &Output,
9513 const InputInfoList &Inputs,
9514 const ArgList &Args,
9515 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009516 const auto &TC =
9517 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9518 const llvm::Triple &T = TC.getTriple();
9519 const Driver &D = TC.getDriver();
9520 SmallString<128> EntryPoint;
9521 ArgStringList CmdArgs;
9522 const char *Exec;
9523
9524 // Silence warning for "clang -g foo.o -o foo"
9525 Args.ClaimAllArgs(options::OPT_g_Group);
9526 // and "clang -emit-llvm foo.o -o foo"
9527 Args.ClaimAllArgs(options::OPT_emit_llvm);
9528 // and for "clang -w foo.o -o foo"
9529 Args.ClaimAllArgs(options::OPT_w);
9530 // Other warning options are already handled somewhere else.
9531
9532 if (!D.SysRoot.empty())
9533 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9534
9535 if (Args.hasArg(options::OPT_pie))
9536 CmdArgs.push_back("-pie");
9537 if (Args.hasArg(options::OPT_rdynamic))
9538 CmdArgs.push_back("-export-dynamic");
9539 if (Args.hasArg(options::OPT_s))
9540 CmdArgs.push_back("--strip-all");
9541
9542 CmdArgs.push_back("-m");
9543 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009544 default:
9545 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009546 case llvm::Triple::arm:
9547 case llvm::Triple::thumb:
9548 // FIXME: this is incorrect for WinCE
9549 CmdArgs.push_back("thumb2pe");
9550 break;
9551 case llvm::Triple::x86:
9552 CmdArgs.push_back("i386pe");
9553 EntryPoint.append("_");
9554 break;
9555 case llvm::Triple::x86_64:
9556 CmdArgs.push_back("i386pep");
9557 break;
9558 }
9559
9560 if (Args.hasArg(options::OPT_shared)) {
9561 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009562 default:
9563 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009564 case llvm::Triple::arm:
9565 case llvm::Triple::thumb:
9566 case llvm::Triple::x86_64:
9567 EntryPoint.append("_DllMainCRTStartup");
9568 break;
9569 case llvm::Triple::x86:
9570 EntryPoint.append("_DllMainCRTStartup@12");
9571 break;
9572 }
9573
9574 CmdArgs.push_back("-shared");
9575 CmdArgs.push_back("-Bdynamic");
9576
9577 CmdArgs.push_back("--enable-auto-image-base");
9578
9579 CmdArgs.push_back("--entry");
9580 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9581 } else {
9582 EntryPoint.append("mainCRTStartup");
9583
9584 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9585 : "-Bdynamic");
9586
9587 if (!Args.hasArg(options::OPT_nostdlib) &&
9588 !Args.hasArg(options::OPT_nostartfiles)) {
9589 CmdArgs.push_back("--entry");
9590 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9591 }
9592
9593 // FIXME: handle subsystem
9594 }
9595
9596 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009597 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009598
9599 CmdArgs.push_back("-o");
9600 CmdArgs.push_back(Output.getFilename());
9601
9602 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9603 SmallString<261> ImpLib(Output.getFilename());
9604 llvm::sys::path::replace_extension(ImpLib, ".lib");
9605
9606 CmdArgs.push_back("--out-implib");
9607 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9608 }
9609
9610 if (!Args.hasArg(options::OPT_nostdlib) &&
9611 !Args.hasArg(options::OPT_nostartfiles)) {
9612 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9613 const char *CRTBegin;
9614
9615 CRTBegin =
9616 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9617 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9618 }
9619
9620 Args.AddAllArgs(CmdArgs, options::OPT_L);
9621
9622 const auto &Paths = TC.getFilePaths();
9623 for (const auto &Path : Paths)
9624 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9625
9626 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9627
9628 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9629 !Args.hasArg(options::OPT_nodefaultlibs)) {
9630 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9631 !Args.hasArg(options::OPT_static);
9632 if (StaticCXX)
9633 CmdArgs.push_back("-Bstatic");
9634 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9635 if (StaticCXX)
9636 CmdArgs.push_back("-Bdynamic");
9637 }
9638
9639 if (!Args.hasArg(options::OPT_nostdlib)) {
9640 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9641 // TODO handle /MT[d] /MD[d]
9642 CmdArgs.push_back("-lmsvcrt");
9643 AddRunTimeLibs(TC, D, CmdArgs, Args);
9644 }
9645 }
9646
9647 const std::string Linker = TC.GetProgramPath("ld");
9648 Exec = Args.MakeArgString(Linker);
9649
Justin Bognerd3371d82015-07-17 03:35:54 +00009650 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009651}
Douglas Katzman84a75642015-06-19 14:55:19 +00009652
Douglas Katzman95354292015-06-23 20:42:09 +00009653void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9654 const InputInfo &Output,
9655 const InputInfoList &Inputs,
9656 const ArgList &Args,
9657 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009658
9659 ArgStringList CmdArgs;
9660
9661 assert(Inputs.size() == 1);
9662 const InputInfo &II = Inputs[0];
9663 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9664 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9665
Douglas Katzman84a75642015-06-19 14:55:19 +00009666 CmdArgs.push_back("-DMYRIAD2");
9667 CmdArgs.push_back("-mcpu=myriad2");
9668 CmdArgs.push_back("-S");
9669
Douglas Katzmanf6071112015-08-03 14:34:22 +00009670 // Append all -I, -iquote, -isystem paths, defines/undefines,
9671 // 'f' flags, optimize flags, and warning options.
9672 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009673 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9674 options::OPT_D, options::OPT_U,
9675 options::OPT_f_Group, options::OPT_f_clang_Group,
9676 options::OPT_g_Group, options::OPT_M_Group,
9677 options::OPT_O_Group, options::OPT_W_Group});
9678
9679 // If we're producing a dependency file, and assembly is the final action,
9680 // then the name of the target in the dependency file should be the '.o'
9681 // file, not the '.s' file produced by this step. For example, instead of
9682 // /tmp/mumble.s: mumble.c .../someheader.h
9683 // the filename on the lefthand side should be "mumble.o"
9684 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9685 C.getActions().size() == 1 &&
9686 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9687 Arg *A = Args.getLastArg(options::OPT_o);
9688 if (A) {
9689 CmdArgs.push_back("-MT");
9690 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9691 }
9692 }
9693
Douglas Katzman84a75642015-06-19 14:55:19 +00009694 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9695
9696 CmdArgs.push_back(II.getFilename());
9697 CmdArgs.push_back("-o");
9698 CmdArgs.push_back(Output.getFilename());
9699
9700 std::string Exec =
9701 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009702 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9703 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009704}
9705
Douglas Katzman95354292015-06-23 20:42:09 +00009706void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9707 const InputInfo &Output,
9708 const InputInfoList &Inputs,
9709 const ArgList &Args,
9710 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009711 ArgStringList CmdArgs;
9712
9713 assert(Inputs.size() == 1);
9714 const InputInfo &II = Inputs[0];
9715 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9716 assert(Output.getType() == types::TY_Object);
9717
9718 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009719 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009720 CmdArgs.push_back("-noSPrefixing");
9721 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009722 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9723 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9724 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009725 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009726 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009727 }
9728 CmdArgs.push_back("-elf"); // Output format.
9729 CmdArgs.push_back(II.getFilename());
9730 CmdArgs.push_back(
9731 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9732
9733 std::string Exec =
9734 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009735 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9736 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009737}