blob: 237a244fb98ec6413c9ad36fb47a60e2f2695ca3 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Daniel Dunbar64198ef2009-09-10 01:21:05 +000055/// CheckPreprocessingOptions - Perform some validation of preprocessing
56/// arguments that is shared with gcc.
57static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000058 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
59 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
60 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000061 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000062 << A->getBaseArg().getAsString(Args)
63 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
64 }
65 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000066}
67
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068/// CheckCodeGenerationOptions - Perform some validation of code generation
69/// arguments that is shared with gcc.
70static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
71 // In gcc, only ARM checks this, but it seems reasonable to check universally.
72 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000073 if (const Arg *A =
74 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
75 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
76 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000077}
78
Bob Wilsond5aad2a2014-11-04 22:28:48 +000079// Add backslashes to escape spaces and other backslashes.
80// This is used for the space-separated argument list specified with
81// the -dwarf-debug-flags option.
82static void EscapeSpacesAndBackslashes(const char *Arg,
83 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000084 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000085 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000086 default:
87 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +000088 case ' ':
89 case '\\':
90 Res.push_back('\\');
91 break;
92 }
93 Res.push_back(*Arg);
94 }
95}
96
Chris Lattnerbf2803f2010-03-29 17:55:58 +000097// Quote target names for inclusion in GNU Make dependency files.
98// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +000099static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000100 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
101 switch (Target[i]) {
102 case ' ':
103 case '\t':
104 // Escape the preceding backslashes
105 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
106 Res.push_back('\\');
107
108 // Escape the space/tab
109 Res.push_back('\\');
110 break;
111 case '$':
112 Res.push_back('$');
113 break;
114 case '#':
115 Res.push_back('\\');
116 break;
117 default:
118 break;
119 }
120
121 Res.push_back(Target[i]);
122 }
123}
124
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000125static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
126 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000127 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 bool CombinedArg = false;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 if (!DirList)
131 return; // Nothing to do.
132
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 StringRef Name(ArgName);
134 if (Name.equals("-I") || Name.equals("-L"))
135 CombinedArg = true;
136
Bill Wendling281ca292012-03-12 21:22:35 +0000137 StringRef Dirs(DirList);
138 if (Dirs.empty()) // Empty string should not add '.'.
139 return;
140
141 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000142 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000143 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(".");
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000152 CmdArgs.push_back(
153 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 } else {
155 CmdArgs.push_back(ArgName);
156 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
157 }
Bill Wendling281ca292012-03-12 21:22:35 +0000158 }
Nico Weber89355782012-03-19 15:00:03 +0000159 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000160 }
161
162 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 if (CombinedArg) {
164 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
165 } else {
166 CmdArgs.push_back(ArgName);
167 CmdArgs.push_back(".");
168 }
Bill Wendling281ca292012-03-12 21:22:35 +0000169 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000170 if (CombinedArg) {
171 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
172 } else {
173 CmdArgs.push_back(ArgName);
174 CmdArgs.push_back(Args.MakeArgString(Dirs));
175 }
Bill Wendling281ca292012-03-12 21:22:35 +0000176 }
177}
178
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
180 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 const Driver &D = TC.getDriver();
182
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000183 // Add extra linker input arguments which are not treated as inputs
184 // (constructed via -Xarch_).
185 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
186
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000187 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 if (!TC.HasNativeLLVMSupport()) {
189 // Don't try to pass LLVM inputs unless we have native support.
190 if (II.getType() == types::TY_LLVM_IR ||
191 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000192 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
193 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
195
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000196 // Add filenames immediately.
197 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000199 continue;
200 }
201
202 // Otherwise, this is a linker input argument.
203 const Arg &A = II.getInputArg();
204
205 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000206 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000207 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000208 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000209 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000210 else if (A.getOption().matches(options::OPT_z)) {
211 // Pass -z prefix for gcc linker compatibility.
212 A.claim();
213 A.render(Args, CmdArgs);
214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000215 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000216 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217 }
Bill Wendling281ca292012-03-12 21:22:35 +0000218
219 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000220 // and only supported on native toolchains.
221 if (!TC.isCrossCompiling())
222 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000223}
224
John McCall31168b02011-06-15 23:02:42 +0000225/// \brief Determine whether Objective-C automated reference counting is
226/// enabled.
227static bool isObjCAutoRefCount(const ArgList &Args) {
228 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
229}
230
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231/// \brief Determine whether we are linking the ObjC runtime.
232static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000233 if (isObjCAutoRefCount(Args)) {
234 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000235 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000236 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000237 return Args.hasArg(options::OPT_fobjc_link_runtime);
238}
239
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000240static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000241 // Don't forward inputs from the original command line. They are added from
242 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000243 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000244 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000245}
246
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000247void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
248 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 ArgStringList &CmdArgs,
250 const InputInfo &Output,
251 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000254 CheckPreprocessingOptions(D, Args);
255
256 Args.AddLastArg(CmdArgs, options::OPT_C);
257 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000258
259 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000260 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 (A = Args.getLastArg(options::OPT_MD)) ||
262 (A = Args.getLastArg(options::OPT_MMD))) {
263 // Determine the output location.
264 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000266 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000268 } else if (Output.getType() == types::TY_Dependencies) {
269 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000270 } else if (A->getOption().matches(options::OPT_M) ||
271 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 DepFile = "-";
273 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000274 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000275 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 }
277 CmdArgs.push_back("-dependency-file");
278 CmdArgs.push_back(DepFile);
279
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
282 const char *DepTarget;
283
284 // If user provided -o, that is the dependency target, except
285 // when we are only generating a dependency file.
286 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
287 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000288 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 } else {
290 // Otherwise derive from the base input.
291 //
292 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000293 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000294 llvm::sys::path::replace_extension(P, "o");
295 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297
298 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000299 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 QuoteTarget(DepTarget, Quoted);
301 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000304 if (A->getOption().matches(options::OPT_M) ||
305 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000307 if ((isa<PrecompileJobAction>(JA) &&
308 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
309 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000310 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 if (Args.hasArg(options::OPT_MG)) {
314 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000315 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000316 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000317 CmdArgs.push_back("-MG");
318 }
319
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000321 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322
323 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000324 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000330 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 CmdArgs.push_back(Args.MakeArgString(Quoted));
332
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000333 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000335 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336 }
337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
Douglas Gregor111af7d2009-04-18 00:34:01 +0000339 // Add -i* options, and automatically translate to
340 // -include-pch/-include-pth for transparent PCH support. It's
341 // wonky, but we include looking for .gch so we can support seamless
342 // replacement into a build system already set up to be generating
343 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000347 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
348 RenderedImplicitInclude = true;
349
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000350 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 SmallString<128> P(A->getValue());
356 // We want the files to have a name like foo.h.pch. Add a dummy extension
357 // so that replace_extension does the right thing.
358 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000359 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000361 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000367 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000369 }
370
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000372 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000373 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000374 FoundPCH = UsePCH;
375 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
378
379 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000380 if (IsFirstImplicitInclude) {
381 A->claim();
382 if (UsePCH)
383 CmdArgs.push_back("-include-pch");
384 else
385 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 continue;
388 } else {
389 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 D.Diag(diag::warn_drv_pch_not_first_include) << P
391 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394 }
395
396 // Not translated, render as usual.
397 A->claim();
398 A->render(Args, CmdArgs);
399 }
400
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000401 Args.AddAllArgs(CmdArgs,
402 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
403 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000404
405 // Add -Wp, and -Xassembler if using the preprocessor.
406
407 // FIXME: There is a very unfortunate problem here, some troubled
408 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
409 // really support that we would have to parse and then translate
410 // those options. :(
411 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
412 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000413
414 // -I- is a deprecated GCC feature, reject it.
415 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417
418 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
419 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 StringRef sysroot = C.getSysRoot();
421 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 if (!Args.hasArg(options::OPT_isysroot)) {
423 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000424 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000425 }
426 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000427
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000429 // FIXME: We should probably sink the logic for handling these from the
430 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPATH - included following the user specified includes (but prior to
432 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000442
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000444 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000445 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000446
447 // Add system include arguments.
448 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449}
450
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000451// FIXME: Move to target hook.
452static bool isSignedCharDefault(const llvm::Triple &Triple) {
453 switch (Triple.getArch()) {
454 default:
455 return true;
456
Tim Northover9bb857a2013-01-31 12:13:10 +0000457 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000458 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000459 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000460 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000461 case llvm::Triple::thumb:
462 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000463 if (Triple.isOSDarwin() || Triple.isOSWindows())
464 return true;
465 return false;
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 case llvm::Triple::ppc:
468 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000469 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470 return true;
471 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000472
David Majnemerdcecd932015-05-23 19:23:55 +0000473 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000474 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000476 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000477 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 }
479}
480
Robert Lytton0e076492013-08-13 09:43:10 +0000481static bool isNoCommonDefault(const llvm::Triple &Triple) {
482 switch (Triple.getArch()) {
483 default:
484 return false;
485
486 case llvm::Triple::xcore:
487 return true;
488 }
489}
490
Renato Goline17c5802015-07-27 23:44:42 +0000491// ARM tools start.
492
493// Get SubArch (vN).
494static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
495 llvm::StringRef Arch = Triple.getArchName();
496 return llvm::ARMTargetParser::parseArchVersion(Arch);
497}
498
499// True if M-profile.
500static bool isARMMProfile(const llvm::Triple &Triple) {
501 llvm::StringRef Arch = Triple.getArchName();
502 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
503 return Profile == llvm::ARM::PK_M;
504}
505
506// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000507static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
508 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000509 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
510 CPU = A->getValue();
511 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
512 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000513 if (!FromAs)
514 return;
515
516 for (const Arg *A :
517 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
518 StringRef Value = A->getValue();
519 if (Value.startswith("-mcpu="))
520 CPU = Value.substr(6);
521 if (Value.startswith("-march="))
522 Arch = Value.substr(7);
523 }
Renato Goline17c5802015-07-27 23:44:42 +0000524}
525
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000526// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000527// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000529 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000530 std::vector<const char *> &Features) {
Alexandros Lamprinease5b47642015-07-28 09:08:03 +0000531 unsigned HWDivID = llvm::ARMTargetParser::parseHWDiv(HWDiv);
532 if (!llvm::ARMTargetParser::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000533 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
534}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000535
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000536// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000537static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000538 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539 std::vector<const char *> &Features) {
John Brawn5a589ad2015-06-05 13:34:11 +0000540 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
541 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000542 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
543}
544
Renato Golin7c542b42015-07-27 23:44:45 +0000545// Check if -march is valid by checking if it can be canonicalised and parsed.
546// getARMArch is used here instead of just checking the -march value in order
547// to handle -march=native correctly.
548static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000549 llvm::StringRef ArchName,
550 const llvm::Triple &Triple) {
551 std::string MArch = arm::getARMArch(ArchName, Triple);
552 if (llvm::ARMTargetParser::parseArch(MArch) == llvm::ARM::AK_INVALID)
553 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000554}
555
Renato Golin7c542b42015-07-27 23:44:45 +0000556// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
557static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
558 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000559 const llvm::Triple &Triple) {
560 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
561 std::string Arch = arm::getARMArch(ArchName, Triple);
562 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
563 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000564}
565
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000566// Select the float ABI as determined by -msoft-float, -mhard-float, and
567// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000568StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000569 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000570 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000571 if (Arg *A =
572 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
573 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000574 if (A->getOption().matches(options::OPT_msoft_float))
575 FloatABI = "soft";
576 else if (A->getOption().matches(options::OPT_mhard_float))
577 FloatABI = "hard";
578 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000579 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000580 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000581 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000582 FloatABI = "soft";
583 }
584 }
585 }
586
587 // If unspecified, choose the default based on the platform.
588 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000589 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000590 case llvm::Triple::Darwin:
591 case llvm::Triple::MacOSX:
592 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000593 // Darwin defaults to "softfp" for v6 and v7.
594 //
John Brawn94fd9632015-05-21 12:19:49 +0000595 if (getARMSubArchVersionNumber(Triple) == 6 ||
596 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000597 FloatABI = "softfp";
598 else
599 FloatABI = "soft";
600 break;
601 }
602
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000603 // FIXME: this is invalid for WindowsCE
604 case llvm::Triple::Win32:
605 FloatABI = "hard";
606 break;
607
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000608 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000609 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000610 case llvm::Triple::GNUEABIHF:
611 FloatABI = "hard";
612 break;
613 default:
614 // FreeBSD defaults to soft float
615 FloatABI = "soft";
616 break;
617 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000618 break;
619
Daniel Dunbar78485922009-09-10 23:00:09 +0000620 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000621 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000622 case llvm::Triple::GNUEABIHF:
623 FloatABI = "hard";
624 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000625 case llvm::Triple::GNUEABI:
626 FloatABI = "softfp";
627 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000628 case llvm::Triple::EABIHF:
629 FloatABI = "hard";
630 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000631 case llvm::Triple::EABI:
632 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
633 FloatABI = "softfp";
634 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000635 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000636 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000637 FloatABI = "softfp";
638 else
639 FloatABI = "soft";
640 break;
641 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000642 default:
643 // Assume "soft", but warn the user we are guessing.
644 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000645 if (Triple.getOS() != llvm::Triple::UnknownOS ||
646 !Triple.isOSBinFormatMachO())
647 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000648 break;
649 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000650 }
651 }
652
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000653 return FloatABI;
654}
655
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000656static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
657 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000658 std::vector<const char *> &Features,
659 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000660 bool KernelOrKext =
661 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000662 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000663 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
664 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
665
Nico Weber6e0ebae2015-04-29 21:16:40 +0000666 if (!ForAS) {
667 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
668 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
669 // stripped out by the ARM target. We should probably pass this a new
670 // -target-option, which is handled by the -cc1/-cc1as invocation.
671 //
672 // FIXME2: For consistency, it would be ideal if we set up the target
673 // machine state the same when using the frontend or the assembler. We don't
674 // currently do that for the assembler, we pass the options directly to the
675 // backend and never even instantiate the frontend TargetInfo. If we did,
676 // and used its handleTargetFeatures hook, then we could ensure the
677 // assembler and the frontend behave the same.
678
679 // Use software floating point operations?
680 if (FloatABI == "soft")
681 Features.push_back("+soft-float");
682
683 // Use software floating point argument passing?
684 if (FloatABI != "hard")
685 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000686 } else {
687 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
688 // to the assembler correctly.
689 for (const Arg *A :
690 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
691 StringRef Value = A->getValue();
692 if (Value.startswith("-mfpu=")) {
693 WaFPU = A;
694 } else if (Value.startswith("-mcpu=")) {
695 WaCPU = A;
696 } else if (Value.startswith("-mhwdiv=")) {
697 WaHDiv = A;
698 } else if (Value.startswith("-march=")) {
699 WaArch = A;
700 }
701 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000702 }
703
Renato Golin7c542b42015-07-27 23:44:45 +0000704 // Check -march. ClangAs gives preference to -Wa,-march=.
705 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000706 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000707 if (WaArch) {
708 if (ArchArg)
709 D.Diag(clang::diag::warn_drv_unused_argument)
710 << ArchArg->getAsString(Args);
711 ArchName = StringRef(WaArch->getValue()).substr(7);
712 checkARMArchName(D, WaArch, Args, ArchName, Triple);
713 // FIXME: Set Arch.
714 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
715 } else if (ArchArg) {
716 ArchName = ArchArg->getValue();
717 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000718 }
719
Renato Golin7c542b42015-07-27 23:44:45 +0000720 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
721 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000722 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000723 if (WaCPU) {
724 if (CPUArg)
725 D.Diag(clang::diag::warn_drv_unused_argument)
726 << CPUArg->getAsString(Args);
727 CPUName = StringRef(WaCPU->getValue()).substr(6);
728 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
729 } else if (CPUArg) {
730 CPUName = CPUArg->getValue();
731 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000732 }
John Brawna95c1a82015-05-08 12:52:18 +0000733
Renato Golin23459c62015-07-30 16:40:17 +0000734 // Add CPU features for generic CPUs
735 if (CPUName == "native") {
736 llvm::StringMap<bool> HostFeatures;
737 if (llvm::sys::getHostCPUFeatures(HostFeatures))
738 for (auto &F : HostFeatures)
739 Features.push_back(
740 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
741 }
742
743 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
744 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
745 if (WaFPU) {
746 if (FPUArg)
747 D.Diag(clang::diag::warn_drv_unused_argument)
748 << FPUArg->getAsString(Args);
749 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
750 Features);
751 } else if (FPUArg) {
752 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
753 }
754
755 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
756 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
757 if (WaHDiv) {
758 if (HDivArg)
759 D.Diag(clang::diag::warn_drv_unused_argument)
760 << HDivArg->getAsString(Args);
761 getARMHWDivFeatures(D, WaHDiv, Args,
762 StringRef(WaHDiv->getValue()).substr(8), Features);
763 } else if (HDivArg)
764 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
765
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000766 // Setting -msoft-float effectively disables NEON because of the GCC
767 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000768 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000769 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000770 // Also need to explicitly disable features which imply NEON.
771 Features.push_back("-crypto");
772 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000773
Eric Christopher269c2a22015-04-04 03:34:43 +0000774 // En/disable crc code generation.
775 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000776 if (A->getOption().matches(options::OPT_mcrc))
777 Features.push_back("+crc");
778 else
779 Features.push_back("-crc");
780 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000781
782 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
783 Features.insert(Features.begin(), "+v8.1a");
784 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000785
Akira Hatanakac2694822015-07-07 08:28:42 +0000786 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
787 // neither options are specified, see if we are compiling for kernel/kext and
788 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000789 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
790 options::OPT_mno_long_calls)) {
791 if (A->getOption().matches(options::OPT_mlong_calls))
792 Features.push_back("+long-calls");
793 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
794 Features.push_back("+long-calls");
795 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000796
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000797 // Kernel code has more strict alignment requirements.
798 if (KernelOrKext)
799 Features.push_back("+strict-align");
800 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
801 options::OPT_munaligned_access)) {
802 if (A->getOption().matches(options::OPT_munaligned_access)) {
803 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
804 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
805 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
806 } else
807 Features.push_back("+strict-align");
808 } else {
809 // Assume pre-ARMv6 doesn't support unaligned accesses.
810 //
811 // ARMv6 may or may not support unaligned accesses depending on the
812 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
813 // Darwin and NetBSD targets support unaligned accesses, and others don't.
814 //
815 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
816 // which raises an alignment fault on unaligned accesses. Linux
817 // defaults this bit to 0 and handles it as a system-wide (not
818 // per-process) setting. It is therefore safe to assume that ARMv7+
819 // Linux targets support unaligned accesses. The same goes for NaCl.
820 //
821 // The above behavior is consistent with GCC.
822 int VersionNum = getARMSubArchVersionNumber(Triple);
823 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
824 if (VersionNum < 6)
825 Features.push_back("+strict-align");
826 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
827 if (VersionNum < 7)
828 Features.push_back("+strict-align");
829 } else
830 Features.push_back("+strict-align");
831 }
832
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000833 // llvm does not support reserving registers in general. There is support
834 // for reserving r9 on ARM though (defined as a platform-specific register
835 // in ARM EABI).
836 if (Args.hasArg(options::OPT_ffixed_r9))
837 Features.push_back("+reserve-r9");
838
Akira Hatanaka580efb22015-07-16 00:43:00 +0000839 // The kext linker doesn't know how to deal with movw/movt.
840 if (KernelOrKext)
841 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000842}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000843
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000844void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000845 bool KernelOrKext) const {
846 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000847 // Get the effective triple, which takes into account the deployment target.
848 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
849 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000850
851 // Select the ABI to use.
852 //
853 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000854 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000855 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000856 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000857 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000858 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000859 // The backend is hardwired to assume AAPCS for M-class processors, ensure
860 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000861 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000862 Triple.getOS() == llvm::Triple::UnknownOS || isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000863 ABIName = "aapcs";
864 } else {
865 ABIName = "apcs-gnu";
866 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000867 } else if (Triple.isOSWindows()) {
868 // FIXME: this is invalid for WindowsCE
869 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000870 } else {
871 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000872 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000873 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000874 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000875 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000876 ABIName = "aapcs-linux";
877 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000878 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000879 case llvm::Triple::EABI:
880 ABIName = "aapcs";
881 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000882 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000883 if (Triple.getOS() == llvm::Triple::NetBSD)
884 ABIName = "apcs-gnu";
885 else
886 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000887 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000888 }
889 }
890 CmdArgs.push_back("-target-abi");
891 CmdArgs.push_back(ABIName);
892
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000893 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000894 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000895 if (FloatABI == "soft") {
896 // Floating point operations and argument passing are soft.
897 //
898 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000899 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000900 CmdArgs.push_back("-mfloat-abi");
901 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000902 } else if (FloatABI == "softfp") {
903 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000904 CmdArgs.push_back("-mfloat-abi");
905 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000906 } else {
907 // Floating point operations and argument passing are hard.
908 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000909 CmdArgs.push_back("-mfloat-abi");
910 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000911 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000912
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000913 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000914 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
915 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000916 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000917 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000918 CmdArgs.push_back("-arm-global-merge=false");
919 else
920 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000921 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000922
Bob Wilson9c8af452013-04-11 18:53:25 +0000923 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000924 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000925 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000926}
Renato Goline17c5802015-07-27 23:44:42 +0000927// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000928
Tim Northover573cbee2014-05-24 12:52:07 +0000929/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
930/// targeting.
931static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000932 Arg *A;
933 std::string CPU;
934 // If we have -mtune or -mcpu, use that.
935 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000936 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000937 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000938 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000939 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000940 }
941
Kevin Qin110db6f2014-07-18 07:03:22 +0000942 // Handle CPU name is 'native'.
943 if (CPU == "native")
944 return llvm::sys::getHostCPUName();
945 else if (CPU.size())
946 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000947
James Molloy9b1586b2014-04-17 12:51:17 +0000948 // Make sure we pick "cyclone" if -arch is used.
949 // FIXME: Should this be picked by checking the target triple instead?
950 if (Args.getLastArg(options::OPT_arch))
951 return "cyclone";
952
953 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000954}
955
Tim Northover573cbee2014-05-24 12:52:07 +0000956void Clang::AddAArch64TargetArgs(const ArgList &Args,
957 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000958 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
959 llvm::Triple Triple(TripleStr);
960
961 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
962 Args.hasArg(options::OPT_mkernel) ||
963 Args.hasArg(options::OPT_fapple_kext))
964 CmdArgs.push_back("-disable-red-zone");
965
966 if (!Args.hasFlag(options::OPT_mimplicit_float,
967 options::OPT_mno_implicit_float, true))
968 CmdArgs.push_back("-no-implicit-float");
969
Craig Topper92fc2df2014-05-17 16:56:41 +0000970 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000971 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
972 ABIName = A->getValue();
973 else if (Triple.isOSDarwin())
974 ABIName = "darwinpcs";
975 else
976 ABIName = "aapcs";
977
978 CmdArgs.push_back("-target-abi");
979 CmdArgs.push_back(ABIName);
980
Bradley Smith9ff64332014-10-13 10:16:06 +0000981 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
982 options::OPT_mno_fix_cortex_a53_835769)) {
983 CmdArgs.push_back("-backend-option");
984 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
985 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
986 else
987 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000988 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
989 // Enabled A53 errata (835769) workaround by default on android
990 CmdArgs.push_back("-backend-option");
991 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000992 }
993
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000994 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000995 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
996 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000997 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000998 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000999 CmdArgs.push_back("-aarch64-global-merge=false");
1000 else
1001 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001002 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001003}
1004
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001005// Get CPU and ABI names. They are not independent
1006// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001007void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1008 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001009 const char *DefMips32CPU = "mips32r2";
1010 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001011
Daniel Sanders2bf13662014-07-10 14:40:57 +00001012 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1013 // default for mips64(el)?-img-linux-gnu.
1014 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1015 Triple.getEnvironment() == llvm::Triple::GNU) {
1016 DefMips32CPU = "mips32r6";
1017 DefMips64CPU = "mips64r6";
1018 }
Renato Golin7c542b42015-07-27 23:44:45 +00001019
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001020 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1021 if (Triple.getEnvironment() == llvm::Triple::Android)
1022 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001023
Brad Smithba26f582015-01-06 02:53:17 +00001024 // MIPS3 is the default for mips64*-unknown-openbsd.
1025 if (Triple.getOS() == llvm::Triple::OpenBSD)
1026 DefMips64CPU = "mips3";
1027
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001028 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001029 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001030
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001031 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001032 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001033 // Convert a GNU style Mips ABI name to the name
1034 // accepted by LLVM Mips backend.
1035 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001036 .Case("32", "o32")
1037 .Case("64", "n64")
1038 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001039 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001040
1041 // Setup default CPU and ABI names.
1042 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001043 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001044 default:
1045 llvm_unreachable("Unexpected triple arch name");
1046 case llvm::Triple::mips:
1047 case llvm::Triple::mipsel:
1048 CPUName = DefMips32CPU;
1049 break;
1050 case llvm::Triple::mips64:
1051 case llvm::Triple::mips64el:
1052 CPUName = DefMips64CPU;
1053 break;
1054 }
1055 }
1056
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001057 if (ABIName.empty()) {
1058 // Deduce ABI name from the target triple.
1059 if (Triple.getArch() == llvm::Triple::mips ||
1060 Triple.getArch() == llvm::Triple::mipsel)
1061 ABIName = "o32";
1062 else
1063 ABIName = "n64";
1064 }
1065
1066 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001067 // Deduce CPU name from ABI name.
1068 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001069 .Cases("o32", "eabi", DefMips32CPU)
1070 .Cases("n32", "n64", DefMips64CPU)
1071 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001072 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001073
1074 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001075}
1076
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001077// Convert ABI name to the GNU tools acceptable variant.
1078static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1079 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001080 .Case("o32", "32")
1081 .Case("n64", "64")
1082 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001083}
1084
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001085// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1086// and -mfloat-abi=.
1087static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001088 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 if (Arg *A =
1090 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1091 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001092 if (A->getOption().matches(options::OPT_msoft_float))
1093 FloatABI = "soft";
1094 else if (A->getOption().matches(options::OPT_mhard_float))
1095 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001096 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001097 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001098 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001099 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001100 FloatABI = "hard";
1101 }
1102 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001103 }
1104
1105 // If unspecified, choose the default based on the platform.
1106 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001107 // Assume "hard", because it's a default value used by gcc.
1108 // When we start to recognize specific target MIPS processors,
1109 // we will be able to select the default more correctly.
1110 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001111 }
1112
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001113 return FloatABI;
1114}
1115
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001116static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001117 std::vector<const char *> &Features,
1118 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001119 StringRef FeatureName) {
1120 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001121 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001122 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001123 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001124 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001125 }
1126}
1127
Daniel Sanders379d44b2014-07-16 11:52:23 +00001128static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1129 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001131 StringRef CPUName;
1132 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001133 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001134 ABIName = getGnuCompatibleMipsABIName(ABIName);
1135
Daniel Sandersfeb61302014-08-08 15:47:17 +00001136 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1137 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001138
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001139 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001140 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001141 // FIXME: Note, this is a hack. We need to pass the selected float
1142 // mode to the MipsTargetInfoBase to define appropriate macros there.
1143 // Now it is the only method.
1144 Features.push_back("+soft-float");
1145 }
1146
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001147 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001148 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001149 if (Val == "2008") {
1150 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1151 Features.push_back("+nan2008");
1152 else {
1153 Features.push_back("-nan2008");
1154 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1155 }
1156 } else if (Val == "legacy") {
1157 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1158 Features.push_back("-nan2008");
1159 else {
1160 Features.push_back("+nan2008");
1161 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1162 }
1163 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001164 D.Diag(diag::err_drv_unsupported_option_argument)
1165 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001166 }
1167
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001168 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1169 options::OPT_mdouble_float, "single-float");
1170 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1171 "mips16");
1172 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1173 options::OPT_mno_micromips, "micromips");
1174 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1175 "dsp");
1176 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1177 "dspr2");
1178 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1179 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001180
1181 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1182 // pass -mfpxx
1183 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1184 options::OPT_mfp64)) {
1185 if (A->getOption().matches(options::OPT_mfp32))
1186 Features.push_back(Args.MakeArgString("-fp64"));
1187 else if (A->getOption().matches(options::OPT_mfpxx)) {
1188 Features.push_back(Args.MakeArgString("+fpxx"));
1189 Features.push_back(Args.MakeArgString("+nooddspreg"));
1190 } else
1191 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001192 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001193 Features.push_back(Args.MakeArgString("+fpxx"));
1194 Features.push_back(Args.MakeArgString("+nooddspreg"));
1195 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001196
Daniel Sanders28e5d392014-07-10 10:39:51 +00001197 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1198 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001199}
1200
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001201void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001202 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001203 const Driver &D = getToolChain().getDriver();
1204 StringRef CPUName;
1205 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001206 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001207 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208
1209 CmdArgs.push_back("-target-abi");
1210 CmdArgs.push_back(ABIName.data());
1211
1212 StringRef FloatABI = getMipsFloatABI(D, Args);
1213
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001214 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001215 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001216 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001217 CmdArgs.push_back("-mfloat-abi");
1218 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001219 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001220 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001221 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001222 CmdArgs.push_back("-mfloat-abi");
1223 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001224 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001225
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001226 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1227 if (A->getOption().matches(options::OPT_mxgot)) {
1228 CmdArgs.push_back("-mllvm");
1229 CmdArgs.push_back("-mxgot");
1230 }
1231 }
1232
Simon Atanasyanc580b322013-05-11 06:33:44 +00001233 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1234 options::OPT_mno_ldc1_sdc1)) {
1235 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1236 CmdArgs.push_back("-mllvm");
1237 CmdArgs.push_back("-mno-ldc1-sdc1");
1238 }
1239 }
1240
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001241 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1242 options::OPT_mno_check_zero_division)) {
1243 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1244 CmdArgs.push_back("-mllvm");
1245 CmdArgs.push_back("-mno-check-zero-division");
1246 }
1247 }
1248
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001249 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001250 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001251 CmdArgs.push_back("-mllvm");
1252 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1253 A->claim();
1254 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001255}
1256
Hal Finkel8eb59282012-06-11 22:35:19 +00001257/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1258static std::string getPPCTargetCPU(const ArgList &Args) {
1259 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001260 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001261
1262 if (CPUName == "native") {
1263 std::string CPU = llvm::sys::getHostCPUName();
1264 if (!CPU.empty() && CPU != "generic")
1265 return CPU;
1266 else
1267 return "";
1268 }
1269
1270 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001271 .Case("common", "generic")
1272 .Case("440", "440")
1273 .Case("440fp", "440")
1274 .Case("450", "450")
1275 .Case("601", "601")
1276 .Case("602", "602")
1277 .Case("603", "603")
1278 .Case("603e", "603e")
1279 .Case("603ev", "603ev")
1280 .Case("604", "604")
1281 .Case("604e", "604e")
1282 .Case("620", "620")
1283 .Case("630", "pwr3")
1284 .Case("G3", "g3")
1285 .Case("7400", "7400")
1286 .Case("G4", "g4")
1287 .Case("7450", "7450")
1288 .Case("G4+", "g4+")
1289 .Case("750", "750")
1290 .Case("970", "970")
1291 .Case("G5", "g5")
1292 .Case("a2", "a2")
1293 .Case("a2q", "a2q")
1294 .Case("e500mc", "e500mc")
1295 .Case("e5500", "e5500")
1296 .Case("power3", "pwr3")
1297 .Case("power4", "pwr4")
1298 .Case("power5", "pwr5")
1299 .Case("power5x", "pwr5x")
1300 .Case("power6", "pwr6")
1301 .Case("power6x", "pwr6x")
1302 .Case("power7", "pwr7")
1303 .Case("power8", "pwr8")
1304 .Case("pwr3", "pwr3")
1305 .Case("pwr4", "pwr4")
1306 .Case("pwr5", "pwr5")
1307 .Case("pwr5x", "pwr5x")
1308 .Case("pwr6", "pwr6")
1309 .Case("pwr6x", "pwr6x")
1310 .Case("pwr7", "pwr7")
1311 .Case("pwr8", "pwr8")
1312 .Case("powerpc", "ppc")
1313 .Case("powerpc64", "ppc64")
1314 .Case("powerpc64le", "ppc64le")
1315 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001316 }
1317
1318 return "";
1319}
1320
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001321static void getPPCTargetFeatures(const ArgList &Args,
1322 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001323 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1324 StringRef Name = A->getOption().getName();
1325 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001326
1327 // Skip over "-m".
1328 assert(Name.startswith("m") && "Invalid feature name.");
1329 Name = Name.substr(1);
1330
1331 bool IsNegative = Name.startswith("no-");
1332 if (IsNegative)
1333 Name = Name.substr(3);
1334
1335 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1336 // pass the correct option to the backend while calling the frontend
1337 // option the same.
1338 // TODO: Change the LLVM backend option maybe?
1339 if (Name == "mfcrf")
1340 Name = "mfocrf";
1341
1342 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1343 }
1344
1345 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001346 AddTargetFeature(Args, Features, options::OPT_faltivec,
1347 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001348}
1349
Ulrich Weigand8afad612014-07-28 13:17:52 +00001350void Clang::AddPPCTargetArgs(const ArgList &Args,
1351 ArgStringList &CmdArgs) const {
1352 // Select the ABI to use.
1353 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001354 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001355 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001356 case llvm::Triple::ppc64: {
1357 // When targeting a processor that supports QPX, or if QPX is
1358 // specifically enabled, default to using the ABI that supports QPX (so
1359 // long as it is not specifically disabled).
1360 bool HasQPX = false;
1361 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1362 HasQPX = A->getValue() == StringRef("a2q");
1363 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1364 if (HasQPX) {
1365 ABIName = "elfv1-qpx";
1366 break;
1367 }
1368
Ulrich Weigand8afad612014-07-28 13:17:52 +00001369 ABIName = "elfv1";
1370 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001371 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001372 case llvm::Triple::ppc64le:
1373 ABIName = "elfv2";
1374 break;
1375 default:
1376 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001377 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001378
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001379 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1380 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1381 // the option if given as we don't have backend support for any targets
1382 // that don't use the altivec abi.
1383 if (StringRef(A->getValue()) != "altivec")
1384 ABIName = A->getValue();
1385
Ulrich Weigand8afad612014-07-28 13:17:52 +00001386 if (ABIName) {
1387 CmdArgs.push_back("-target-abi");
1388 CmdArgs.push_back(ABIName);
1389 }
1390}
1391
1392bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1393 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1394 return A && (A->getValue() == StringRef(Value));
1395}
1396
Tom Stellard6674c702013-04-01 20:56:53 +00001397/// Get the (LLVM) name of the R600 gpu we are targeting.
1398static std::string getR600TargetGPU(const ArgList &Args) {
1399 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001400 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001401 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001402 .Cases("rv630", "rv635", "r600")
1403 .Cases("rv610", "rv620", "rs780", "rs880")
1404 .Case("rv740", "rv770")
1405 .Case("palm", "cedar")
1406 .Cases("sumo", "sumo2", "sumo")
1407 .Case("hemlock", "cypress")
1408 .Case("aruba", "cayman")
1409 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001410 }
1411 return "";
1412}
1413
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001414void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001415 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001416 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001417 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001418
James Y Knightb2406522015-06-15 20:51:24 +00001419 bool SoftFloatABI = false;
1420 if (Arg *A =
1421 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001422 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001423 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001424 }
1425
James Y Knightb2406522015-06-15 20:51:24 +00001426 // Only the hard-float ABI on Sparc is standardized, and it is the
1427 // default. GCC also supports a nonstandard soft-float ABI mode, and
1428 // perhaps LLVM should implement that, too. However, since llvm
1429 // currently does not support Sparc soft-float, at all, display an
1430 // error if it's requested.
1431 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001432 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1433 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001434 }
1435}
1436
Richard Sandiford4652d892013-07-19 16:51:51 +00001437static const char *getSystemZTargetCPU(const ArgList &Args) {
1438 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1439 return A->getValue();
1440 return "z10";
1441}
1442
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001443static void getSystemZTargetFeatures(const ArgList &Args,
1444 std::vector<const char *> &Features) {
1445 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001446 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001447 if (A->getOption().matches(options::OPT_mhtm))
1448 Features.push_back("+transactional-execution");
1449 else
1450 Features.push_back("-transactional-execution");
1451 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001452 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001453 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001454 if (A->getOption().matches(options::OPT_mvx))
1455 Features.push_back("+vector");
1456 else
1457 Features.push_back("-vector");
1458 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001459}
1460
Chandler Carruth953fb082013-01-13 11:46:33 +00001461static const char *getX86TargetCPU(const ArgList &Args,
1462 const llvm::Triple &Triple) {
1463 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001464 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001465 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001466 return "core-avx2";
1467
Chandler Carruth953fb082013-01-13 11:46:33 +00001468 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001469 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001470
1471 // FIXME: Reject attempts to use -march=native unless the target matches
1472 // the host.
1473 //
1474 // FIXME: We should also incorporate the detected target features for use
1475 // with -native.
1476 std::string CPU = llvm::sys::getHostCPUName();
1477 if (!CPU.empty() && CPU != "generic")
1478 return Args.MakeArgString(CPU);
1479 }
1480
Reid Kleckner3123eff2015-06-30 16:32:04 +00001481 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1482 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1483 StringRef Arch = A->getValue();
1484 const char *CPU;
1485 if (Triple.getArch() == llvm::Triple::x86) {
1486 CPU = llvm::StringSwitch<const char *>(Arch)
1487 .Case("IA32", "i386")
1488 .Case("SSE", "pentium3")
1489 .Case("SSE2", "pentium4")
1490 .Case("AVX", "sandybridge")
1491 .Case("AVX2", "haswell")
1492 .Default(nullptr);
1493 } else {
1494 CPU = llvm::StringSwitch<const char *>(Arch)
1495 .Case("AVX", "sandybridge")
1496 .Case("AVX2", "haswell")
1497 .Default(nullptr);
1498 }
1499 if (CPU)
1500 return CPU;
1501 }
1502
Chandler Carruth953fb082013-01-13 11:46:33 +00001503 // Select the default CPU if none was given (or detection failed).
1504
1505 if (Triple.getArch() != llvm::Triple::x86_64 &&
1506 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001507 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001508
1509 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1510
1511 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001512 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001513 if (Triple.getArchName() == "x86_64h")
1514 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001515 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001516 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001517
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001518 // Set up default CPU name for PS4 compilers.
1519 if (Triple.isPS4CPU())
1520 return "btver2";
1521
Alexey Bataev286d1b92014-01-31 04:07:13 +00001522 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001523 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001524 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001525
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001526 // Everything else goes to x86-64 in 64-bit mode.
1527 if (Is64Bit)
1528 return "x86-64";
1529
1530 switch (Triple.getOS()) {
1531 case llvm::Triple::FreeBSD:
1532 case llvm::Triple::NetBSD:
1533 case llvm::Triple::OpenBSD:
1534 return "i486";
1535 case llvm::Triple::Haiku:
1536 return "i586";
1537 case llvm::Triple::Bitrig:
1538 return "i686";
1539 default:
1540 // Fallback to p4.
1541 return "pentium4";
1542 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001543}
1544
Renato Golin7c542b42015-07-27 23:44:45 +00001545static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1546 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001547 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001548 default:
1549 return "";
1550
Amara Emerson703da2e2013-10-31 09:32:33 +00001551 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001552 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001553 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001554
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001555 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001556 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001557 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001558 case llvm::Triple::thumbeb: {
1559 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001560 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001561 return arm::getARMTargetCPU(MCPU, MArch, T);
1562 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001563 case llvm::Triple::mips:
1564 case llvm::Triple::mipsel:
1565 case llvm::Triple::mips64:
1566 case llvm::Triple::mips64el: {
1567 StringRef CPUName;
1568 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001569 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001570 return CPUName;
1571 }
1572
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001573 case llvm::Triple::nvptx:
1574 case llvm::Triple::nvptx64:
1575 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1576 return A->getValue();
1577 return "";
1578
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001579 case llvm::Triple::ppc:
1580 case llvm::Triple::ppc64:
1581 case llvm::Triple::ppc64le: {
1582 std::string TargetCPUName = getPPCTargetCPU(Args);
1583 // LLVM may default to generating code for the native CPU,
1584 // but, like gcc, we default to a more generic option for
1585 // each architecture. (except on Darwin)
1586 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1587 if (T.getArch() == llvm::Triple::ppc64)
1588 TargetCPUName = "ppc64";
1589 else if (T.getArch() == llvm::Triple::ppc64le)
1590 TargetCPUName = "ppc64le";
1591 else
1592 TargetCPUName = "ppc";
1593 }
1594 return TargetCPUName;
1595 }
1596
1597 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001598 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001599 case llvm::Triple::sparcv9:
1600 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001601 return A->getValue();
1602 return "";
1603
1604 case llvm::Triple::x86:
1605 case llvm::Triple::x86_64:
1606 return getX86TargetCPU(Args, T);
1607
1608 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001609 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001610
1611 case llvm::Triple::systemz:
1612 return getSystemZTargetCPU(Args);
1613
1614 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001615 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001616 return getR600TargetGPU(Args);
1617 }
1618}
1619
Alp Tokerce365ca2013-12-02 12:43:03 +00001620static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1621 ArgStringList &CmdArgs) {
1622 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1623 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1624 // forward.
1625 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001626 std::string Plugin =
1627 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001628 CmdArgs.push_back(Args.MakeArgString(Plugin));
1629
1630 // Try to pass driver level flags relevant to LTO code generation down to
1631 // the plugin.
1632
1633 // Handle flags for selecting CPU variants.
1634 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1635 if (!CPU.empty())
1636 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1637}
1638
Sanjay Patel2987c292015-06-11 14:53:41 +00001639/// This is a helper function for validating the optional refinement step
1640/// parameter in reciprocal argument strings. Return false if there is an error
1641/// parsing the refinement step. Otherwise, return true and set the Position
1642/// of the refinement step in the input string.
1643static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001644 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001645 const char RefinementStepToken = ':';
1646 Position = In.find(RefinementStepToken);
1647 if (Position != StringRef::npos) {
1648 StringRef Option = A.getOption().getName();
1649 StringRef RefStep = In.substr(Position + 1);
1650 // Allow exactly one numeric character for the additional refinement
1651 // step parameter. This is reasonable for all currently-supported
1652 // operations and architectures because we would expect that a larger value
1653 // of refinement steps would cause the estimate "optimization" to
1654 // under-perform the native operation. Also, if the estimate does not
1655 // converge quickly, it probably will not ever converge, so further
1656 // refinement steps will not produce a better answer.
1657 if (RefStep.size() != 1) {
1658 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1659 return false;
1660 }
1661 char RefStepChar = RefStep[0];
1662 if (RefStepChar < '0' || RefStepChar > '9') {
1663 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1664 return false;
1665 }
1666 }
1667 return true;
1668}
1669
1670/// The -mrecip flag requires processing of many optional parameters.
1671static void ParseMRecip(const Driver &D, const ArgList &Args,
1672 ArgStringList &OutStrings) {
1673 StringRef DisabledPrefixIn = "!";
1674 StringRef DisabledPrefixOut = "!";
1675 StringRef EnabledPrefixOut = "";
1676 StringRef Out = "-mrecip=";
1677
1678 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1679 if (!A)
1680 return;
1681
1682 unsigned NumOptions = A->getNumValues();
1683 if (NumOptions == 0) {
1684 // No option is the same as "all".
1685 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1686 return;
1687 }
1688
1689 // Pass through "all", "none", or "default" with an optional refinement step.
1690 if (NumOptions == 1) {
1691 StringRef Val = A->getValue(0);
1692 size_t RefStepLoc;
1693 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1694 return;
1695 StringRef ValBase = Val.slice(0, RefStepLoc);
1696 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1697 OutStrings.push_back(Args.MakeArgString(Out + Val));
1698 return;
1699 }
1700 }
1701
1702 // Each reciprocal type may be enabled or disabled individually.
1703 // Check each input value for validity, concatenate them all back together,
1704 // and pass through.
1705
1706 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001707 OptionStrings.insert(std::make_pair("divd", false));
1708 OptionStrings.insert(std::make_pair("divf", false));
1709 OptionStrings.insert(std::make_pair("vec-divd", false));
1710 OptionStrings.insert(std::make_pair("vec-divf", false));
1711 OptionStrings.insert(std::make_pair("sqrtd", false));
1712 OptionStrings.insert(std::make_pair("sqrtf", false));
1713 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1714 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001715
1716 for (unsigned i = 0; i != NumOptions; ++i) {
1717 StringRef Val = A->getValue(i);
1718
1719 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1720 // Ignore the disablement token for string matching.
1721 if (IsDisabled)
1722 Val = Val.substr(1);
1723
1724 size_t RefStep;
1725 if (!getRefinementStep(Val, D, *A, RefStep))
1726 return;
1727
1728 StringRef ValBase = Val.slice(0, RefStep);
1729 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1730 if (OptionIter == OptionStrings.end()) {
1731 // Try again specifying float suffix.
1732 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1733 if (OptionIter == OptionStrings.end()) {
1734 // The input name did not match any known option string.
1735 D.Diag(diag::err_drv_unknown_argument) << Val;
1736 return;
1737 }
1738 // The option was specified without a float or double suffix.
1739 // Make sure that the double entry was not already specified.
1740 // The float entry will be checked below.
1741 if (OptionStrings[ValBase.str() + 'd']) {
1742 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1743 return;
1744 }
1745 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001746
Sanjay Patel2987c292015-06-11 14:53:41 +00001747 if (OptionIter->second == true) {
1748 // Duplicate option specified.
1749 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1750 return;
1751 }
1752
1753 // Mark the matched option as found. Do not allow duplicate specifiers.
1754 OptionIter->second = true;
1755
1756 // If the precision was not specified, also mark the double entry as found.
1757 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1758 OptionStrings[ValBase.str() + 'd'] = true;
1759
1760 // Build the output string.
1761 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1762 Out = Args.MakeArgString(Out + Prefix + Val);
1763 if (i != NumOptions - 1)
1764 Out = Args.MakeArgString(Out + ",");
1765 }
1766
1767 OutStrings.push_back(Args.MakeArgString(Out));
1768}
1769
Eric Christopherc54920a2015-03-23 19:26:05 +00001770static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001771 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001772 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001773 // If -march=native, autodetect the feature list.
1774 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1775 if (StringRef(A->getValue()) == "native") {
1776 llvm::StringMap<bool> HostFeatures;
1777 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1778 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001779 Features.push_back(
1780 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001781 }
1782 }
1783
Jim Grosbach82eee262013-11-16 00:53:35 +00001784 if (Triple.getArchName() == "x86_64h") {
1785 // x86_64h implies quite a few of the more modern subtarget features
1786 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1787 Features.push_back("-rdrnd");
1788 Features.push_back("-aes");
1789 Features.push_back("-pclmul");
1790 Features.push_back("-rtm");
1791 Features.push_back("-hle");
1792 Features.push_back("-fsgsbase");
1793 }
1794
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001795 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001796 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001797 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001798 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001799 Features.push_back("+sse4.2");
1800 Features.push_back("+popcnt");
1801 } else
1802 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001803 }
1804
Eric Christopherc54920a2015-03-23 19:26:05 +00001805 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001806 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1807 StringRef Arch = A->getValue();
1808 bool ArchUsed = false;
1809 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001810 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001811 if (Arch == "AVX" || Arch == "AVX2") {
1812 ArchUsed = true;
1813 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1814 }
1815 }
1816 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001817 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001818 if (Arch == "IA32") {
1819 ArchUsed = true;
1820 } else if (Arch == "SSE" || Arch == "SSE2") {
1821 ArchUsed = true;
1822 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1823 }
1824 }
1825 if (!ArchUsed)
1826 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1827 }
1828
Jim Grosbach82eee262013-11-16 00:53:35 +00001829 // Now add any that the user explicitly requested on the command line,
1830 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001831 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1832 StringRef Name = A->getOption().getName();
1833 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001834
1835 // Skip over "-m".
1836 assert(Name.startswith("m") && "Invalid feature name.");
1837 Name = Name.substr(1);
1838
1839 bool IsNegative = Name.startswith("no-");
1840 if (IsNegative)
1841 Name = Name.substr(3);
1842
1843 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1844 }
1845}
1846
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001847void Clang::AddX86TargetArgs(const ArgList &Args,
1848 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001849 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001850 Args.hasArg(options::OPT_mkernel) ||
1851 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001852 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001853
Bob Wilson2616e2e2013-02-10 16:01:41 +00001854 // Default to avoid implicit floating-point for kernel/kext code, but allow
1855 // that to be overridden with -mno-soft-float.
1856 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1857 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001858 if (Arg *A = Args.getLastArg(
1859 options::OPT_msoft_float, options::OPT_mno_soft_float,
1860 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001861 const Option &O = A->getOption();
1862 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1863 O.matches(options::OPT_msoft_float));
1864 }
1865 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001866 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001867
1868 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1869 StringRef Value = A->getValue();
1870 if (Value == "intel" || Value == "att") {
1871 CmdArgs.push_back("-mllvm");
1872 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1873 } else {
1874 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1875 << A->getOption().getName() << Value;
1876 }
1877 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001878}
1879
Tony Linthicum76329bf2011-12-12 21:14:55 +00001880void Clang::AddHexagonTargetArgs(const ArgList &Args,
1881 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001882 CmdArgs.push_back("-mqdsp6-compat");
1883 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001884
Douglas Katzman54366072015-07-27 16:53:08 +00001885 if (const char *v =
1886 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001887 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001888 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001889 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001890 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001891 }
1892
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001893 if (!Args.hasArg(options::OPT_fno_short_enums))
1894 CmdArgs.push_back("-fshort-enums");
1895 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001896 CmdArgs.push_back("-mllvm");
1897 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001898 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001899 CmdArgs.push_back("-mllvm");
1900 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001901}
1902
Kevin Qin110db6f2014-07-18 07:03:22 +00001903// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001904static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001905 std::vector<const char *> &Features) {
1906 SmallVector<StringRef, 8> Split;
1907 text.split(Split, StringRef("+"), -1, false);
1908
Douglas Katzman2675d012015-06-29 19:12:56 +00001909 for (const StringRef Feature : Split) {
1910 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001911 .Case("fp", "+fp-armv8")
1912 .Case("simd", "+neon")
1913 .Case("crc", "+crc")
1914 .Case("crypto", "+crypto")
1915 .Case("nofp", "-fp-armv8")
1916 .Case("nosimd", "-neon")
1917 .Case("nocrc", "-crc")
1918 .Case("nocrypto", "-crypto")
1919 .Default(nullptr);
1920 if (result)
1921 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001922 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001923 D.Diag(diag::err_drv_no_neon_modifier);
1924 else
1925 return false;
1926 }
1927 return true;
1928}
1929
1930// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1931// decode CPU and feature.
1932static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1933 std::vector<const char *> &Features) {
1934 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1935 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001936 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1937 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001938 Features.push_back("+neon");
1939 Features.push_back("+crc");
1940 Features.push_back("+crypto");
1941 } else if (CPU == "generic") {
1942 Features.push_back("+neon");
1943 } else {
1944 return false;
1945 }
1946
1947 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1948 return false;
1949
1950 return true;
1951}
1952
1953static bool
1954getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1955 const ArgList &Args,
1956 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001957 std::string MarchLowerCase = March.lower();
1958 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001959
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001960 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001961 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001962 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001963 Features.push_back("+v8.1a");
1964 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001965 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001966 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001967
1968 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1969 return false;
1970
1971 return true;
1972}
1973
1974static bool
1975getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1976 const ArgList &Args,
1977 std::vector<const char *> &Features) {
1978 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001979 std::string McpuLowerCase = Mcpu.lower();
1980 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001981 return false;
1982
1983 return true;
1984}
1985
1986static bool
1987getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1988 const ArgList &Args,
1989 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001990 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001991 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001992 if (MtuneLowerCase == "native")
1993 MtuneLowerCase = llvm::sys::getHostCPUName();
1994 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001995 Features.push_back("+zcm");
1996 Features.push_back("+zcz");
1997 }
1998 return true;
1999}
2000
2001static bool
2002getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2003 const ArgList &Args,
2004 std::vector<const char *> &Features) {
2005 StringRef CPU;
2006 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002007 std::string McpuLowerCase = Mcpu.lower();
2008 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002009 return false;
2010
2011 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2012}
2013
Akira Hatanaka92500472015-07-27 19:29:04 +00002014static void getAArch64TargetFeatures(const Driver &D,
2015 const llvm::Triple &Triple,
2016 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002017 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002018 Arg *A;
2019 bool success = true;
2020 // Enable NEON by default.
2021 Features.push_back("+neon");
2022 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2023 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2024 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2025 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002026 else if (Args.hasArg(options::OPT_arch))
2027 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2028 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002029
2030 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2031 success =
2032 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2033 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2034 success =
2035 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002036 else if (Args.hasArg(options::OPT_arch))
2037 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2038 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002039
2040 if (!success)
2041 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002042
2043 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2044 Features.push_back("-fp-armv8");
2045 Features.push_back("-crypto");
2046 Features.push_back("-neon");
2047 }
Bradley Smith418c5932014-05-02 15:17:51 +00002048
2049 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002050 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002051 if (A->getOption().matches(options::OPT_mcrc))
2052 Features.push_back("+crc");
2053 else
2054 Features.push_back("-crc");
2055 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002056
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002057 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2058 options::OPT_munaligned_access))
2059 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2060 Features.push_back("+strict-align");
2061
Akira Hatanaka92500472015-07-27 19:29:04 +00002062 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002063 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002064}
2065
2066static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002067 const ArgList &Args, ArgStringList &CmdArgs,
2068 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002069 std::vector<const char *> Features;
2070 switch (Triple.getArch()) {
2071 default:
2072 break;
2073 case llvm::Triple::mips:
2074 case llvm::Triple::mipsel:
2075 case llvm::Triple::mips64:
2076 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002077 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002078 break;
2079
2080 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002081 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002082 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002083 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002084 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002085 break;
2086
2087 case llvm::Triple::ppc:
2088 case llvm::Triple::ppc64:
2089 case llvm::Triple::ppc64le:
2090 getPPCTargetFeatures(Args, Features);
2091 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002092 case llvm::Triple::systemz:
2093 getSystemZTargetFeatures(Args, Features);
2094 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002095 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002096 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002097 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002098 break;
2099 case llvm::Triple::x86:
2100 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002101 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002102 break;
2103 }
Rafael Espindola43964802013-08-21 17:34:32 +00002104
2105 // Find the last of each feature.
2106 llvm::StringMap<unsigned> LastOpt;
2107 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2108 const char *Name = Features[I];
2109 assert(Name[0] == '-' || Name[0] == '+');
2110 LastOpt[Name + 1] = I;
2111 }
2112
2113 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2114 // If this feature was overridden, ignore it.
2115 const char *Name = Features[I];
2116 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2117 assert(LastI != LastOpt.end());
2118 unsigned Last = LastI->second;
2119 if (Last != I)
2120 continue;
2121
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002122 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002123 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002124 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002125}
2126
David Majnemerae394812014-12-09 00:12:30 +00002127static bool
2128shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2129 const llvm::Triple &Triple) {
2130 // We use the zero-cost exception tables for Objective-C if the non-fragile
2131 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2132 // later.
2133 if (runtime.isNonFragile())
2134 return true;
2135
2136 if (!Triple.isMacOSX())
2137 return false;
2138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002139 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002140 (Triple.getArch() == llvm::Triple::x86_64 ||
2141 Triple.getArch() == llvm::Triple::arm));
2142}
2143
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002144/// Adds exception related arguments to the driver command arguments. There's a
2145/// master flag, -fexceptions and also language specific flags to enable/disable
2146/// C++ and Objective-C exceptions. This makes it possible to for example
2147/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002148static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002149 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002150 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002151 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002152 const Driver &D = TC.getDriver();
2153 const llvm::Triple &Triple = TC.getTriple();
2154
Chad Rosier4fab82c2012-03-26 22:04:46 +00002155 if (KernelOrKext) {
2156 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2157 // arguments now to avoid warnings about unused arguments.
2158 Args.ClaimAllArgs(options::OPT_fexceptions);
2159 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2160 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2161 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2162 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2163 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002164 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002165 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002166
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002167 // See if the user explicitly enabled exceptions.
2168 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2169 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002170
David Majnemerae394812014-12-09 00:12:30 +00002171 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2172 // is not necessarily sensible, but follows GCC.
2173 if (types::isObjC(InputType) &&
2174 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002175 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002176 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002177
David Majnemerae394812014-12-09 00:12:30 +00002178 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002179 }
2180
2181 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002182 // Disable C++ EH by default on XCore, PS4, and MSVC.
2183 // FIXME: Remove MSVC from this list once things work.
2184 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2185 !Triple.isPS4CPU() &&
2186 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002187 Arg *ExceptionArg = Args.getLastArg(
2188 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2189 options::OPT_fexceptions, options::OPT_fno_exceptions);
2190 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002191 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002192 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2193 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002194
2195 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002196 if (Triple.isPS4CPU()) {
2197 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2198 assert(ExceptionArg &&
2199 "On the PS4 exceptions should only be enabled if passing "
2200 "an argument");
2201 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2202 const Arg *RTTIArg = TC.getRTTIArg();
2203 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2204 D.Diag(diag::err_drv_argument_not_allowed_with)
2205 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2206 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2207 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2208 } else
2209 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2210
Anders Carlssone96ab552011-02-28 02:27:16 +00002211 CmdArgs.push_back("-fcxx-exceptions");
2212
David Majnemer8de68642014-12-05 08:11:58 +00002213 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002214 }
2215 }
2216
David Majnemer8de68642014-12-05 08:11:58 +00002217 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002218 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002219}
2220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002221static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002222 bool Default = true;
2223 if (TC.getTriple().isOSDarwin()) {
2224 // The native darwin assembler doesn't support the linker_option directives,
2225 // so we disable them if we think the .s file will be passed to it.
2226 Default = TC.useIntegratedAs();
2227 }
2228 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2229 Default);
2230}
2231
Ted Kremenek62093662013-03-12 17:02:12 +00002232static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2233 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002234 bool UseDwarfDirectory =
2235 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2236 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002237 return !UseDwarfDirectory;
2238}
2239
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002240/// \brief Check whether the given input tree contains any compilation actions.
2241static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002242 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002243 return true;
2244
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002245 for (const auto &Act : *A)
2246 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002247 return true;
2248
2249 return false;
2250}
2251
2252/// \brief Check if -relax-all should be passed to the internal assembler.
2253/// This is done by default when compiling non-assembler source with -O0.
2254static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2255 bool RelaxDefault = true;
2256
2257 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2258 RelaxDefault = A->getOption().matches(options::OPT_O0);
2259
2260 if (RelaxDefault) {
2261 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002262 for (const auto &Act : C.getActions()) {
2263 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002264 RelaxDefault = true;
2265 break;
2266 }
2267 }
2268 }
2269
2270 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002271 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002272}
2273
David Blaikie9260ed62013-07-25 21:19:01 +00002274static void CollectArgsForIntegratedAssembler(Compilation &C,
2275 const ArgList &Args,
2276 ArgStringList &CmdArgs,
2277 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002278 if (UseRelaxAll(C, Args))
2279 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002280
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002281 // When passing -I arguments to the assembler we sometimes need to
2282 // unconditionally take the next argument. For example, when parsing
2283 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2284 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2285 // arg after parsing the '-I' arg.
2286 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002287
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002288 // When using an integrated assembler, translate -Wa, and -Xassembler
2289 // options.
2290 bool CompressDebugSections = false;
2291 for (const Arg *A :
2292 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2293 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002294
Renato Golin7c542b42015-07-27 23:44:45 +00002295 for (const StringRef Value : A->getValues()) {
2296 if (TakeNextArg) {
2297 CmdArgs.push_back(Value.data());
2298 TakeNextArg = false;
2299 continue;
2300 }
David Blaikie9260ed62013-07-25 21:19:01 +00002301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002302 if (Value == "-force_cpusubtype_ALL") {
2303 // Do nothing, this is the default and we don't support anything else.
2304 } else if (Value == "-L") {
2305 CmdArgs.push_back("-msave-temp-labels");
2306 } else if (Value == "--fatal-warnings") {
2307 CmdArgs.push_back("-massembler-fatal-warnings");
2308 } else if (Value == "--noexecstack") {
2309 CmdArgs.push_back("-mnoexecstack");
2310 } else if (Value == "-compress-debug-sections" ||
2311 Value == "--compress-debug-sections") {
2312 CompressDebugSections = true;
2313 } else if (Value == "-nocompress-debug-sections" ||
2314 Value == "--nocompress-debug-sections") {
2315 CompressDebugSections = false;
2316 } else if (Value.startswith("-I")) {
2317 CmdArgs.push_back(Value.data());
2318 // We need to consume the next argument if the current arg is a plain
2319 // -I. The next arg will be the include directory.
2320 if (Value == "-I")
2321 TakeNextArg = true;
2322 } else if (Value.startswith("-gdwarf-")) {
2323 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002324 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2325 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2326 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002327 } else {
2328 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002329 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002330 }
2331 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002332 }
2333 if (CompressDebugSections) {
2334 if (llvm::zlib::isAvailable())
2335 CmdArgs.push_back("-compress-debug-sections");
2336 else
2337 D.Diag(diag::warn_debug_compression_unavailable);
2338 }
David Blaikie9260ed62013-07-25 21:19:01 +00002339}
2340
Renato Goline807c122014-01-31 11:47:28 +00002341// Until ARM libraries are build separately, we have them all in one library
2342static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002343 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002344 TC.getArch() == llvm::Triple::x86)
2345 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002346 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002347 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002348 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002349}
2350
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002351static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2352 // The runtimes are located in the OS-specific resource directory.
2353 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002354 const llvm::Triple &Triple = TC.getTriple();
2355 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002356 StringRef OSLibName =
2357 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002358 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002359 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002360}
2361
Peter Collingbourne581f4382015-07-02 01:48:12 +00002362SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2363 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002364 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2365 ? "-android"
2366 : "";
2367
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002368 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002369 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2370 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002371 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002372 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002373 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002374 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002375
2376 SmallString<128> Path = getCompilerRTLibDir(TC);
2377 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2378 Arch + Env + Suffix);
2379
2380 return Path;
2381}
2382
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002383// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002384// FIXME: Make sure we can also emit shared objects if they're requested
2385// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002386static void addClangRT(const ToolChain &TC, const ArgList &Args,
2387 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002388 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002389}
2390
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002391static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2392 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002393 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2394 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002395 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002396 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002397 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002398 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002399 Args.hasArg(options::OPT_fcreate_profile) ||
2400 Args.hasArg(options::OPT_coverage)))
2401 return;
2402
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002403 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002404}
2405
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002406namespace {
2407enum OpenMPRuntimeKind {
2408 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2409 /// without knowing what runtime to target.
2410 OMPRT_Unknown,
2411
2412 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2413 /// the default for Clang.
2414 OMPRT_OMP,
2415
2416 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2417 /// this runtime but can swallow the pragmas, and find and link against the
2418 /// runtime library itself.
2419 OMPRT_GOMP,
2420
Chandler Carruthc6625c62015-05-28 21:10:31 +00002421 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002422 /// OpenMP runtime. We support this mode for users with existing dependencies
2423 /// on this runtime library name.
2424 OMPRT_IOMP5
2425};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002426}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002427
2428/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002429static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2430 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002431 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2432
2433 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2434 if (A)
2435 RuntimeName = A->getValue();
2436
2437 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002438 .Case("libomp", OMPRT_OMP)
2439 .Case("libgomp", OMPRT_GOMP)
2440 .Case("libiomp5", OMPRT_IOMP5)
2441 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002442
2443 if (RT == OMPRT_Unknown) {
2444 if (A)
2445 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002446 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002447 else
2448 // FIXME: We could use a nicer diagnostic here.
2449 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2450 }
2451
2452 return RT;
2453}
2454
Alexey Samsonov52550342014-09-15 19:58:40 +00002455static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2456 ArgStringList &CmdArgs, StringRef Sanitizer,
2457 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002458 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002459 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002460 if (!IsShared)
2461 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002462 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002463 if (!IsShared)
2464 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002465}
2466
Alexey Samsonov52550342014-09-15 19:58:40 +00002467// Tries to use a file with the list of dynamic symbols that need to be exported
2468// from the runtime library. Returns true if the file was found.
2469static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2470 ArgStringList &CmdArgs,
2471 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002472 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2473 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2474 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002475 return true;
2476 }
2477 return false;
2478}
2479
2480static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2481 ArgStringList &CmdArgs) {
2482 // Force linking against the system libraries sanitizers depends on
2483 // (see PR15823 why this is necessary).
2484 CmdArgs.push_back("--no-as-needed");
2485 CmdArgs.push_back("-lpthread");
2486 CmdArgs.push_back("-lrt");
2487 CmdArgs.push_back("-lm");
2488 // There's no libdl on FreeBSD.
2489 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2490 CmdArgs.push_back("-ldl");
2491}
2492
2493static void
2494collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2495 SmallVectorImpl<StringRef> &SharedRuntimes,
2496 SmallVectorImpl<StringRef> &StaticRuntimes,
2497 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2498 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2499 // Collect shared runtimes.
2500 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2501 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002502 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002503
Alexey Samsonov52550342014-09-15 19:58:40 +00002504 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002505 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002506 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2507 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002508 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002509 }
2510 if (SanArgs.needsAsanRt()) {
2511 if (SanArgs.needsSharedAsanRt()) {
2512 HelperStaticRuntimes.push_back("asan-preinit");
2513 } else {
2514 StaticRuntimes.push_back("asan");
2515 if (SanArgs.linkCXXRuntimes())
2516 StaticRuntimes.push_back("asan_cxx");
2517 }
2518 }
2519 if (SanArgs.needsDfsanRt())
2520 StaticRuntimes.push_back("dfsan");
2521 if (SanArgs.needsLsanRt())
2522 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002523 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002524 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002525 if (SanArgs.linkCXXRuntimes())
2526 StaticRuntimes.push_back("msan_cxx");
2527 }
2528 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002529 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002530 if (SanArgs.linkCXXRuntimes())
2531 StaticRuntimes.push_back("tsan_cxx");
2532 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002533 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002534 StaticRuntimes.push_back("ubsan_standalone");
2535 if (SanArgs.linkCXXRuntimes())
2536 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002537 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002538 if (SanArgs.needsSafeStackRt())
2539 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002540}
2541
Alexey Samsonov52550342014-09-15 19:58:40 +00002542// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2543// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2544static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002545 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002546 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2547 HelperStaticRuntimes;
2548 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2549 HelperStaticRuntimes);
2550 for (auto RT : SharedRuntimes)
2551 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2552 for (auto RT : HelperStaticRuntimes)
2553 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2554 bool AddExportDynamic = false;
2555 for (auto RT : StaticRuntimes) {
2556 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2557 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2558 }
2559 // If there is a static runtime with no dynamic list, force all the symbols
2560 // to be dynamic to be sure we export sanitizer interface functions.
2561 if (AddExportDynamic)
2562 CmdArgs.push_back("-export-dynamic");
2563 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002564}
2565
Reid Kleckner86ea7702015-02-04 23:45:07 +00002566static bool areOptimizationsEnabled(const ArgList &Args) {
2567 // Find the last -O arg and see if it is non-zero.
2568 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2569 return !A->getOption().matches(options::OPT_O0);
2570 // Defaults to -O0.
2571 return false;
2572}
2573
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002574static bool shouldUseFramePointerForTarget(const ArgList &Args,
2575 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002576 // XCore never wants frame pointers, regardless of OS.
2577 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002578 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002579 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002580
2581 if (Triple.isOSLinux()) {
2582 switch (Triple.getArch()) {
2583 // Don't use a frame pointer on linux if optimizing for certain targets.
2584 case llvm::Triple::mips64:
2585 case llvm::Triple::mips64el:
2586 case llvm::Triple::mips:
2587 case llvm::Triple::mipsel:
2588 case llvm::Triple::systemz:
2589 case llvm::Triple::x86:
2590 case llvm::Triple::x86_64:
2591 return !areOptimizationsEnabled(Args);
2592 default:
2593 return true;
2594 }
2595 }
2596
2597 if (Triple.isOSWindows()) {
2598 switch (Triple.getArch()) {
2599 case llvm::Triple::x86:
2600 return !areOptimizationsEnabled(Args);
2601 default:
2602 // All other supported Windows ISAs use xdata unwind information, so frame
2603 // pointers are not generally useful.
2604 return false;
2605 }
2606 }
2607
2608 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002609}
2610
Rafael Espindola224dd632011-12-14 21:02:23 +00002611static bool shouldUseFramePointer(const ArgList &Args,
2612 const llvm::Triple &Triple) {
2613 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2614 options::OPT_fomit_frame_pointer))
2615 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2616
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002617 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002618}
2619
Eric Christopherb7d97e92013-04-03 01:58:53 +00002620static bool shouldUseLeafFramePointer(const ArgList &Args,
2621 const llvm::Triple &Triple) {
2622 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2623 options::OPT_momit_leaf_frame_pointer))
2624 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2625
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002626 if (Triple.isPS4CPU())
2627 return false;
2628
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002629 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002630}
2631
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002632/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002633static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002634 SmallString<128> cwd;
2635 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002636 CmdArgs.push_back("-fdebug-compilation-dir");
2637 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002638 }
2639}
2640
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002641static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002642 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2643 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2644 SmallString<128> T(FinalOutput->getValue());
2645 llvm::sys::path::replace_extension(T, "dwo");
2646 return Args.MakeArgString(T);
2647 } else {
2648 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002649 SmallString<128> T(
2650 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002651 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002652 llvm::sys::path::replace_extension(F, "dwo");
2653 T += F;
2654 return Args.MakeArgString(F);
2655 }
2656}
2657
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002658static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2659 const JobAction &JA, const ArgList &Args,
2660 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002661 ArgStringList ExtractArgs;
2662 ExtractArgs.push_back("--extract-dwo");
2663
2664 ArgStringList StripArgs;
2665 StripArgs.push_back("--strip-dwo");
2666
2667 // Grabbing the output of the earlier compile step.
2668 StripArgs.push_back(Output.getFilename());
2669 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002670 ExtractArgs.push_back(OutFile);
2671
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002672 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002673 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002674
2675 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002676 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002677
2678 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002679 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002680}
2681
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002682/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002683/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2684static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002685 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002686 if (A->getOption().matches(options::OPT_O4) ||
2687 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002688 return true;
2689
2690 if (A->getOption().matches(options::OPT_O0))
2691 return false;
2692
2693 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2694
Rafael Espindola91780de2013-08-26 14:05:41 +00002695 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002696 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002697 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002698 return true;
2699
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002700 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002701 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002702 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002703
2704 unsigned OptLevel = 0;
2705 if (S.getAsInteger(10, OptLevel))
2706 return false;
2707
2708 return OptLevel > 1;
2709 }
2710
2711 return false;
2712}
2713
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002714/// Add -x lang to \p CmdArgs for \p Input.
2715static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2716 ArgStringList &CmdArgs) {
2717 // When using -verify-pch, we don't want to provide the type
2718 // 'precompiled-header' if it was inferred from the file extension
2719 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2720 return;
2721
2722 CmdArgs.push_back("-x");
2723 if (Args.hasArg(options::OPT_rewrite_objc))
2724 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2725 else
2726 CmdArgs.push_back(types::getTypeName(Input.getType()));
2727}
2728
David Majnemerc371ff02015-03-22 08:39:22 +00002729static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002730 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002731 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002732
2733 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002734 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002735
2736 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002737 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002738 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002739 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002740}
2741
Rafael Espindola577637a2015-01-03 00:06:04 +00002742// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002743// options that build systems might add but are unused when assembling or only
2744// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002745static void claimNoWarnArgs(const ArgList &Args) {
2746 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002747 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002748 Args.ClaimAllArgs(options::OPT_flto);
2749 Args.ClaimAllArgs(options::OPT_fno_lto);
2750}
2751
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002752static void appendUserToPath(SmallVectorImpl<char> &Result) {
2753#ifdef LLVM_ON_UNIX
2754 const char *Username = getenv("LOGNAME");
2755#else
2756 const char *Username = getenv("USERNAME");
2757#endif
2758 if (Username) {
2759 // Validate that LoginName can be used in a path, and get its length.
2760 size_t Len = 0;
2761 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002762 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002763 Username = nullptr;
2764 break;
2765 }
2766 }
2767
2768 if (Username && Len > 0) {
2769 Result.append(Username, Username + Len);
2770 return;
2771 }
2772 }
2773
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002774// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002775#ifdef LLVM_ON_UNIX
2776 std::string UID = llvm::utostr(getuid());
2777#else
2778 // FIXME: Windows seems to have an 'SID' that might work.
2779 std::string UID = "9999";
2780#endif
2781 Result.append(UID.begin(), UID.end());
2782}
2783
David Majnemere11d3732015-06-08 00:22:46 +00002784VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2785 const llvm::Triple &Triple,
2786 const llvm::opt::ArgList &Args,
2787 bool IsWindowsMSVC) {
2788 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2789 IsWindowsMSVC) ||
2790 Args.hasArg(options::OPT_fmsc_version) ||
2791 Args.hasArg(options::OPT_fms_compatibility_version)) {
2792 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2793 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002794 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002795
2796 if (MSCVersion && MSCompatibilityVersion) {
2797 if (D)
2798 D->Diag(diag::err_drv_argument_not_allowed_with)
2799 << MSCVersion->getAsString(Args)
2800 << MSCompatibilityVersion->getAsString(Args);
2801 return VersionTuple();
2802 }
2803
2804 if (MSCompatibilityVersion) {
2805 VersionTuple MSVT;
2806 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2807 D->Diag(diag::err_drv_invalid_value)
2808 << MSCompatibilityVersion->getAsString(Args)
2809 << MSCompatibilityVersion->getValue();
2810 return MSVT;
2811 }
2812
2813 if (MSCVersion) {
2814 unsigned Version = 0;
2815 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2816 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2817 << MSCVersion->getValue();
2818 return getMSCompatibilityVersion(Version);
2819 }
2820
2821 unsigned Major, Minor, Micro;
2822 Triple.getEnvironmentVersion(Major, Minor, Micro);
2823 if (Major || Minor || Micro)
2824 return VersionTuple(Major, Minor, Micro);
2825
2826 return VersionTuple(18);
2827 }
2828 return VersionTuple();
2829}
2830
Diego Novilloa0545962015-07-10 18:00:07 +00002831static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2832 const InputInfo &Output, const ArgList &Args,
2833 ArgStringList &CmdArgs) {
2834 auto *ProfileGenerateArg = Args.getLastArg(
2835 options::OPT_fprofile_instr_generate,
2836 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002837 options::OPT_fprofile_generate_EQ,
2838 options::OPT_fno_profile_instr_generate);
2839 if (ProfileGenerateArg &&
2840 ProfileGenerateArg->getOption().matches(
2841 options::OPT_fno_profile_instr_generate))
2842 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002843
2844 auto *ProfileUseArg = Args.getLastArg(
2845 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002846 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2847 options::OPT_fno_profile_instr_use);
2848 if (ProfileUseArg &&
2849 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2850 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002851
2852 if (ProfileGenerateArg && ProfileUseArg)
2853 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002854 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002855
Diego Novillo758f3f52015-08-05 21:49:51 +00002856 if (ProfileGenerateArg) {
2857 if (ProfileGenerateArg->getOption().matches(
2858 options::OPT_fprofile_instr_generate_EQ))
2859 ProfileGenerateArg->render(Args, CmdArgs);
2860 else if (ProfileGenerateArg->getOption().matches(
2861 options::OPT_fprofile_generate_EQ)) {
2862 SmallString<128> Path(ProfileGenerateArg->getValue());
2863 llvm::sys::path::append(Path, "default.profraw");
2864 CmdArgs.push_back(
2865 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2866 } else
2867 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2868 }
Diego Novilloa0545962015-07-10 18:00:07 +00002869
Diego Novillo758f3f52015-08-05 21:49:51 +00002870 if (ProfileUseArg) {
2871 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2872 ProfileUseArg->render(Args, CmdArgs);
2873 else if ((ProfileUseArg->getOption().matches(
2874 options::OPT_fprofile_use_EQ) ||
2875 ProfileUseArg->getOption().matches(
2876 options::OPT_fprofile_instr_use))) {
2877 SmallString<128> Path(
2878 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2879 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2880 llvm::sys::path::append(Path, "default.profdata");
2881 CmdArgs.push_back(
2882 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2883 }
Diego Novilloa0545962015-07-10 18:00:07 +00002884 }
2885
2886 if (Args.hasArg(options::OPT_ftest_coverage) ||
2887 Args.hasArg(options::OPT_coverage))
2888 CmdArgs.push_back("-femit-coverage-notes");
2889 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2890 false) ||
2891 Args.hasArg(options::OPT_coverage))
2892 CmdArgs.push_back("-femit-coverage-data");
2893
Diego Novilloc4b94da2015-08-05 23:27:40 +00002894 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2895 options::OPT_fno_coverage_mapping, false) &&
2896 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002897 D.Diag(diag::err_drv_argument_only_allowed_with)
2898 << "-fcoverage-mapping"
2899 << "-fprofile-instr-generate";
2900
Diego Novilloc4b94da2015-08-05 23:27:40 +00002901 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2902 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002903 CmdArgs.push_back("-fcoverage-mapping");
2904
2905 if (C.getArgs().hasArg(options::OPT_c) ||
2906 C.getArgs().hasArg(options::OPT_S)) {
2907 if (Output.isFilename()) {
2908 CmdArgs.push_back("-coverage-file");
2909 SmallString<128> CoverageFilename;
2910 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2911 CoverageFilename = FinalOutput->getValue();
2912 } else {
2913 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2914 }
2915 if (llvm::sys::path::is_relative(CoverageFilename)) {
2916 SmallString<128> Pwd;
2917 if (!llvm::sys::fs::current_path(Pwd)) {
2918 llvm::sys::path::append(Pwd, CoverageFilename);
2919 CoverageFilename.swap(Pwd);
2920 }
2921 }
2922 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2923 }
2924 }
2925}
2926
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002927/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2928/// smooshes them together with platform defaults, to decide whether
2929/// this compile should be using PIC mode or not. Returns a tuple of
2930/// (RelocationModel, PICLevel, IsPIE).
2931static std::tuple<llvm::Reloc::Model, unsigned, bool>
2932ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
2933 const ArgList &Args) {
2934 // FIXME: why does this code...and so much everywhere else, use both
2935 // ToolChain.getTriple() and Triple?
2936 bool PIE = ToolChain.isPIEDefault();
2937 bool PIC = PIE || ToolChain.isPICDefault();
2938 bool IsPICLevelTwo = PIC;
2939
2940 bool KernelOrKext =
2941 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2942
2943 // Android-specific defaults for PIC/PIE
2944 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
2945 switch (ToolChain.getArch()) {
2946 case llvm::Triple::arm:
2947 case llvm::Triple::armeb:
2948 case llvm::Triple::thumb:
2949 case llvm::Triple::thumbeb:
2950 case llvm::Triple::aarch64:
2951 case llvm::Triple::mips:
2952 case llvm::Triple::mipsel:
2953 case llvm::Triple::mips64:
2954 case llvm::Triple::mips64el:
2955 PIC = true; // "-fpic"
2956 break;
2957
2958 case llvm::Triple::x86:
2959 case llvm::Triple::x86_64:
2960 PIC = true; // "-fPIC"
2961 IsPICLevelTwo = true;
2962 break;
2963
2964 default:
2965 break;
2966 }
2967 }
2968
2969 // OpenBSD-specific defaults for PIE
2970 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
2971 switch (ToolChain.getArch()) {
2972 case llvm::Triple::mips64:
2973 case llvm::Triple::mips64el:
2974 case llvm::Triple::sparcel:
2975 case llvm::Triple::x86:
2976 case llvm::Triple::x86_64:
2977 IsPICLevelTwo = false; // "-fpie"
2978 break;
2979
2980 case llvm::Triple::ppc:
2981 case llvm::Triple::sparc:
2982 case llvm::Triple::sparcv9:
2983 IsPICLevelTwo = true; // "-fPIE"
2984 break;
2985
2986 default:
2987 break;
2988 }
2989 }
2990
2991 // The last argument relating to either PIC or PIE wins, and no
2992 // other argument is used. If the last argument is any flavor of the
2993 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
2994 // option implicitly enables PIC at the same level.
2995 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2996 options::OPT_fpic, options::OPT_fno_pic,
2997 options::OPT_fPIE, options::OPT_fno_PIE,
2998 options::OPT_fpie, options::OPT_fno_pie);
2999 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3000 // is forced, then neither PIC nor PIE flags will have no effect.
3001 if (!ToolChain.isPICDefaultForced()) {
3002 if (LastPICArg) {
3003 Option O = LastPICArg->getOption();
3004 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3005 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3006 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3007 PIC =
3008 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3009 IsPICLevelTwo =
3010 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3011 } else {
3012 PIE = PIC = false;
3013 }
3014 }
3015 }
3016
3017 // Introduce a Darwin-specific hack. If the default is PIC, but the
3018 // PIC level would've been set to level 1, force it back to level 2
3019 // PIC instead. This matches the behavior of Darwin GCC (based on
3020 // chandlerc's informal testing in 2012).
3021 if (PIC && ToolChain.getTriple().isOSDarwin())
3022 IsPICLevelTwo |= ToolChain.isPICDefault();
3023
3024 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3025 // PIC or PIE options above, if these show up, PIC is disabled.
3026 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3027 PIC = PIE = false;
3028 if (Args.hasArg(options::OPT_static))
3029 PIC = PIE = false;
3030
3031 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3032 // This is a very special mode. It trumps the other modes, almost no one
3033 // uses it, and it isn't even valid on any OS but Darwin.
3034 if (!ToolChain.getTriple().isOSDarwin())
3035 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3036 << A->getSpelling() << ToolChain.getTriple().str();
3037
3038 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3039
3040 // Only a forced PIC mode can cause the actual compile to have PIC defines
3041 // etc., no flags are sufficient. This behavior was selected to closely
3042 // match that of llvm-gcc and Apple GCC before that.
3043 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3044
3045 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3046 }
3047
3048 if (PIC)
3049 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3050
3051 return std::make_tuple(llvm::Reloc::Static, 0, false);
3052}
3053
3054static const char *RelocationModelName(llvm::Reloc::Model Model) {
3055 switch (Model) {
3056 case llvm::Reloc::Default:
3057 return nullptr;
3058 case llvm::Reloc::Static:
3059 return "static";
3060 case llvm::Reloc::PIC_:
3061 return "pic";
3062 case llvm::Reloc::DynamicNoPIC:
3063 return "dynamic-no-pic";
3064 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003065 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003066}
3067
3068static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3069 ArgStringList &CmdArgs) {
3070 llvm::Reloc::Model RelocationModel;
3071 unsigned PICLevel;
3072 bool IsPIE;
3073 std::tie(RelocationModel, PICLevel, IsPIE) =
3074 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3075
3076 if (RelocationModel != llvm::Reloc::Static)
3077 CmdArgs.push_back("-KPIC");
3078}
3079
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003080void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003081 const InputInfo &Output, const InputInfoList &Inputs,
3082 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003083 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3084 const llvm::Triple Triple(TripleStr);
3085
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003086 bool KernelOrKext =
3087 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003088 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003089 ArgStringList CmdArgs;
3090
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003091 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003092 bool IsWindowsCygnus =
3093 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003094 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3095
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003096 // Check number of inputs for sanity. We need at least one input.
3097 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003098 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003099 // CUDA compilation may have multiple inputs (source file + results of
3100 // device-side compilations). All other jobs are expected to have exactly one
3101 // input.
3102 bool IsCuda = types::isCuda(Input.getType());
3103 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003104
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003105 // Invoke ourselves in -cc1 mode.
3106 //
3107 // FIXME: Implement custom jobs for internal actions.
3108 CmdArgs.push_back("-cc1");
3109
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003110 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003111 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003112 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003113
James Y Knight2db38f32015-08-15 03:45:25 +00003114 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3115 Triple.getArch() == llvm::Triple::thumb)) {
3116 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003117 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003118 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003119 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003120 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003121 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003122 }
3123
Tim Northover336f1892014-03-29 13:16:12 +00003124 // Push all default warning arguments that are specific to
3125 // the given target. These come before user provided warning options
3126 // are provided.
3127 getToolChain().addClangWarningOptions(CmdArgs);
3128
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003129 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003130 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003131
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003132 if (isa<AnalyzeJobAction>(JA)) {
3133 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3134 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003135 } else if (isa<MigrateJobAction>(JA)) {
3136 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003137 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003138 if (Output.getType() == types::TY_Dependencies)
3139 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003140 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003141 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003142 if (Args.hasArg(options::OPT_rewrite_objc) &&
3143 !Args.hasArg(options::OPT_g_Group))
3144 CmdArgs.push_back("-P");
3145 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003146 } else if (isa<AssembleJobAction>(JA)) {
3147 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003148
David Blaikie9260ed62013-07-25 21:19:01 +00003149 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003150
3151 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003152 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003153 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003154 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003155 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003156
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003157 if (JA.getType() == types::TY_Nothing)
3158 CmdArgs.push_back("-fsyntax-only");
3159 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003160 CmdArgs.push_back("-emit-pch");
3161 else
3162 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003163 } else if (isa<VerifyPCHJobAction>(JA)) {
3164 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003165 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003166 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3167 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003168
Renato Golin7c542b42015-07-27 23:44:45 +00003169 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003170 CmdArgs.push_back("-flto");
3171 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003172 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003173 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003174 } else if (JA.getType() == types::TY_LLVM_IR ||
3175 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003176 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003177 } else if (JA.getType() == types::TY_LLVM_BC ||
3178 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003179 CmdArgs.push_back("-emit-llvm-bc");
3180 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003181 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003182 } else if (JA.getType() == types::TY_AST) {
3183 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003184 } else if (JA.getType() == types::TY_ModuleFile) {
3185 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003186 } else if (JA.getType() == types::TY_RewrittenObjC) {
3187 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003188 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003189 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3190 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003191 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003192 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003193 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003194 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003195
3196 // Preserve use-list order by default when emitting bitcode, so that
3197 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3198 // same result as running passes here. For LTO, we don't need to preserve
3199 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003200 if (JA.getType() == types::TY_LLVM_BC)
3201 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003202 }
3203
Justin Bognera88f0122014-06-20 22:59:50 +00003204 // We normally speed up the clang process a bit by skipping destructors at
3205 // exit, but when we're generating diagnostics we can rely on some of the
3206 // cleanup.
3207 if (!C.isForDiagnostics())
3208 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003210// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003211#ifdef NDEBUG
3212 CmdArgs.push_back("-disable-llvm-verifier");
3213#endif
3214
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003215 // Set the main file name, so that debug info works even with
3216 // -save-temps.
3217 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003218 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003219
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003220 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003221 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003222 if (Args.hasArg(options::OPT_static))
3223 CmdArgs.push_back("-static-define");
3224
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003225 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003226 // Enable region store model by default.
3227 CmdArgs.push_back("-analyzer-store=region");
3228
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003229 // Treat blocks as analysis entry points.
3230 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3231
Ted Kremenek49c79792011-03-24 00:28:47 +00003232 CmdArgs.push_back("-analyzer-eagerly-assume");
3233
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003234 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003235 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003236 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003237
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003238 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003239 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003240
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003241 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003242 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003243
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003244 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003245
Artem Belevichba558952015-05-06 18:20:23 +00003246 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003247 CmdArgs.push_back("-analyzer-checker=cplusplus");
3248
Nico Webere8e53112014-05-11 01:04:02 +00003249 // Enable the following experimental checkers for testing.
3250 CmdArgs.push_back(
3251 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003252 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3253 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003254 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003255 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3256 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003257 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003258
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003259 // Set the output format. The default is plist, for (lame) historical
3260 // reasons.
3261 CmdArgs.push_back("-analyzer-output");
3262 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003263 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003264 else
3265 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003266
Ted Kremenekfe449a22010-03-22 22:32:05 +00003267 // Disable the presentation of standard compiler warnings when
3268 // using --analyze. We only want to show static analyzer diagnostics
3269 // or frontend errors.
3270 CmdArgs.push_back("-w");
3271
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003272 // Add -Xanalyzer arguments when running as analyzer.
3273 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003274 }
3275
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003276 CheckCodeGenerationOptions(D, Args);
3277
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003278 llvm::Reloc::Model RelocationModel;
3279 unsigned PICLevel;
3280 bool IsPIE;
3281 std::tie(RelocationModel, PICLevel, IsPIE) =
3282 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003283
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003284 const char *RMName = RelocationModelName(RelocationModel);
3285 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003286 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003287 CmdArgs.push_back(RMName);
3288 }
3289 if (PICLevel > 0) {
3290 CmdArgs.push_back("-pic-level");
3291 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3292 if (IsPIE) {
3293 CmdArgs.push_back("-pie-level");
3294 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003295 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003296 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003297
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003298 CmdArgs.push_back("-mthread-model");
3299 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3300 CmdArgs.push_back(A->getValue());
3301 else
3302 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3303
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003304 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3305
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003306 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3307 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003308 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003309
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003310 // LLVM Code Generator Options.
3311
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003312 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3313 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003314 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3315 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003316 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003317 CmdArgs.push_back(A->getValue());
3318 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003319 }
3320 }
3321
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003322 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3323 StringRef v = A->getValue();
3324 CmdArgs.push_back("-mllvm");
3325 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3326 A->claim();
3327 }
3328
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003329 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3330 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003331 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003332 }
3333
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003334 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3335 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003336 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003337 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003338 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003339 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3340 CmdArgs.push_back("-fpcc-struct-return");
3341 } else {
3342 assert(A->getOption().matches(options::OPT_freg_struct_return));
3343 CmdArgs.push_back("-freg-struct-return");
3344 }
3345 }
3346
Roman Divacky65b88cd2011-03-01 17:40:53 +00003347 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3348 CmdArgs.push_back("-mrtd");
3349
Rafael Espindola224dd632011-12-14 21:02:23 +00003350 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003351 CmdArgs.push_back("-mdisable-fp-elim");
3352 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3353 options::OPT_fno_zero_initialized_in_bss))
3354 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003355
3356 bool OFastEnabled = isOptimizationLevelFast(Args);
3357 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3358 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003359 OptSpecifier StrictAliasingAliasOption =
3360 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003361 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3362 // doesn't do any TBAA.
3363 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003364 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003365 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003366 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003367 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3368 options::OPT_fno_struct_path_tbaa))
3369 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003370 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3371 false))
3372 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003373 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3374 options::OPT_fno_optimize_sibling_calls))
3375 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003376
Eric Christopher006208c2013-04-04 06:29:47 +00003377 // Handle segmented stacks.
3378 if (Args.hasArg(options::OPT_fsplit_stack))
3379 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003380
3381 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3382 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003383 OptSpecifier FastMathAliasOption =
3384 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3385
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003386 // Handle various floating point optimization flags, mapping them to the
3387 // appropriate LLVM code generation flags. The pattern for all of these is to
3388 // default off the codegen optimizations, and if any flag enables them and no
3389 // flag disables them after the flag enabling them, enable the codegen
3390 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003391 if (Arg *A = Args.getLastArg(
3392 options::OPT_ffast_math, FastMathAliasOption,
3393 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3394 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3395 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003396 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3397 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003398 A->getOption().getID() != options::OPT_fhonor_infinities)
3399 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003400 if (Arg *A = Args.getLastArg(
3401 options::OPT_ffast_math, FastMathAliasOption,
3402 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3403 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3404 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003405 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3406 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003407 A->getOption().getID() != options::OPT_fhonor_nans)
3408 CmdArgs.push_back("-menable-no-nans");
3409
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003410 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3411 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003412 if (Arg *A =
3413 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3414 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3415 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003416 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3417 // However, turning *off* -ffast_math merely restores the toolchain default
3418 // (which may be false).
3419 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3420 A->getOption().getID() == options::OPT_ffast_math ||
3421 A->getOption().getID() == options::OPT_Ofast)
3422 MathErrno = false;
3423 else if (A->getOption().getID() == options::OPT_fmath_errno)
3424 MathErrno = true;
3425 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003426 if (MathErrno)
3427 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003428
3429 // There are several flags which require disabling very specific
3430 // optimizations. Any of these being disabled forces us to turn off the
3431 // entire set of LLVM optimizations, so collect them through all the flag
3432 // madness.
3433 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003434 if (Arg *A = Args.getLastArg(
3435 options::OPT_ffast_math, FastMathAliasOption,
3436 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3437 options::OPT_fno_unsafe_math_optimizations,
3438 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003439 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3440 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003441 A->getOption().getID() != options::OPT_fno_associative_math)
3442 AssociativeMath = true;
3443 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003444 if (Arg *A = Args.getLastArg(
3445 options::OPT_ffast_math, FastMathAliasOption,
3446 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3447 options::OPT_fno_unsafe_math_optimizations,
3448 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003449 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3450 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003451 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3452 ReciprocalMath = true;
3453 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003454 if (Arg *A = Args.getLastArg(
3455 options::OPT_ffast_math, FastMathAliasOption,
3456 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3457 options::OPT_fno_unsafe_math_optimizations,
3458 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003459 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3460 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003461 A->getOption().getID() != options::OPT_fsigned_zeros)
3462 SignedZeros = false;
3463 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003464 if (Arg *A = Args.getLastArg(
3465 options::OPT_ffast_math, FastMathAliasOption,
3466 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3467 options::OPT_fno_unsafe_math_optimizations,
3468 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003469 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3470 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003471 A->getOption().getID() != options::OPT_ftrapping_math)
3472 TrappingMath = false;
3473 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3474 !TrappingMath)
3475 CmdArgs.push_back("-menable-unsafe-fp-math");
3476
Sanjay Patel76c9e092015-01-23 16:40:50 +00003477 if (!SignedZeros)
3478 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003479
Sanjay Patel359b1052015-04-09 15:03:23 +00003480 if (ReciprocalMath)
3481 CmdArgs.push_back("-freciprocal-math");
3482
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003483 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003484 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003485 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003486 options::OPT_ffp_contract)) {
3487 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003488 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003489 if (Val == "fast" || Val == "on" || Val == "off") {
3490 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3491 } else {
3492 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003493 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003494 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003495 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3496 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003497 // If fast-math is set then set the fp-contract mode to fast.
3498 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3499 }
3500 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003501
Sanjay Patel2987c292015-06-11 14:53:41 +00003502 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003503
Bob Wilson6a039162012-07-19 03:52:53 +00003504 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3505 // and if we find them, tell the frontend to provide the appropriate
3506 // preprocessor macros. This is distinct from enabling any optimizations as
3507 // these options induce language changes which must survive serialization
3508 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003509 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3510 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003511 if (!A->getOption().matches(options::OPT_fno_fast_math))
3512 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003513 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3514 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003515 if (A->getOption().matches(options::OPT_ffinite_math_only))
3516 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003517
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003518 // Decide whether to use verbose asm. Verbose assembly is the default on
3519 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003520 bool IsIntegratedAssemblerDefault =
3521 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003522 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003523 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003524 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003525 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003526
Rafael Espindolab8a12932015-05-22 20:44:03 +00003527 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3528 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003529 CmdArgs.push_back("-no-integrated-as");
3530
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003531 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3532 CmdArgs.push_back("-mdebug-pass");
3533 CmdArgs.push_back("Structure");
3534 }
3535 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3536 CmdArgs.push_back("-mdebug-pass");
3537 CmdArgs.push_back("Arguments");
3538 }
3539
John McCall8517abc2010-02-19 02:45:38 +00003540 // Enable -mconstructor-aliases except on darwin, where we have to
3541 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003542 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003543 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003544
John McCall7ef5cb32011-03-18 02:56:14 +00003545 // Darwin's kernel doesn't support guard variables; just die if we
3546 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003547 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003548 CmdArgs.push_back("-fforbid-guard-variables");
3549
Douglas Gregordbe39272011-02-01 15:15:22 +00003550 if (Args.hasArg(options::OPT_mms_bitfields)) {
3551 CmdArgs.push_back("-mms-bitfields");
3552 }
John McCall8517abc2010-02-19 02:45:38 +00003553
Daniel Dunbar306945d2009-09-16 06:17:29 +00003554 // This is a coarse approximation of what llvm-gcc actually does, both
3555 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3556 // complicated ways.
3557 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003558 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3559 options::OPT_fno_asynchronous_unwind_tables,
3560 (getToolChain().IsUnwindTablesDefault() ||
3561 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3562 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003563 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3564 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003565 CmdArgs.push_back("-munwind-tables");
3566
Chandler Carruth05fb5852012-11-21 23:40:23 +00003567 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003568
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003569 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3570 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003571 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003572 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003573
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003574 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003575 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003576
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003577 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003578 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003579 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003580 }
3581
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003582 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003583 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003584 if (!CPU.empty()) {
3585 CmdArgs.push_back("-target-cpu");
3586 CmdArgs.push_back(Args.MakeArgString(CPU));
3587 }
3588
Rafael Espindolaeb265472013-08-21 21:59:03 +00003589 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3590 CmdArgs.push_back("-mfpmath");
3591 CmdArgs.push_back(A->getValue());
3592 }
3593
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003594 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003595 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003596
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003597 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003598 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003599 default:
3600 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003601
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003602 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003603 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003604 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003605 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003606 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003607 break;
3608
Tim Northover573cbee2014-05-24 12:52:07 +00003609 case llvm::Triple::aarch64:
3610 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003611 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003612 break;
3613
Eric Christopher0b26a612010-03-02 02:41:08 +00003614 case llvm::Triple::mips:
3615 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003616 case llvm::Triple::mips64:
3617 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003618 AddMIPSTargetArgs(Args, CmdArgs);
3619 break;
3620
Ulrich Weigand8afad612014-07-28 13:17:52 +00003621 case llvm::Triple::ppc:
3622 case llvm::Triple::ppc64:
3623 case llvm::Triple::ppc64le:
3624 AddPPCTargetArgs(Args, CmdArgs);
3625 break;
3626
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003627 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003628 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003629 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003630 AddSparcTargetArgs(Args, CmdArgs);
3631 break;
3632
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003633 case llvm::Triple::x86:
3634 case llvm::Triple::x86_64:
3635 AddX86TargetArgs(Args, CmdArgs);
3636 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003637
3638 case llvm::Triple::hexagon:
3639 AddHexagonTargetArgs(Args, CmdArgs);
3640 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003641 }
3642
Hans Wennborg75958c42013-08-08 00:17:41 +00003643 // Add clang-cl arguments.
3644 if (getToolChain().getDriver().IsCLMode())
3645 AddClangCLArgs(Args, CmdArgs);
3646
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003647 // Pass the linker version in use.
3648 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3649 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003650 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003651 }
3652
Eric Christopherb7d97e92013-04-03 01:58:53 +00003653 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003654 CmdArgs.push_back("-momit-leaf-frame-pointer");
3655
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003656 // Explicitly error on some things we know we don't support and can't just
3657 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003658 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003659 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3660 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003661 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003662 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003663 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3664 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003665 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003666 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003667 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003668 }
3669
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003670 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003671 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003672 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003673 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003674 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3675 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003676 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003677 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003678 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003679
Chad Rosierbe10f982011-08-02 17:58:04 +00003680 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003681 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003682 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3683 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003684 }
3685
Manman Ren17bdb0f2013-11-20 20:22:14 +00003686 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3687 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003688 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003689 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003690 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003691 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3692 A->getOption().matches(options::OPT_g1)) &&
3693 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003694 // FIXME: we should support specifying dwarf version with
3695 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003696 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003697 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003698 const llvm::Triple &Triple = getToolChain().getTriple();
3699 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003700 Triple.getOS() == llvm::Triple::FreeBSD ||
3701 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003702 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003703 SplitDwarfArg = nullptr;
Manman Ren17bdb0f2013-11-20 20:22:14 +00003704 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003705 CmdArgs.push_back("-gdwarf-2");
3706 else if (A->getOption().matches(options::OPT_gdwarf_3))
3707 CmdArgs.push_back("-gdwarf-3");
3708 else if (A->getOption().matches(options::OPT_gdwarf_4))
3709 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003710 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003711 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003712 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003713 const llvm::Triple &Triple = getToolChain().getTriple();
3714 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003715 Triple.getOS() == llvm::Triple::FreeBSD ||
3716 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003717 CmdArgs.push_back("-gdwarf-2");
3718 else
3719 CmdArgs.push_back("-g");
3720 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003721 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003722
Reid Kleckner124955a2015-08-05 18:51:13 +00003723 // Forward -gcodeview.
3724 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3725
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003726 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3727 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003728 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3729 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003730 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003731
Eric Christopher138c32b2013-09-13 22:37:55 +00003732 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003733 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3734 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003735 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003736 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003737 CmdArgs.push_back("-g");
3738 CmdArgs.push_back("-backend-option");
3739 CmdArgs.push_back("-split-dwarf=Enable");
3740 }
3741
Eric Christopher138c32b2013-09-13 22:37:55 +00003742 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3743 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3744 CmdArgs.push_back("-backend-option");
3745 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3746 }
Eric Christophereec89c22013-06-18 00:03:50 +00003747
Eric Christopher0d403d22014-02-14 01:27:03 +00003748 // -gdwarf-aranges turns on the emission of the aranges section in the
3749 // backend.
3750 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3751 CmdArgs.push_back("-backend-option");
3752 CmdArgs.push_back("-generate-arange-section");
3753 }
3754
David Blaikief36d9ba2014-01-27 18:52:43 +00003755 if (Args.hasFlag(options::OPT_fdebug_types_section,
3756 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003757 CmdArgs.push_back("-backend-option");
3758 CmdArgs.push_back("-generate-type-units");
3759 }
Eric Christophereec89c22013-06-18 00:03:50 +00003760
Ed Schouten6e576152015-03-26 17:50:28 +00003761 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3762 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3763
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003764 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003765 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003766 CmdArgs.push_back("-ffunction-sections");
3767 }
3768
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003769 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3770 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003771 CmdArgs.push_back("-fdata-sections");
3772 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003773
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003774 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003775 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003776 CmdArgs.push_back("-fno-unique-section-names");
3777
Chris Lattner3c77a352010-06-22 00:03:40 +00003778 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3779
Diego Novilloa0545962015-07-10 18:00:07 +00003780 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003781
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003782 // Pass options for controlling the default header search paths.
3783 if (Args.hasArg(options::OPT_nostdinc)) {
3784 CmdArgs.push_back("-nostdsysteminc");
3785 CmdArgs.push_back("-nobuiltininc");
3786 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003787 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003788 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003789 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3790 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3791 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003792
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003793 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003794 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003795 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003796
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003797 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3798
Ted Kremenekf7639e12012-03-06 20:06:33 +00003799 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003800 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003801 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003802 options::OPT_ccc_arcmt_modify,
3803 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003804 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003805 switch (A->getOption().getID()) {
3806 default:
3807 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003808 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003809 CmdArgs.push_back("-arcmt-check");
3810 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003811 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003812 CmdArgs.push_back("-arcmt-modify");
3813 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003814 case options::OPT_ccc_arcmt_migrate:
3815 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003816 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003817 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003818
3819 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3820 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003821 break;
John McCalld70fb982011-06-15 23:25:17 +00003822 }
3823 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003824 } else {
3825 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3826 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3827 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003828 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003829
Ted Kremenekf7639e12012-03-06 20:06:33 +00003830 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3831 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003832 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3833 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003834 }
3835 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003836 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003837
3838 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003839 options::OPT_objcmt_migrate_subscripting,
3840 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003841 // None specified, means enable them all.
3842 CmdArgs.push_back("-objcmt-migrate-literals");
3843 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003844 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003845 } else {
3846 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3847 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003848 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003849 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003850 } else {
3851 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3852 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3853 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3854 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3855 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3856 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003857 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003858 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3859 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3860 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3861 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3862 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3863 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3864 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003865 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003866 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003867 }
3868
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003869 // Add preprocessing options like -I, -D, etc. if we are using the
3870 // preprocessor.
3871 //
3872 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003873 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003874 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003875
Rafael Espindolaa7431922011-07-21 23:40:37 +00003876 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3877 // that "The compiler can only warn and ignore the option if not recognized".
3878 // When building with ccache, it will pass -D options to clang even on
3879 // preprocessed inputs and configure concludes that -fPIC is not supported.
3880 Args.ClaimAllArgs(options::OPT_D);
3881
Alp Toker7874bdc2013-11-15 20:40:58 +00003882 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003883 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3884 if (A->getOption().matches(options::OPT_O4)) {
3885 CmdArgs.push_back("-O3");
3886 D.Diag(diag::warn_O4_is_O3);
3887 } else {
3888 A->render(Args, CmdArgs);
3889 }
3890 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003891
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003892 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003893 for (const Arg *A :
3894 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3895 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003896 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003897 }
3898
Rafael Espindola577637a2015-01-03 00:06:04 +00003899 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003900
Richard Smith3be1cb22014-08-07 00:24:21 +00003901 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003902 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003903 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3904 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003905 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003906 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003907
3908 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003909 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003910 //
3911 // If a std is supplied, only add -trigraphs if it follows the
3912 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003913 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003914 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3915 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003916 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003917 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003918 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003919 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003920 else
3921 Std->render(Args, CmdArgs);
3922
Nico Weber00721502014-12-23 22:32:37 +00003923 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003924 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003925 options::OPT_ftrigraphs,
3926 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003927 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003928 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003929 } else {
3930 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003931 //
3932 // FIXME: Clang doesn't correctly handle -std= when the input language
3933 // doesn't match. For the time being just ignore this for C++ inputs;
3934 // eventually we want to do all the standard defaulting here instead of
3935 // splitting it between the driver and clang -cc1.
3936 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3938 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003939 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003940 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003941
Nico Weber00721502014-12-23 22:32:37 +00003942 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3943 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003944 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003945
Richard Smith282b4492013-09-04 22:50:31 +00003946 // GCC's behavior for -Wwrite-strings is a bit strange:
3947 // * In C, this "warning flag" changes the types of string literals from
3948 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3949 // for the discarded qualifier.
3950 // * In C++, this is just a normal warning flag.
3951 //
3952 // Implementing this warning correctly in C is hard, so we follow GCC's
3953 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3954 // a non-const char* in C, rather than using this crude hack.
3955 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003956 // FIXME: This should behave just like a warning flag, and thus should also
3957 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3958 Arg *WriteStrings =
3959 Args.getLastArg(options::OPT_Wwrite_strings,
3960 options::OPT_Wno_write_strings, options::OPT_w);
3961 if (WriteStrings &&
3962 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003963 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003964 }
3965
Chandler Carruth61fbf622011-04-23 09:27:53 +00003966 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003967 // during C++ compilation, which it is by default. GCC keeps this define even
3968 // in the presence of '-w', match this behavior bug-for-bug.
3969 if (types::isCXX(InputType) &&
3970 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3971 true)) {
3972 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003973 }
3974
Chandler Carruthe0391482010-05-22 02:21:53 +00003975 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3976 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3977 if (Asm->getOption().matches(options::OPT_fasm))
3978 CmdArgs.push_back("-fgnu-keywords");
3979 else
3980 CmdArgs.push_back("-fno-gnu-keywords");
3981 }
3982
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003983 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3984 CmdArgs.push_back("-fno-dwarf-directory-asm");
3985
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003986 if (ShouldDisableAutolink(Args, getToolChain()))
3987 CmdArgs.push_back("-fno-autolink");
3988
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003989 // Add in -fdebug-compilation-dir if necessary.
3990 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003991
Richard Smith9a568822011-11-21 19:36:32 +00003992 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3993 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003994 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003995 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003996 }
3997
Richard Smith79c927b2013-11-06 19:31:51 +00003998 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3999 CmdArgs.push_back("-foperator-arrow-depth");
4000 CmdArgs.push_back(A->getValue());
4001 }
4002
Richard Smith9a568822011-11-21 19:36:32 +00004003 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4004 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004005 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004006 }
4007
Richard Smitha3d3bd22013-05-08 02:12:03 +00004008 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4009 CmdArgs.push_back("-fconstexpr-steps");
4010 CmdArgs.push_back(A->getValue());
4011 }
4012
Richard Smithb3a14522013-02-22 01:59:51 +00004013 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4014 CmdArgs.push_back("-fbracket-depth");
4015 CmdArgs.push_back(A->getValue());
4016 }
4017
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004018 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4019 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004020 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004021 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004022 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4023 } else
4024 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004025 }
4026
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004027 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004028 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004029
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004030 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4031 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004032 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004033 }
David Chisnall5778fce2009-08-31 16:41:57 +00004034
Chris Lattnere23003d2010-01-09 21:54:33 +00004035 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4036 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004037 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004038 }
4039
Chris Lattnerb35583d2010-04-07 20:49:23 +00004040 CmdArgs.push_back("-ferror-limit");
4041 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004042 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004043 else
4044 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004045
Chandler Carrutha77a7272010-05-06 04:55:18 +00004046 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4047 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004048 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004049 }
4050
4051 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4052 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004053 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004054 }
4055
Richard Smithf6f003a2011-12-16 19:06:07 +00004056 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4057 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004058 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004059 }
4060
Nick Lewycky24653262014-12-16 21:39:02 +00004061 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4062 CmdArgs.push_back("-fspell-checking-limit");
4063 CmdArgs.push_back(A->getValue());
4064 }
4065
Daniel Dunbar2c978472009-11-04 06:24:47 +00004066 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004067 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004068 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004069 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004070 } else {
4071 // If -fmessage-length=N was not specified, determine whether this is a
4072 // terminal and, if so, implicitly define -fmessage-length appropriately.
4073 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004074 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004075 }
4076
John McCallb4a99d32013-02-19 01:57:35 +00004077 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4078 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4079 options::OPT_fvisibility_ms_compat)) {
4080 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4081 CmdArgs.push_back("-fvisibility");
4082 CmdArgs.push_back(A->getValue());
4083 } else {
4084 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4085 CmdArgs.push_back("-fvisibility");
4086 CmdArgs.push_back("hidden");
4087 CmdArgs.push_back("-ftype-visibility");
4088 CmdArgs.push_back("default");
4089 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004090 }
4091
Douglas Gregor08329632010-06-15 17:05:35 +00004092 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004093
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004094 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4095
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004096 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004097 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4098 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004099 CmdArgs.push_back("-ffreestanding");
4100
Daniel Dunbare357d562009-12-03 18:42:11 +00004101 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004102 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004103 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004104 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4105 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004106 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004107 // Emulated TLS is enabled by default on Android, and can be enabled manually
4108 // with -femulated-tls.
4109 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4110 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4111 EmulatedTLSDefault))
4112 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004113 // AltiVec-like language extensions aren't relevant for assembling.
4114 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004115 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004116 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4117 }
Richard Trieu91844232012-06-26 18:18:47 +00004118 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4119 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004120
Alexey Bataevdb390212015-05-20 04:24:19 +00004121 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004122 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4123 options::OPT_fno_openmp, false))
4124 switch (getOpenMPRuntime(getToolChain(), Args)) {
4125 case OMPRT_OMP:
4126 case OMPRT_IOMP5:
4127 // Clang can generate useful OpenMP code for these two runtime libraries.
4128 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004129
4130 // If no option regarding the use of TLS in OpenMP codegeneration is
4131 // given, decide a default based on the target. Otherwise rely on the
4132 // options and pass the right information to the frontend.
4133 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4134 options::OPT_fnoopenmp_use_tls,
4135 getToolChain().getArch() == llvm::Triple::ppc ||
4136 getToolChain().getArch() == llvm::Triple::ppc64 ||
4137 getToolChain().getArch() == llvm::Triple::ppc64le))
4138 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004139 break;
4140 default:
4141 // By default, if Clang doesn't know how to generate useful OpenMP code
4142 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4143 // down to the actual compilation.
4144 // FIXME: It would be better to have a mode which *only* omits IR
4145 // generation based on the OpenMP support so that we get consistent
4146 // semantic analysis, etc.
4147 break;
4148 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004149
Peter Collingbourne32701642013-11-01 18:16:25 +00004150 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004151 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004152
Eric Christopher459d2712013-02-19 06:16:53 +00004153 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004154 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4155 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4156 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4157 Arch == llvm::Triple::ppc64le))
4158 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4159 << "ppc/ppc64/ppc64le";
4160 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004161
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004162 // -fzvector is incompatible with -faltivec.
4163 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4164 if (Args.hasArg(options::OPT_faltivec))
4165 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4166 << "-faltivec";
4167
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004168 if (getToolChain().SupportsProfiling())
4169 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004170
4171 // -flax-vector-conversions is default.
4172 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4173 options::OPT_fno_lax_vector_conversions))
4174 CmdArgs.push_back("-fno-lax-vector-conversions");
4175
John Brawna7b4ec02015-08-10 11:11:28 +00004176 if (Args.getLastArg(options::OPT_fapple_kext) ||
4177 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004178 CmdArgs.push_back("-fapple-kext");
4179
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004180 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004181 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004182 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004183 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4184 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004185
4186 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4187 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004188 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004189 }
4190
Bob Wilson14adb362012-02-03 06:27:22 +00004191 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004192
Chandler Carruth6e501032011-03-27 00:04:55 +00004193 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4194 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004195 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004196 if (A->getOption().matches(options::OPT_fwrapv))
4197 CmdArgs.push_back("-fwrapv");
4198 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4199 options::OPT_fno_strict_overflow)) {
4200 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4201 CmdArgs.push_back("-fwrapv");
4202 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004203
4204 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4205 options::OPT_fno_reroll_loops))
4206 if (A->getOption().matches(options::OPT_freroll_loops))
4207 CmdArgs.push_back("-freroll-loops");
4208
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004209 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004210 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4211 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004212
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004213 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4214
Daniel Dunbar4930e332009-11-17 08:07:36 +00004215 // -stack-protector=0 is default.
4216 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004217 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4218 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4219 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4220 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4221 Args.ClaimAllArgs(options::OPT_fstack_protector);
4222 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004223 options::OPT_fstack_protector_all,
4224 options::OPT_fstack_protector_strong,
4225 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004226 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004227 StackProtectorLevel = std::max<unsigned>(
4228 LangOptions::SSPOn,
4229 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004230 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004231 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004232 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004233 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004234 } else {
4235 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004236 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004237 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004238 if (StackProtectorLevel) {
4239 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004240 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004241 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004242
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004243 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004244 for (const Arg *A : Args.filtered(options::OPT__param)) {
4245 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004246 if (Str.startswith("ssp-buffer-size=")) {
4247 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004248 CmdArgs.push_back("-stack-protector-buffer-size");
4249 // FIXME: Verify the argument is a valid integer.
4250 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004251 }
Sean Silva14facf32015-06-09 01:57:17 +00004252 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004253 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004254 }
4255
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004256 // Translate -mstackrealign
4257 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4258 false)) {
4259 CmdArgs.push_back("-backend-option");
4260 CmdArgs.push_back("-force-align-stack");
4261 }
4262 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004263 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004264 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4265 }
4266
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004267 if (Args.hasArg(options::OPT_mstack_alignment)) {
4268 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4269 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004270 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004271
Hans Wennborg77dc2362015-01-20 19:45:50 +00004272 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4273 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4274
4275 if (!Size.empty())
4276 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4277 else
4278 CmdArgs.push_back("-mstack-probe-size=0");
4279 }
4280
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004281 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4282 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004283 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4284
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004285 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4286 options::OPT_mno_restrict_it)) {
4287 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4288 CmdArgs.push_back("-backend-option");
4289 CmdArgs.push_back("-arm-restrict-it");
4290 } else {
4291 CmdArgs.push_back("-backend-option");
4292 CmdArgs.push_back("-arm-no-restrict-it");
4293 }
James Y Knight2db38f32015-08-15 03:45:25 +00004294 } else if (Triple.isOSWindows() &&
4295 (Triple.getArch() == llvm::Triple::arm ||
4296 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004297 // Windows on ARM expects restricted IT blocks
4298 CmdArgs.push_back("-backend-option");
4299 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004300 }
4301
Daniel Dunbard18049a2009-04-07 21:16:11 +00004302 // Forward -f options with positive and negative forms; we translate
4303 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004304 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4305 StringRef fname = A->getValue();
4306 if (!llvm::sys::fs::exists(fname))
4307 D.Diag(diag::err_drv_no_such_file) << fname;
4308 else
4309 A->render(Args, CmdArgs);
4310 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004311
John Brawna7b4ec02015-08-10 11:11:28 +00004312 // -fbuiltin is default unless -mkernel is used
4313 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4314 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004315 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004316
Nuno Lopes13c88c72009-12-16 16:59:22 +00004317 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4318 options::OPT_fno_assume_sane_operator_new))
4319 CmdArgs.push_back("-fno-assume-sane-operator-new");
4320
Daniel Dunbar4930e332009-11-17 08:07:36 +00004321 // -fblocks=0 is default.
4322 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004323 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004324 (Args.hasArg(options::OPT_fgnu_runtime) &&
4325 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4326 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004327 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004328
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004329 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004330 !getToolChain().hasBlocksRuntime())
4331 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004332 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004333
Richard Smith47972af2015-06-16 00:08:24 +00004334 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004335 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004336 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004337 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004338 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004339 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4340 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004341 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004342 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004343 HaveModules = true;
4344 }
4345 }
4346
Richard Smith47972af2015-06-16 00:08:24 +00004347 // -fmodule-maps enables implicit reading of module map files. By default,
4348 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004349 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4350 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004351 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004352 }
4353
Daniel Jasperac42b752013-10-21 06:34:34 +00004354 // -fmodules-decluse checks that modules used are declared so (off by
4355 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004356 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004357 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004358 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004359 }
4360
Daniel Jasper962b38e2014-04-11 11:47:45 +00004361 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4362 // all #included headers are part of modules.
4363 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004364 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004365 CmdArgs.push_back("-fmodules-strict-decluse");
4366 }
4367
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004368 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4369 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4370 options::OPT_fno_implicit_modules)) {
4371 CmdArgs.push_back("-fno-implicit-modules");
4372 }
4373
Daniel Jasperac42b752013-10-21 06:34:34 +00004374 // -fmodule-name specifies the module that is currently being built (or
4375 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004376 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004377
Richard Smith9887d792014-10-17 01:42:53 +00004378 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004379 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004380 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004381
Richard Smithe842a472014-10-22 02:05:46 +00004382 // -fmodule-file can be used to specify files containing precompiled modules.
4383 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4384
4385 // -fmodule-cache-path specifies where our implicitly-built module files
4386 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004387 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004388 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004389 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004390 if (HaveModules) {
4391 if (C.isForDiagnostics()) {
4392 // When generating crash reports, we want to emit the modules along with
4393 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004394 Path = Output.getFilename();
4395 llvm::sys::path::replace_extension(Path, ".cache");
4396 llvm::sys::path::append(Path, "modules");
4397 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004398 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004399 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004400 llvm::sys::path::append(Path, "org.llvm.clang.");
4401 appendUserToPath(Path);
4402 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004403 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004404 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004405 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4406 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004407 }
4408
4409 // When building modules and generating crashdumps, we need to dump a module
4410 // dependency VFS alongside the output.
4411 if (HaveModules && C.isForDiagnostics()) {
4412 SmallString<128> VFSDir(Output.getFilename());
4413 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004414 // Add the cache directory as a temp so the crash diagnostics pick it up.
4415 C.addTempFile(Args.MakeArgString(VFSDir));
4416
Justin Bognera88f0122014-06-20 22:59:50 +00004417 llvm::sys::path::append(VFSDir, "vfs");
4418 CmdArgs.push_back("-module-dependency-dir");
4419 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004420 }
4421
Richard Smith9887d792014-10-17 01:42:53 +00004422 if (HaveModules)
4423 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004424
Douglas Gregor35b04d62013-02-07 19:01:24 +00004425 // Pass through all -fmodules-ignore-macro arguments.
4426 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004427 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4428 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004429
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004430 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4431
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004432 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4433 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4434 D.Diag(diag::err_drv_argument_not_allowed_with)
4435 << A->getAsString(Args) << "-fbuild-session-timestamp";
4436
4437 llvm::sys::fs::file_status Status;
4438 if (llvm::sys::fs::status(A->getValue(), Status))
4439 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004440 CmdArgs.push_back(Args.MakeArgString(
4441 "-fbuild-session-timestamp=" +
4442 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004443 }
4444
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004445 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004446 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4447 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004448 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4449
4450 Args.AddLastArg(CmdArgs,
4451 options::OPT_fmodules_validate_once_per_build_session);
4452 }
4453
Ben Langmuirdcf73862014-03-12 00:06:17 +00004454 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4455
John McCalldfea9982010-04-09 19:12:06 +00004456 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004457 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004458 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004459 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004460
Anders Carlssond470fef2010-11-21 00:09:52 +00004461 // -felide-constructors is the default.
4462 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004463 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004464 CmdArgs.push_back("-fno-elide-constructors");
4465
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004466 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004467
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004468 if (KernelOrKext || (types::isCXX(InputType) &&
4469 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4470 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004471 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004472
Tony Linthicum76329bf2011-12-12 21:14:55 +00004473 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004474 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4475 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004476 CmdArgs.push_back("-fshort-enums");
4477
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004478 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004479 if (Arg *A = Args.getLastArg(
4480 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4481 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4482 if (A->getOption().matches(options::OPT_funsigned_char) ||
4483 A->getOption().matches(options::OPT_fno_signed_char)) {
4484 CmdArgs.push_back("-fno-signed-char");
4485 }
4486 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004487 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004488 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004489
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004490 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004491 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4492 options::OPT_fno_use_cxa_atexit,
4493 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004494 getToolChain().getArch() != llvm::Triple::hexagon &&
4495 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004496 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004497 CmdArgs.push_back("-fno-use-cxa-atexit");
4498
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004499 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004500 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004501 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004502 CmdArgs.push_back("-fms-extensions");
4503
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004504 // -fno-use-line-directives is default.
4505 if (Args.hasFlag(options::OPT_fuse_line_directives,
4506 options::OPT_fno_use_line_directives, false))
4507 CmdArgs.push_back("-fuse-line-directives");
4508
Francois Pichet1b4f1632011-09-17 04:32:15 +00004509 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004510 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004511 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004512 (IsWindowsMSVC &&
4513 Args.hasFlag(options::OPT_fms_extensions,
4514 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004515 CmdArgs.push_back("-fms-compatibility");
4516
David Majnemerc371ff02015-03-22 08:39:22 +00004517 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004518 VersionTuple MSVT = visualstudio::getMSVCVersion(
4519 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4520 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004521 CmdArgs.push_back(
4522 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004523
David Majnemer8db91762015-05-18 04:49:30 +00004524 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4525 if (ImplyVCPPCXXVer) {
4526 if (IsMSVC2015Compatible)
4527 CmdArgs.push_back("-std=c++14");
4528 else
4529 CmdArgs.push_back("-std=c++11");
4530 }
4531
Eric Christopher5ecce122013-02-18 00:38:31 +00004532 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004533 if (Args.hasFlag(options::OPT_fborland_extensions,
4534 options::OPT_fno_borland_extensions, false))
4535 CmdArgs.push_back("-fborland-extensions");
4536
David Majnemerc371ff02015-03-22 08:39:22 +00004537 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4538 // than 19.
4539 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4540 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004541 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004542 CmdArgs.push_back("-fno-threadsafe-statics");
4543
Francois Pichet02744872011-09-01 16:38:08 +00004544 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4545 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004546 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004547 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004548 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004549
Chandler Carruthe03aa552010-04-17 20:17:31 +00004550 // -fgnu-keywords default varies depending on language; only pass if
4551 // specified.
4552 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004553 options::OPT_fno_gnu_keywords))
4554 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004555
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004556 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004557 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004558 CmdArgs.push_back("-fgnu89-inline");
4559
Chad Rosier9c76d242012-03-15 22:31:42 +00004560 if (Args.hasArg(options::OPT_fno_inline))
4561 CmdArgs.push_back("-fno-inline");
4562
Chad Rosier64d6be92012-03-06 21:17:19 +00004563 if (Args.hasArg(options::OPT_fno_inline_functions))
4564 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004565
John McCall5fb5df92012-06-20 06:18:46 +00004566 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004567
John McCall5fb5df92012-06-20 06:18:46 +00004568 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004569 // legacy is the default. Except for deployment taget of 10.5,
4570 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4571 // gets ignored silently.
4572 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004573 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4574 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004575 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004576 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004577 if (getToolChain().UseObjCMixedDispatch())
4578 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4579 else
4580 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4581 }
4582 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004583
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004584 // When ObjectiveC legacy runtime is in effect on MacOSX,
4585 // turn on the option to do Array/Dictionary subscripting
4586 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004587 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004588 getToolChain().getTriple().isMacOSX() &&
4589 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4590 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004591 objcRuntime.isNeXTFamily())
4592 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004593
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004594 // -fencode-extended-block-signature=1 is default.
4595 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4596 CmdArgs.push_back("-fencode-extended-block-signature");
4597 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004598
John McCall24fc0de2011-07-06 00:26:06 +00004599 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4600 // NOTE: This logic is duplicated in ToolChains.cpp.
4601 bool ARC = isObjCAutoRefCount(Args);
4602 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004603 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004604
John McCall24fc0de2011-07-06 00:26:06 +00004605 CmdArgs.push_back("-fobjc-arc");
4606
Chandler Carruth491db322011-11-04 07:34:47 +00004607 // FIXME: It seems like this entire block, and several around it should be
4608 // wrapped in isObjC, but for now we just use it here as this is where it
4609 // was being used previously.
4610 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4611 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4612 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4613 else
4614 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4615 }
4616
John McCall24fc0de2011-07-06 00:26:06 +00004617 // Allow the user to enable full exceptions code emission.
4618 // We define off for Objective-CC, on for Objective-C++.
4619 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4620 options::OPT_fno_objc_arc_exceptions,
4621 /*default*/ types::isCXX(InputType)))
4622 CmdArgs.push_back("-fobjc-arc-exceptions");
4623 }
4624
4625 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4626 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004627 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004628 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004629
John McCall24fc0de2011-07-06 00:26:06 +00004630 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4631 // takes precedence.
4632 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4633 if (!GCArg)
4634 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4635 if (GCArg) {
4636 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004637 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004638 } else if (getToolChain().SupportsObjCGC()) {
4639 GCArg->render(Args, CmdArgs);
4640 } else {
4641 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004642 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004643 }
4644 }
4645
Bob Wilsonb111ec92015-03-02 19:01:14 +00004646 if (Args.hasFlag(options::OPT_fapplication_extension,
4647 options::OPT_fno_application_extension, false))
4648 CmdArgs.push_back("-fapplication-extension");
4649
Reid Klecknerc542d372014-06-27 17:02:02 +00004650 // Handle GCC-style exception args.
4651 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004652 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4653 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004654
4655 if (getToolChain().UseSjLjExceptions())
4656 CmdArgs.push_back("-fsjlj-exceptions");
4657
4658 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004659 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4660 options::OPT_fno_assume_sane_operator_new))
4661 CmdArgs.push_back("-fno-assume-sane-operator-new");
4662
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004663 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4664 // most platforms.
4665 if (Args.hasFlag(options::OPT_fsized_deallocation,
4666 options::OPT_fno_sized_deallocation, false))
4667 CmdArgs.push_back("-fsized-deallocation");
4668
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004669 // -fconstant-cfstrings is default, and may be subject to argument translation
4670 // on Darwin.
4671 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4672 options::OPT_fno_constant_cfstrings) ||
4673 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4674 options::OPT_mno_constant_cfstrings))
4675 CmdArgs.push_back("-fno-constant-cfstrings");
4676
John Thompsoned4e2952009-11-05 20:14:16 +00004677 // -fshort-wchar default varies depending on platform; only
4678 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004679 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4680 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004681 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004682
Hans Wennborg28c96312013-07-31 23:39:13 +00004683 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004684 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004685 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004686 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004687
Daniel Dunbar096ed292011-10-05 21:04:55 +00004688 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4689 // -fno-pack-struct doesn't apply to -fpack-struct=.
4690 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004691 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004692 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004693 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004694 } else if (Args.hasFlag(options::OPT_fpack_struct,
4695 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004696 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004697 }
4698
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004699 // Handle -fmax-type-align=N and -fno-type-align
4700 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4701 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4702 if (!SkipMaxTypeAlign) {
4703 std::string MaxTypeAlignStr = "-fmax-type-align=";
4704 MaxTypeAlignStr += A->getValue();
4705 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4706 }
4707 } else if (getToolChain().getTriple().isOSDarwin()) {
4708 if (!SkipMaxTypeAlign) {
4709 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4710 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4711 }
4712 }
4713
John Brawna7b4ec02015-08-10 11:11:28 +00004714 // -fcommon is the default unless compiling kernel code or the target says so
4715 bool NoCommonDefault =
4716 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4717 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4718 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004719 CmdArgs.push_back("-fno-common");
4720
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004721 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004722 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004723 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004724 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004725 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004726 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004727
Daniel Dunbar6358d682010-10-15 22:30:42 +00004728 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004729 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004730 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004731 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004732
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004733 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004734 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4735 StringRef value = inputCharset->getValue();
4736 if (value != "UTF-8")
4737 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4738 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004739 }
4740
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004741 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004742 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4743 StringRef value = execCharset->getValue();
4744 if (value != "UTF-8")
4745 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4746 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004747 }
4748
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004749 // -fcaret-diagnostics is default.
4750 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4751 options::OPT_fno_caret_diagnostics, true))
4752 CmdArgs.push_back("-fno-caret-diagnostics");
4753
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004754 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004755 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004756 options::OPT_fno_diagnostics_fixit_info))
4757 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004758
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004759 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004760 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004761 options::OPT_fno_diagnostics_show_option))
4762 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004763
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004764 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004765 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004766 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004767 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004768 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004769
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004770 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004771 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004772 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004773 }
4774
Chandler Carruthb6766f02011-03-27 01:50:55 +00004775 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004776 options::OPT_fdiagnostics_show_note_include_stack,
4777 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004778 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004779 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004780 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4781 else
4782 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4783 }
4784
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004785 // Color diagnostics are the default, unless the terminal doesn't support
4786 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004787 // Support both clang's -f[no-]color-diagnostics and gcc's
4788 // -f[no-]diagnostics-colors[=never|always|auto].
4789 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004790 for (const auto &Arg : Args) {
4791 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004792 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4793 !O.matches(options::OPT_fdiagnostics_color) &&
4794 !O.matches(options::OPT_fno_color_diagnostics) &&
4795 !O.matches(options::OPT_fno_diagnostics_color) &&
4796 !O.matches(options::OPT_fdiagnostics_color_EQ))
4797 continue;
4798
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004799 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004800 if (O.matches(options::OPT_fcolor_diagnostics) ||
4801 O.matches(options::OPT_fdiagnostics_color)) {
4802 ShowColors = Colors_On;
4803 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4804 O.matches(options::OPT_fno_diagnostics_color)) {
4805 ShowColors = Colors_Off;
4806 } else {
4807 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004808 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004809 if (value == "always")
4810 ShowColors = Colors_On;
4811 else if (value == "never")
4812 ShowColors = Colors_Off;
4813 else if (value == "auto")
4814 ShowColors = Colors_Auto;
4815 else
4816 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004817 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004818 }
4819 }
4820 if (ShowColors == Colors_On ||
4821 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004822 CmdArgs.push_back("-fcolor-diagnostics");
4823
Nico Rieck7857d462013-09-11 00:38:02 +00004824 if (Args.hasArg(options::OPT_fansi_escape_codes))
4825 CmdArgs.push_back("-fansi-escape-codes");
4826
Daniel Dunbardb097022009-06-08 21:13:54 +00004827 if (!Args.hasFlag(options::OPT_fshow_source_location,
4828 options::OPT_fno_show_source_location))
4829 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004830
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004831 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004832 true))
4833 CmdArgs.push_back("-fno-show-column");
4834
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004835 if (!Args.hasFlag(options::OPT_fspell_checking,
4836 options::OPT_fno_spell_checking))
4837 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004838
Chad Rosierc8e56e82012-12-05 21:08:21 +00004839 // -fno-asm-blocks is default.
4840 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4841 false))
4842 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004843
Steven Wucb0d13f2015-01-16 23:05:28 +00004844 // -fgnu-inline-asm is default.
4845 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4846 options::OPT_fno_gnu_inline_asm, true))
4847 CmdArgs.push_back("-fno-gnu-inline-asm");
4848
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004849 // Enable vectorization per default according to the optimization level
4850 // selected. For optimization levels that want vectorization we use the alias
4851 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004852 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004853 OptSpecifier VectorizeAliasOption =
4854 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004855 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004856 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004857 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004858
Chad Rosier136d67d2014-04-28 19:30:57 +00004859 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004860 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004861 OptSpecifier SLPVectAliasOption =
4862 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004863 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004864 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004865 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004866
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004867 // -fno-slp-vectorize-aggressive is default.
4868 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004869 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004870 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004871
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004872 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4873 A->render(Args, CmdArgs);
4874
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004875 // -fdollars-in-identifiers default varies depending on platform and
4876 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004877 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004878 options::OPT_fno_dollars_in_identifiers)) {
4879 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004880 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004881 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004882 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004883 }
4884
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004885 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4886 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004887 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004888 options::OPT_fno_unit_at_a_time)) {
4889 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004890 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004891 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004892
Eli Friedman055c9702011-11-02 01:53:16 +00004893 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4894 options::OPT_fno_apple_pragma_pack, false))
4895 CmdArgs.push_back("-fapple-pragma-pack");
4896
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004897 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004898 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4899 // by default.
4900 if (getToolChain().getArch() == llvm::Triple::le32) {
4901 CmdArgs.push_back("-fno-math-builtin");
4902 }
4903
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004904// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4905//
4906// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004907#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004908 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004909 (getToolChain().getArch() == llvm::Triple::arm ||
4910 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004911 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4912 CmdArgs.push_back("-fno-builtin-strcat");
4913 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4914 CmdArgs.push_back("-fno-builtin-strcpy");
4915 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004916#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004917
Justin Bognera88f0122014-06-20 22:59:50 +00004918 // Enable rewrite includes if the user's asked for it or if we're generating
4919 // diagnostics.
4920 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4921 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004922 if (Args.hasFlag(options::OPT_frewrite_includes,
4923 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004924 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004925 CmdArgs.push_back("-frewrite-includes");
4926
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004927 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004928 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004929 options::OPT_traditional_cpp)) {
4930 if (isa<PreprocessJobAction>(JA))
4931 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004932 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004933 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004934 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004935
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004936 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004937 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004938
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004939 // Handle serialized diagnostics.
4940 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4941 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004942 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004943 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004944
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004945 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4946 CmdArgs.push_back("-fretain-comments-from-system-headers");
4947
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004948 // Forward -fcomment-block-commands to -cc1.
4949 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004950 // Forward -fparse-all-comments to -cc1.
4951 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004952
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004953 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4954 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004955 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004956 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4957 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004958
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004959 // We translate this by hand to the -cc1 argument, since nightly test uses
4960 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004961 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004962 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004963 } else
Sean Silva14facf32015-06-09 01:57:17 +00004964 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004965 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004966
Bob Wilson23a55f12014-12-21 07:00:00 +00004967 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004968 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4969 // by the frontend.
4970 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4971 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004972
Daniel Dunbard67a3222009-03-30 06:36:42 +00004973 if (Output.getType() == types::TY_Dependencies) {
4974 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004975 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004976 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004977 CmdArgs.push_back(Output.getFilename());
4978 } else {
4979 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004980 }
4981
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004982 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004983
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004984 if (Input.isFilename())
4985 CmdArgs.push_back(Input.getFilename());
4986 else
4987 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004988
Chris Lattnere9d7d782009-11-03 19:50:27 +00004989 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4990
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004991 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004992
4993 // Optionally embed the -cc1 level arguments into the debug info, for build
4994 // analysis.
4995 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004996 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004997 for (const auto &Arg : Args)
4998 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004999
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005000 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005001 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005002 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005003 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005004 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005005 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005006 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005007 }
5008 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005009 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005010 }
5011
Eric Christopherd3804002013-02-22 20:12:52 +00005012 // Add the split debug info name to the command lines here so we
5013 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005014 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005015 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5016 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005017 const char *SplitDwarfOut;
5018 if (SplitDwarf) {
5019 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005020 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005021 CmdArgs.push_back(SplitDwarfOut);
5022 }
5023
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005024 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5025 // Include them with -fcuda-include-gpubinary.
5026 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005027 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005028 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005029 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005030 }
5031
Eric Christopherd3804002013-02-22 20:12:52 +00005032 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005033 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005034 Output.getType() == types::TY_Object &&
5035 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005036 auto CLCommand =
5037 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005038 C.addCommand(llvm::make_unique<FallbackCommand>(
5039 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005040 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005041 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005042 }
5043
Eric Christopherf1545832013-02-22 23:50:16 +00005044 // Handle the debug info splitting at object creation time if we're
5045 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005046 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005047 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005048 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005049
Roman Divacky178e01602011-02-10 16:52:03 +00005050 if (Arg *A = Args.getLastArg(options::OPT_pg))
5051 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005052 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5053 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005054
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005055 // Claim some arguments which clang supports automatically.
5056
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005057 // -fpch-preprocess is used with gcc to add a special marker in the output to
5058 // include the PCH file. Clang's PTH solution is completely transparent, so we
5059 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005060 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005061
Daniel Dunbar17731772009-03-23 19:03:36 +00005062 // Claim some arguments which clang doesn't support, but we don't
5063 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005064 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5065 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005066
Rafael Espindolab0092d72013-09-04 19:37:35 +00005067 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005068 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005069}
5070
John McCall5fb5df92012-06-20 06:18:46 +00005071/// Add options related to the Objective-C runtime/ABI.
5072///
5073/// Returns true if the runtime is non-fragile.
5074ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5075 ArgStringList &cmdArgs,
5076 RewriteKind rewriteKind) const {
5077 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005078 Arg *runtimeArg =
5079 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5080 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005081
5082 // Just forward -fobjc-runtime= to the frontend. This supercedes
5083 // options about fragility.
5084 if (runtimeArg &&
5085 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5086 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005087 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005088 if (runtime.tryParse(value)) {
5089 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005090 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005091 }
5092
5093 runtimeArg->render(args, cmdArgs);
5094 return runtime;
5095 }
5096
5097 // Otherwise, we'll need the ABI "version". Version numbers are
5098 // slightly confusing for historical reasons:
5099 // 1 - Traditional "fragile" ABI
5100 // 2 - Non-fragile ABI, version 1
5101 // 3 - Non-fragile ABI, version 2
5102 unsigned objcABIVersion = 1;
5103 // If -fobjc-abi-version= is present, use that to set the version.
5104 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005105 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005106 if (value == "1")
5107 objcABIVersion = 1;
5108 else if (value == "2")
5109 objcABIVersion = 2;
5110 else if (value == "3")
5111 objcABIVersion = 3;
5112 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005113 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005114 } else {
5115 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005116 bool nonFragileABIIsDefault =
5117 (rewriteKind == RK_NonFragile ||
5118 (rewriteKind == RK_None &&
5119 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005120 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5121 options::OPT_fno_objc_nonfragile_abi,
5122 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005123// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005124#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5125 unsigned nonFragileABIVersion = 1;
5126#else
5127 unsigned nonFragileABIVersion = 2;
5128#endif
5129
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005130 if (Arg *abiArg =
5131 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005132 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005133 if (value == "1")
5134 nonFragileABIVersion = 1;
5135 else if (value == "2")
5136 nonFragileABIVersion = 2;
5137 else
5138 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005139 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005140 }
5141
5142 objcABIVersion = 1 + nonFragileABIVersion;
5143 } else {
5144 objcABIVersion = 1;
5145 }
5146 }
5147
5148 // We don't actually care about the ABI version other than whether
5149 // it's non-fragile.
5150 bool isNonFragile = objcABIVersion != 1;
5151
5152 // If we have no runtime argument, ask the toolchain for its default runtime.
5153 // However, the rewriter only really supports the Mac runtime, so assume that.
5154 ObjCRuntime runtime;
5155 if (!runtimeArg) {
5156 switch (rewriteKind) {
5157 case RK_None:
5158 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5159 break;
5160 case RK_Fragile:
5161 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5162 break;
5163 case RK_NonFragile:
5164 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5165 break;
5166 }
5167
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005168 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005169 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5170 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005171 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005172 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005174 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005175 } else {
5176 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5177 }
5178
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005179 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005180 } else {
5181 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005182 // Legacy behaviour is to target the gnustep runtime if we are i
5183 // non-fragile mode or the GCC runtime in fragile mode.
5184 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005185 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005186 else
5187 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005188 }
5189
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005190 cmdArgs.push_back(
5191 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005192 return runtime;
5193}
5194
Reid Klecknerc542d372014-06-27 17:02:02 +00005195static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5196 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5197 I += HaveDash;
5198 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005199}
Reid Klecknerc542d372014-06-27 17:02:02 +00005200
5201struct EHFlags {
5202 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5203 bool Synch;
5204 bool Asynch;
5205 bool NoExceptC;
5206};
5207
5208/// /EH controls whether to run destructor cleanups when exceptions are
5209/// thrown. There are three modifiers:
5210/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5211/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5212/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5213/// - c: Assume that extern "C" functions are implicitly noexcept. This
5214/// modifier is an optimization, so we ignore it for now.
5215/// The default is /EHs-c-, meaning cleanups are disabled.
5216static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5217 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005218
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005219 std::vector<std::string> EHArgs =
5220 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005221 for (auto EHVal : EHArgs) {
5222 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5223 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005224 case 'a':
5225 EH.Asynch = maybeConsumeDash(EHVal, I);
5226 continue;
5227 case 'c':
5228 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5229 continue;
5230 case 's':
5231 EH.Synch = maybeConsumeDash(EHVal, I);
5232 continue;
5233 default:
5234 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005235 }
5236 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5237 break;
5238 }
5239 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005240
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005241 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5242 // can use -Xclang to manually enable C++ EH until then.
5243 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005244
Reid Klecknerc542d372014-06-27 17:02:02 +00005245 return EH;
5246}
5247
Hans Wennborg75958c42013-08-08 00:17:41 +00005248void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5249 unsigned RTOptionID = options::OPT__SLASH_MT;
5250
Hans Wennborgf1a74252013-09-10 20:18:04 +00005251 if (Args.hasArg(options::OPT__SLASH_LDd))
5252 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5253 // but defining _DEBUG is sticky.
5254 RTOptionID = options::OPT__SLASH_MTd;
5255
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005256 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005257 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005258
David Majnemere2afb472015-07-24 06:49:13 +00005259 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005260 switch (RTOptionID) {
5261 case options::OPT__SLASH_MD:
5262 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005263 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005264 CmdArgs.push_back("-D_MT");
5265 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005266 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005267 break;
5268 case options::OPT__SLASH_MDd:
5269 CmdArgs.push_back("-D_DEBUG");
5270 CmdArgs.push_back("-D_MT");
5271 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005272 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005273 break;
5274 case options::OPT__SLASH_MT:
5275 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005276 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005277 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005278 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005279 break;
5280 case options::OPT__SLASH_MTd:
5281 CmdArgs.push_back("-D_DEBUG");
5282 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005283 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005284 break;
5285 default:
5286 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005287 }
5288
David Majnemere2afb472015-07-24 06:49:13 +00005289 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5290 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5291 } else {
5292 CmdArgs.push_back(FlagForCRT.data());
5293
5294 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5295 // users want. The /Za flag to cl.exe turns this off, but it's not
5296 // implemented in clang.
5297 CmdArgs.push_back("--dependent-lib=oldnames");
5298 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005299
Hans Wennborg8858a032014-07-21 23:42:07 +00005300 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5301 // would produce interleaved output, so ignore /showIncludes in such cases.
5302 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5303 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5304 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005305
David Majnemerf6072342014-07-01 22:24:56 +00005306 // This controls whether or not we emit RTTI data for polymorphic types.
5307 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5308 /*default=*/false))
5309 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005310
Reid Kleckner124955a2015-08-05 18:51:13 +00005311 // Emit CodeView if -Z7 is present.
5312 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5313 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5314 // If we are emitting CV but not DWARF, don't build information that LLVM
5315 // can't yet process.
5316 if (EmitCodeView && !EmitDwarf)
5317 CmdArgs.push_back("-gline-tables-only");
5318 if (EmitCodeView)
5319 CmdArgs.push_back("-gcodeview");
5320
Reid Klecknerc542d372014-06-27 17:02:02 +00005321 const Driver &D = getToolChain().getDriver();
5322 EHFlags EH = parseClangCLEHFlags(D, Args);
5323 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005324 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005325 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005326 CmdArgs.push_back("-fexceptions");
5327 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005328
Hans Wennborge50cec32014-06-13 20:59:54 +00005329 // /EP should expand to -E -P.
5330 if (Args.hasArg(options::OPT__SLASH_EP)) {
5331 CmdArgs.push_back("-E");
5332 CmdArgs.push_back("-P");
5333 }
5334
David Majnemera5b195a2015-02-14 01:35:12 +00005335 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005336 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5337 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005338 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5339 else
5340 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5341
5342 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5343 VolatileOptionID = A->getOption().getID();
5344
5345 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5346 CmdArgs.push_back("-fms-volatile");
5347
David Majnemer86c318f2014-02-11 21:05:00 +00005348 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5349 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5350 if (MostGeneralArg && BestCaseArg)
5351 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5352 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5353
5354 if (MostGeneralArg) {
5355 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5356 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5357 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5358
5359 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5360 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5361 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5362 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5363 << FirstConflict->getAsString(Args)
5364 << SecondConflict->getAsString(Args);
5365
5366 if (SingleArg)
5367 CmdArgs.push_back("-fms-memptr-rep=single");
5368 else if (MultipleArg)
5369 CmdArgs.push_back("-fms-memptr-rep=multiple");
5370 else
5371 CmdArgs.push_back("-fms-memptr-rep=virtual");
5372 }
5373
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005374 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5375 A->render(Args, CmdArgs);
5376
Hans Wennborg81f74482013-09-10 01:07:07 +00005377 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5378 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005379 if (Args.hasArg(options::OPT__SLASH_fallback))
5380 CmdArgs.push_back("msvc-fallback");
5381 else
5382 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005383 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005384}
5385
Douglas Katzman95354292015-06-23 20:42:09 +00005386visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005387 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005388 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005389 return CLFallback.get();
5390}
5391
Daniel Sanders7f933f42015-01-30 17:35:23 +00005392void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5393 ArgStringList &CmdArgs) const {
5394 StringRef CPUName;
5395 StringRef ABIName;
5396 const llvm::Triple &Triple = getToolChain().getTriple();
5397 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5398
5399 CmdArgs.push_back("-target-abi");
5400 CmdArgs.push_back(ABIName.data());
5401}
5402
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005403void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005404 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005405 const ArgList &Args,
5406 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005407 ArgStringList CmdArgs;
5408
5409 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5410 const InputInfo &Input = Inputs[0];
5411
James Y Knight2db38f32015-08-15 03:45:25 +00005412 std::string TripleStr =
5413 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5414 const llvm::Triple Triple(TripleStr);
5415
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005416 // Don't warn about "clang -w -c foo.s"
5417 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005418 // and "clang -emit-llvm -c foo.s"
5419 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005420
Rafael Espindola577637a2015-01-03 00:06:04 +00005421 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005422
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005423 // Invoke ourselves in -cc1as mode.
5424 //
5425 // FIXME: Implement custom jobs for internal actions.
5426 CmdArgs.push_back("-cc1as");
5427
5428 // Add the "effective" target triple.
5429 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005430 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5431
5432 // Set the output mode, we currently only expect to be used as a real
5433 // assembler.
5434 CmdArgs.push_back("-filetype");
5435 CmdArgs.push_back("obj");
5436
Eric Christopher45f2e712012-12-18 00:31:10 +00005437 // Set the main file name, so that debug info works even with
5438 // -save-temps or preprocessed assembly.
5439 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005440 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005441
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005442 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005443 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005444 if (!CPU.empty()) {
5445 CmdArgs.push_back("-target-cpu");
5446 CmdArgs.push_back(Args.MakeArgString(CPU));
5447 }
5448
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005449 // Add the target features
5450 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005451 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005452
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005453 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005454 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005455
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005456 // Pass along any -I options so we get proper .include search paths.
5457 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5458
Eric Christopherfc3ee562012-01-10 00:38:01 +00005459 // Determine the original source input.
5460 const Action *SourceAction = &JA;
5461 while (SourceAction->getKind() != Action::InputClass) {
5462 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5463 SourceAction = SourceAction->getInputs()[0];
5464 }
5465
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005466 // Forward -g and handle debug info related flags, assuming we are dealing
5467 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005468 if (SourceAction->getType() == types::TY_Asm ||
5469 SourceAction->getType() == types::TY_PP_Asm) {
5470 Args.ClaimAllArgs(options::OPT_g_Group);
5471 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5472 if (!A->getOption().matches(options::OPT_g0))
5473 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005474
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005475 if (Args.hasArg(options::OPT_gdwarf_2))
5476 CmdArgs.push_back("-gdwarf-2");
5477 if (Args.hasArg(options::OPT_gdwarf_3))
5478 CmdArgs.push_back("-gdwarf-3");
5479 if (Args.hasArg(options::OPT_gdwarf_4))
5480 CmdArgs.push_back("-gdwarf-4");
5481
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005482 // Add the -fdebug-compilation-dir flag if needed.
5483 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005484
5485 // Set the AT_producer to the clang version when using the integrated
5486 // assembler on assembly source files.
5487 CmdArgs.push_back("-dwarf-debug-producer");
5488 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005489
5490 // And pass along -I options
5491 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005492 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005493
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005494 // Handle -fPIC et al -- the relocation-model affects the assembler
5495 // for some targets.
5496 llvm::Reloc::Model RelocationModel;
5497 unsigned PICLevel;
5498 bool IsPIE;
5499 std::tie(RelocationModel, PICLevel, IsPIE) =
5500 ParsePICArgs(getToolChain(), Triple, Args);
5501
5502 const char *RMName = RelocationModelName(RelocationModel);
5503 if (RMName) {
5504 CmdArgs.push_back("-mrelocation-model");
5505 CmdArgs.push_back(RMName);
5506 }
5507
Kevin Enderby292dc082011-12-22 19:31:58 +00005508 // Optionally embed the -cc1as level arguments into the debug info, for build
5509 // analysis.
5510 if (getToolChain().UseDwarfDebugFlags()) {
5511 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005512 for (const auto &Arg : Args)
5513 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005514
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005515 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005516 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5517 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005518 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005519 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005520 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005521 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005522 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005523 }
5524 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005525 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005526 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005527
5528 // FIXME: Add -static support, once we have it.
5529
Daniel Sanders7f933f42015-01-30 17:35:23 +00005530 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005531 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005532 default:
5533 break;
5534
5535 case llvm::Triple::mips:
5536 case llvm::Triple::mipsel:
5537 case llvm::Triple::mips64:
5538 case llvm::Triple::mips64el:
5539 AddMIPSTargetArgs(Args, CmdArgs);
5540 break;
5541 }
5542
David Blaikie372d9502014-01-17 03:17:40 +00005543 // Consume all the warning flags. Usually this would be handled more
5544 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5545 // doesn't handle that so rather than warning about unused flags that are
5546 // actually used, we'll lie by omission instead.
5547 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005548 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5549 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005550
David Blaikie9260ed62013-07-25 21:19:01 +00005551 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5552 getToolChain().getDriver());
5553
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005554 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005555
5556 assert(Output.isFilename() && "Unexpected lipo output.");
5557 CmdArgs.push_back("-o");
5558 CmdArgs.push_back(Output.getFilename());
5559
Daniel Dunbarb440f562010-08-02 02:38:21 +00005560 assert(Input.isFilename() && "Invalid input.");
5561 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005562
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005563 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005564 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005565
5566 // Handle the debug info splitting at object creation time if we're
5567 // creating an object.
5568 // TODO: Currently only works on linux with newer objcopy.
5569 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005570 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005571 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005572 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005573}
5574
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005575void GnuTool::anchor() {}
5576
Daniel Dunbara3246a02009-03-18 08:07:30 +00005577void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005578 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005579 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005580 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005581 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005582 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005583
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005584 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005585 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005586 // Don't forward any -g arguments to assembly steps.
5587 if (isa<AssembleJobAction>(JA) &&
5588 A->getOption().matches(options::OPT_g_Group))
5589 continue;
5590
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005591 // Don't forward any -W arguments to assembly and link steps.
5592 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5593 A->getOption().matches(options::OPT_W_Group))
5594 continue;
5595
Daniel Dunbar2da02722009-03-19 07:55:12 +00005596 // It is unfortunate that we have to claim here, as this means
5597 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005598 // platforms using a generic gcc, even if we are just using gcc
5599 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005600 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005601 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005602 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005603 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005604
Daniel Dunbar4e295052010-01-25 22:35:08 +00005605 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005606
5607 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005608 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005609 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005610 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005611 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005612 }
5613
Daniel Dunbar5716d872009-05-02 21:41:52 +00005614 // Try to force gcc to match the tool chain we want, if we recognize
5615 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005616 //
5617 // FIXME: The triple class should directly provide the information we want
5618 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005619 switch (getToolChain().getArch()) {
5620 default:
5621 break;
5622 case llvm::Triple::x86:
5623 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005624 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005625 break;
5626 case llvm::Triple::x86_64:
5627 case llvm::Triple::ppc64:
5628 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005629 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005630 break;
5631 case llvm::Triple::sparcel:
5632 CmdArgs.push_back("-EL");
5633 break;
5634 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005635
Daniel Dunbarb440f562010-08-02 02:38:21 +00005636 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005637 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005638 CmdArgs.push_back(Output.getFilename());
5639 } else {
5640 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005641 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005642 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005644 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005645
5646 // Only pass -x if gcc will understand it; otherwise hope gcc
5647 // understands the suffix correctly. The main use case this would go
5648 // wrong in is for linker inputs if they happened to have an odd
5649 // suffix; really the only way to get this to happen is a command
5650 // like '-x foobar a.c' which will treat a.c like a linker input.
5651 //
5652 // FIXME: For the linker case specifically, can we safely convert
5653 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005654 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005655 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005656 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5657 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005658 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005659 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005660 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005661 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005662 else if (II.getType() == types::TY_ModuleFile)
5663 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005664 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005665
Daniel Dunbara3246a02009-03-18 08:07:30 +00005666 if (types::canTypeBeUserSpecified(II.getType())) {
5667 CmdArgs.push_back("-x");
5668 CmdArgs.push_back(types::getTypeName(II.getType()));
5669 }
5670
Daniel Dunbarb440f562010-08-02 02:38:21 +00005671 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005672 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005673 else {
5674 const Arg &A = II.getInputArg();
5675
5676 // Reverse translate some rewritten options.
5677 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5678 CmdArgs.push_back("-lstdc++");
5679 continue;
5680 }
5681
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005682 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005683 A.render(Args, CmdArgs);
5684 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005685 }
5686
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005687 const std::string customGCCName = D.getCCCGenericGCCName();
5688 const char *GCCName;
5689 if (!customGCCName.empty())
5690 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005691 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005692 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005693 } else
5694 GCCName = "gcc";
5695
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005696 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005697 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005698}
5699
Douglas Katzman95354292015-06-23 20:42:09 +00005700void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5701 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005702 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005703}
5704
Douglas Katzman95354292015-06-23 20:42:09 +00005705void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5706 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005707 const Driver &D = getToolChain().getDriver();
5708
Eric Christophercc7ff502015-01-29 00:56:17 +00005709 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005710 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005711 case types::TY_LLVM_IR:
5712 case types::TY_LTO_IR:
5713 case types::TY_LLVM_BC:
5714 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005715 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005716 break;
5717 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005718 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005719 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005720 case types::TY_Nothing:
5721 CmdArgs.push_back("-fsyntax-only");
5722 break;
5723 default:
5724 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005725 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005726}
5727
Douglas Katzman95354292015-06-23 20:42:09 +00005728void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5729 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005730 // The types are (hopefully) good enough.
5731}
5732
Tony Linthicum76329bf2011-12-12 21:14:55 +00005733// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005734void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5735 ArgStringList &CmdArgs) const {}
5736void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5737 const InputInfo &Output,
5738 const InputInfoList &Inputs,
5739 const ArgList &Args,
5740 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005741 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005742
5743 const Driver &D = getToolChain().getDriver();
5744 ArgStringList CmdArgs;
5745
5746 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005747 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005748 CmdArgs.push_back(Args.MakeArgString(MarchString));
5749
5750 RenderExtraToolArgs(JA, CmdArgs);
5751
5752 if (Output.isFilename()) {
5753 CmdArgs.push_back("-o");
5754 CmdArgs.push_back(Output.getFilename());
5755 } else {
5756 assert(Output.isNothing() && "Unexpected output");
5757 CmdArgs.push_back("-fsyntax-only");
5758 }
5759
Douglas Katzman54366072015-07-27 16:53:08 +00005760 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005761 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005762
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005763 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005764
Tony Linthicum76329bf2011-12-12 21:14:55 +00005765 // Only pass -x if gcc will understand it; otherwise hope gcc
5766 // understands the suffix correctly. The main use case this would go
5767 // wrong in is for linker inputs if they happened to have an odd
5768 // suffix; really the only way to get this to happen is a command
5769 // like '-x foobar a.c' which will treat a.c like a linker input.
5770 //
5771 // FIXME: For the linker case specifically, can we safely convert
5772 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005773 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005774 // Don't try to pass LLVM or AST inputs to a generic gcc.
5775 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5776 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5777 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005778 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005779 else if (II.getType() == types::TY_AST)
5780 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005781 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005782 else if (II.getType() == types::TY_ModuleFile)
5783 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005784 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005785
5786 if (II.isFilename())
5787 CmdArgs.push_back(II.getFilename());
5788 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005789 // Don't render as input, we need gcc to do the translations.
5790 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005791 II.getInputArg().render(Args, CmdArgs);
5792 }
5793
5794 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005795 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005796 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005797}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005798
Douglas Katzman95354292015-06-23 20:42:09 +00005799void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5800 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005801 // The types are (hopefully) good enough.
5802}
5803
Douglas Katzman54366072015-07-27 16:53:08 +00005804static void
5805constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5806 const toolchains::HexagonToolChain &ToolChain,
5807 const InputInfo &Output, const InputInfoList &Inputs,
5808 const ArgList &Args, ArgStringList &CmdArgs,
5809 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005810
Matthew Curtise689b052012-12-06 15:46:07 +00005811 const Driver &D = ToolChain.getDriver();
5812
Matthew Curtise689b052012-12-06 15:46:07 +00005813 //----------------------------------------------------------------------------
5814 //
5815 //----------------------------------------------------------------------------
5816 bool hasStaticArg = Args.hasArg(options::OPT_static);
5817 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005818 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005819 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5820 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5821 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005822 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005823 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005824
Matthew Curtise689b052012-12-06 15:46:07 +00005825 //----------------------------------------------------------------------------
5826 // Silence warnings for various options
5827 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005828
Matthew Curtise689b052012-12-06 15:46:07 +00005829 Args.ClaimAllArgs(options::OPT_g_Group);
5830 Args.ClaimAllArgs(options::OPT_emit_llvm);
5831 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5832 // handled somewhere else.
5833 Args.ClaimAllArgs(options::OPT_static_libgcc);
5834
5835 //----------------------------------------------------------------------------
5836 //
5837 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005838 for (const auto &Opt : ToolChain.ExtraOpts)
5839 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005840
Douglas Katzman54366072015-07-27 16:53:08 +00005841 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005842 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005843
Matthew Curtise689b052012-12-06 15:46:07 +00005844 if (buildingLib) {
5845 CmdArgs.push_back("-shared");
5846 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5847 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005848 }
5849
Matthew Curtise689b052012-12-06 15:46:07 +00005850 if (hasStaticArg)
5851 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005852
Matthew Curtise8f80a12012-12-06 17:49:03 +00005853 if (buildPIE && !buildingLib)
5854 CmdArgs.push_back("-pie");
5855
Douglas Katzman54366072015-07-27 16:53:08 +00005856 if (const char *v =
5857 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005858 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005859 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005860 }
5861
Matthew Curtise689b052012-12-06 15:46:07 +00005862 //----------------------------------------------------------------------------
5863 //
5864 //----------------------------------------------------------------------------
5865 CmdArgs.push_back("-o");
5866 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005867
Matthew Curtise689b052012-12-06 15:46:07 +00005868 const std::string MarchSuffix = "/" + MarchString;
5869 const std::string G0Suffix = "/G0";
5870 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005871 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005872 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005873 const std::string StartFilesDir =
5874 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005875
5876 //----------------------------------------------------------------------------
5877 // moslib
5878 //----------------------------------------------------------------------------
5879 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005880 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005881
Sean Silva14facf32015-06-09 01:57:17 +00005882 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5883 A->claim();
5884 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005885 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005886 }
Matthew Curtise689b052012-12-06 15:46:07 +00005887 if (oslibs.empty()) {
5888 oslibs.push_back("standalone");
5889 hasStandalone = true;
5890 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005891
Matthew Curtise689b052012-12-06 15:46:07 +00005892 //----------------------------------------------------------------------------
5893 // Start Files
5894 //----------------------------------------------------------------------------
5895 if (incStdLib && incStartFiles) {
5896
5897 if (!buildingLib) {
5898 if (hasStandalone) {
5899 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005900 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005901 }
5902 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5903 }
5904 std::string initObj = useShared ? "/initS.o" : "/init.o";
5905 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5906 }
5907
5908 //----------------------------------------------------------------------------
5909 // Library Search Paths
5910 //----------------------------------------------------------------------------
5911 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005912 for (const auto &LibPath : LibPaths)
5913 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005914
5915 //----------------------------------------------------------------------------
5916 //
5917 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005918 Args.AddAllArgs(CmdArgs,
5919 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5920 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005921
5922 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5923
5924 //----------------------------------------------------------------------------
5925 // Libraries
5926 //----------------------------------------------------------------------------
5927 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005928 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005929 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5930 CmdArgs.push_back("-lm");
5931 }
5932
5933 CmdArgs.push_back("--start-group");
5934
5935 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005936 for (const std::string &Lib : oslibs)
5937 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005938 CmdArgs.push_back("-lc");
5939 }
5940 CmdArgs.push_back("-lgcc");
5941
5942 CmdArgs.push_back("--end-group");
5943 }
5944
5945 //----------------------------------------------------------------------------
5946 // End files
5947 //----------------------------------------------------------------------------
5948 if (incStdLib && incStartFiles) {
5949 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5950 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5951 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005952}
5953
Douglas Katzman95354292015-06-23 20:42:09 +00005954void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5955 const InputInfo &Output,
5956 const InputInfoList &Inputs,
5957 const ArgList &Args,
5958 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005959
Douglas Katzman54366072015-07-27 16:53:08 +00005960 const toolchains::HexagonToolChain &ToolChain =
5961 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005962
5963 ArgStringList CmdArgs;
5964 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5965 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005966
5967 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005968 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005969 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005970}
5971// Hexagon tools end.
5972
Tom Stellard8fa33092015-07-18 01:49:05 +00005973void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5974 const InputInfo &Output,
5975 const InputInfoList &Inputs,
5976 const ArgList &Args,
5977 const char *LinkingOutput) const {
5978
5979 std::string Linker = getToolChain().GetProgramPath(getShortName());
5980 ArgStringList CmdArgs;
5981 CmdArgs.push_back("-flavor");
5982 CmdArgs.push_back("gnu");
5983 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00005984 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00005985 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5986 CmdArgs.push_back("-o");
5987 CmdArgs.push_back(Output.getFilename());
5988 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5989 CmdArgs, Inputs));
5990}
5991// AMDGPU tools end.
5992
Renato Golin7c542b42015-07-27 23:44:45 +00005993const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005994 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00005995 if (!Arch.empty())
5996 MArch = Arch;
5997 else
Bernard Ogden31561762013-12-12 13:27:11 +00005998 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005999 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006000
6001 // Handle -march=native.
6002 if (MArch == "native") {
6003 std::string CPU = llvm::sys::getHostCPUName();
6004 if (CPU != "generic") {
6005 // Translate the native cpu into the architecture suffix for that CPU.
6006 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
6007 // If there is no valid architecture suffix for this CPU we don't know how
6008 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006009 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00006010 MArch = "";
6011 else
6012 MArch = std::string("arm") + Suffix;
6013 }
6014 }
6015
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006016 return MArch;
6017}
6018/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006019const char *arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006020 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006021 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6022 // here means an -march=native that we can't handle, so instead return no CPU.
6023 if (MArch.empty())
6024 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00006025
John Brawna95c1a82015-05-08 12:52:18 +00006026 // We need to return an empty string here on invalid MArch values as the
6027 // various places that call this function can't cope with a null result.
6028 const char *result = Triple.getARMCPUForArch(MArch);
6029 if (result)
6030 return result;
6031 else
6032 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00006033}
6034
6035/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006036std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006037 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006038 // FIXME: Warn on inconsistent use of -mcpu and -march.
6039 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006040 if (!CPU.empty()) {
6041 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006042 // Handle -mcpu=native.
6043 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006044 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006045 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006046 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006047 }
6048
Renato Goline17c5802015-07-27 23:44:42 +00006049 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006050}
6051
6052/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006053/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006054// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006055const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00006056 if (CPU == "generic")
6057 return llvm::ARMTargetParser::getSubArch(
6058 llvm::ARMTargetParser::parseArch(Arch));
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006059
Renato Golin3c007252015-05-28 15:05:53 +00006060 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
6061 if (ArchKind == llvm::ARM::AK_INVALID)
6062 return "";
6063 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006064}
6065
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006066void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006067 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006068 if (Args.hasArg(options::OPT_r))
6069 return;
6070
John Brawn94fd9632015-05-21 12:19:49 +00006071 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6072 // to generate BE-8 executables.
6073 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6074 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006075}
6076
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006077mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6078 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6079 .Case("mips1", NanLegacy)
6080 .Case("mips2", NanLegacy)
6081 .Case("mips3", NanLegacy)
6082 .Case("mips4", NanLegacy)
6083 .Case("mips5", NanLegacy)
6084 .Case("mips32", NanLegacy)
6085 .Case("mips32r2", NanLegacy)
6086 .Case("mips32r3", NanLegacy | Nan2008)
6087 .Case("mips32r5", NanLegacy | Nan2008)
6088 .Case("mips32r6", Nan2008)
6089 .Case("mips64", NanLegacy)
6090 .Case("mips64r2", NanLegacy)
6091 .Case("mips64r3", NanLegacy | Nan2008)
6092 .Case("mips64r5", NanLegacy | Nan2008)
6093 .Case("mips64r6", Nan2008)
6094 .Default(NanLegacy);
6095}
6096
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006097bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6098 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6099 return A && (A->getValue() == StringRef(Value));
6100}
6101
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006102bool mips::isUCLibc(const ArgList &Args) {
6103 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006104 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006105}
6106
Daniel Sanders2bf13662014-07-10 14:40:57 +00006107bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006108 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6109 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006110 .Case("2008", true)
6111 .Case("legacy", false)
6112 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006113
6114 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006115 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006116 .Cases("mips32r6", "mips64r6", true)
6117 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006118
6119 return false;
6120}
6121
Daniel Sanders379d44b2014-07-16 11:52:23 +00006122bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006123 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006124 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006125 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006126 return false;
6127
6128 if (ABIName != "32")
6129 return false;
6130
Toma Tabacu94ea6862015-06-16 13:54:13 +00006131 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6132 // present.
6133 if (FloatABI == "soft")
6134 return false;
6135
Daniel Sanders379d44b2014-07-16 11:52:23 +00006136 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006137 .Cases("mips2", "mips3", "mips4", "mips5", true)
6138 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6139 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6140 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006141}
6142
Toma Tabacu94ea6862015-06-16 13:54:13 +00006143bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6144 StringRef CPUName, StringRef ABIName,
6145 StringRef FloatABI) {
6146 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6147
6148 // FPXX shouldn't be used if -msingle-float is present.
6149 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6150 options::OPT_mdouble_float))
6151 if (A->getOption().matches(options::OPT_msingle_float))
6152 UseFPXX = false;
6153
6154 return UseFPXX;
6155}
6156
Tim Northover157d9112014-01-16 08:48:16 +00006157llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006158 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6159 // archs which Darwin doesn't use.
6160
6161 // The matching this routine does is fairly pointless, since it is neither the
6162 // complete architecture list, nor a reasonable subset. The problem is that
6163 // historically the driver driver accepts this and also ties its -march=
6164 // handling to the architecture name, so we need to be careful before removing
6165 // support for it.
6166
6167 // This code must be kept in sync with Clang's Darwin specific argument
6168 // translation.
6169
6170 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006171 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6172 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6173 .Case("ppc64", llvm::Triple::ppc64)
6174 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6175 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6176 llvm::Triple::x86)
6177 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6178 // This is derived from the driver driver.
6179 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6180 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6181 .Cases("armv7s", "xscale", llvm::Triple::arm)
6182 .Case("arm64", llvm::Triple::aarch64)
6183 .Case("r600", llvm::Triple::r600)
6184 .Case("amdgcn", llvm::Triple::amdgcn)
6185 .Case("nvptx", llvm::Triple::nvptx)
6186 .Case("nvptx64", llvm::Triple::nvptx64)
6187 .Case("amdil", llvm::Triple::amdil)
6188 .Case("spir", llvm::Triple::spir)
6189 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006190}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006191
Tim Northover157d9112014-01-16 08:48:16 +00006192void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006193 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006194 T.setArch(Arch);
6195
6196 if (Str == "x86_64h")
6197 T.setArchName(Str);
6198 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6199 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006200 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006201 }
6202}
6203
Bob Wilsondecc03e2012-11-23 06:14:39 +00006204const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006205 const InputInfo &Input) {
6206 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006207}
6208
Bob Wilsondecc03e2012-11-23 06:14:39 +00006209const char *Clang::getBaseInputStem(const ArgList &Args,
6210 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006211 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006212
Chris Lattner906bb902011-01-16 08:14:11 +00006213 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006214 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006215
6216 return Str;
6217}
6218
Bob Wilsondecc03e2012-11-23 06:14:39 +00006219const char *Clang::getDependencyFileName(const ArgList &Args,
6220 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006221 // FIXME: Think about this more.
6222 std::string Res;
6223
6224 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006225 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006226 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006227 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006228 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006229 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006230 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006231}
6232
Douglas Katzman95354292015-06-23 20:42:09 +00006233void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6234 const InputInfo &Output,
6235 const InputInfoList &Inputs,
6236 const ArgList &Args,
6237 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006238 const ToolChain &ToolChain = getToolChain();
6239 const Driver &D = ToolChain.getDriver();
6240 ArgStringList CmdArgs;
6241
6242 // Silence warning for "clang -g foo.o -o foo"
6243 Args.ClaimAllArgs(options::OPT_g_Group);
6244 // and "clang -emit-llvm foo.o -o foo"
6245 Args.ClaimAllArgs(options::OPT_emit_llvm);
6246 // and for "clang -w foo.o -o foo". Other warning options are already
6247 // handled somewhere else.
6248 Args.ClaimAllArgs(options::OPT_w);
6249
6250 if (!D.SysRoot.empty())
6251 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6252
6253 // CloudABI only supports static linkage.
6254 CmdArgs.push_back("-Bstatic");
6255 CmdArgs.push_back("--eh-frame-hdr");
6256 CmdArgs.push_back("--gc-sections");
6257
6258 if (Output.isFilename()) {
6259 CmdArgs.push_back("-o");
6260 CmdArgs.push_back(Output.getFilename());
6261 } else {
6262 assert(Output.isNothing() && "Invalid output.");
6263 }
6264
6265 if (!Args.hasArg(options::OPT_nostdlib) &&
6266 !Args.hasArg(options::OPT_nostartfiles)) {
6267 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6268 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6269 }
6270
6271 Args.AddAllArgs(CmdArgs, options::OPT_L);
6272 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6273 for (const auto &Path : Paths)
6274 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006275 Args.AddAllArgs(CmdArgs,
6276 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6277 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006278
Alexey Samsonov907880e2015-06-19 19:57:46 +00006279 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006280 AddGoldPlugin(ToolChain, Args, CmdArgs);
6281
6282 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6283
6284 if (!Args.hasArg(options::OPT_nostdlib) &&
6285 !Args.hasArg(options::OPT_nodefaultlibs)) {
6286 if (D.CCCIsCXX())
6287 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6288 CmdArgs.push_back("-lc");
6289 CmdArgs.push_back("-lcompiler_rt");
6290 }
6291
6292 if (!Args.hasArg(options::OPT_nostdlib) &&
6293 !Args.hasArg(options::OPT_nostartfiles))
6294 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6295
6296 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006297 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006298}
6299
Douglas Katzman95354292015-06-23 20:42:09 +00006300void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6301 const InputInfo &Output,
6302 const InputInfoList &Inputs,
6303 const ArgList &Args,
6304 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006305 ArgStringList CmdArgs;
6306
6307 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6308 const InputInfo &Input = Inputs[0];
6309
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006310 // Determine the original source input.
6311 const Action *SourceAction = &JA;
6312 while (SourceAction->getKind() != Action::InputClass) {
6313 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6314 SourceAction = SourceAction->getInputs()[0];
6315 }
6316
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006317 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006318 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006319 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6320 // FIXME: at run-time detect assembler capabilities or rely on version
6321 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006322 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006323 const llvm::Triple &T(getToolChain().getTriple());
6324 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006325 CmdArgs.push_back("-Q");
6326 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006327
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006328 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006329 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006330 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006331 if (Args.hasArg(options::OPT_gstabs))
6332 CmdArgs.push_back("--gstabs");
6333 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006334 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006335 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006336
Daniel Dunbarbe220842009-03-20 16:06:39 +00006337 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006338 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006339
Daniel Dunbar6d484762010-07-22 01:47:22 +00006340 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006341 if (getToolChain().getArch() == llvm::Triple::x86 ||
6342 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006343 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6344 CmdArgs.push_back("-force_cpusubtype_ALL");
6345
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006346 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006347 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006348 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006349 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006350 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006351 CmdArgs.push_back("-static");
6352
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006353 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006354
6355 assert(Output.isFilename() && "Unexpected lipo output.");
6356 CmdArgs.push_back("-o");
6357 CmdArgs.push_back(Output.getFilename());
6358
Daniel Dunbarb440f562010-08-02 02:38:21 +00006359 assert(Input.isFilename() && "Invalid input.");
6360 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006361
6362 // asm_final spec is empty.
6363
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006364 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006365 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006366}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006367
Tim Northover157d9112014-01-16 08:48:16 +00006368void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006369
Tim Northover157d9112014-01-16 08:48:16 +00006370void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6371 ArgStringList &CmdArgs) const {
6372 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006373
Daniel Dunbarc1964212009-03-26 16:23:12 +00006374 // Derived from darwin_arch spec.
6375 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006376 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006377
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006378 // FIXME: Is this needed anymore?
6379 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006380 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006381}
6382
Douglas Katzman95354292015-06-23 20:42:09 +00006383bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006384 // We only need to generate a temp path for LTO if we aren't compiling object
6385 // files. When compiling source files, we run 'dsymutil' after linking. We
6386 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006387 for (const auto &Input : Inputs)
6388 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006389 return true;
6390
6391 return false;
6392}
6393
Douglas Katzman95354292015-06-23 20:42:09 +00006394void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6395 ArgStringList &CmdArgs,
6396 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006397 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006398 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006400 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006401 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6402 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006403 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6404 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006405 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006406 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006407 }
6408
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006409 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006410 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006411 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6412 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006413
Bob Wilson3d27dad2013-08-02 22:25:34 +00006414 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6415 CmdArgs.push_back("-export_dynamic");
6416
Bob Wilsonb111ec92015-03-02 19:01:14 +00006417 // If we are using App Extension restrictions, pass a flag to the linker
6418 // telling it that the compiled code has been audited.
6419 if (Args.hasFlag(options::OPT_fapplication_extension,
6420 options::OPT_fno_application_extension, false))
6421 CmdArgs.push_back("-application_extension");
6422
Bill Wendling313b6bf2012-11-16 23:03:00 +00006423 // If we are using LTO, then automatically create a temporary file path for
6424 // the linker to use, so that it's lifetime will extend past a possible
6425 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006426 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006427 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006428 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006429 C.addTempFile(TmpPath);
6430 CmdArgs.push_back("-object_path_lto");
6431 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006432 }
6433
Daniel Dunbarc1964212009-03-26 16:23:12 +00006434 // Derived from the "link" spec.
6435 Args.AddAllArgs(CmdArgs, options::OPT_static);
6436 if (!Args.hasArg(options::OPT_static))
6437 CmdArgs.push_back("-dynamic");
6438 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6439 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6440 // here. How do we wish to handle such things?
6441 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006442
Daniel Dunbarc1964212009-03-26 16:23:12 +00006443 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006444 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006445 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006446 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006447
6448 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6449 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6450 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6451
6452 Arg *A;
6453 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6454 (A = Args.getLastArg(options::OPT_current__version)) ||
6455 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006456 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6457 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006458
6459 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6460 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6461 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6462 } else {
6463 CmdArgs.push_back("-dylib");
6464
6465 Arg *A;
6466 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6467 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6468 (A = Args.getLastArg(options::OPT_client__name)) ||
6469 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6470 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6471 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006472 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6473 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006474
Daniel Dunbarc1964212009-03-26 16:23:12 +00006475 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6476 "-dylib_compatibility_version");
6477 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6478 "-dylib_current_version");
6479
Tim Northover157d9112014-01-16 08:48:16 +00006480 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006481
6482 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6483 "-dylib_install_name");
6484 }
6485
6486 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6487 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6488 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006489 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006490 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006491 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6492 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6493 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6494 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6495 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6496 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006497 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006498 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6499 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6500 Args.AddAllArgs(CmdArgs, options::OPT_init);
6501
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006502 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006503 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006504
Daniel Dunbarc1964212009-03-26 16:23:12 +00006505 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6506 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6507 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6508 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6509 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006510
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006511 if (const Arg *A =
6512 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6513 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006514 if (A->getOption().matches(options::OPT_fpie) ||
6515 A->getOption().matches(options::OPT_fPIE))
6516 CmdArgs.push_back("-pie");
6517 else
6518 CmdArgs.push_back("-no_pie");
6519 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006520
6521 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6522 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6523 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6524 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6525 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6526 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6527 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6528 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6529 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6530 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6531 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6532 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6533 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6534 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6535 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6536 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006537
Daniel Dunbar84384642011-05-02 21:03:47 +00006538 // Give --sysroot= preference, over the Apple specific behavior to also use
6539 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006540 StringRef sysroot = C.getSysRoot();
6541 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006542 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006543 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006544 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6545 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006546 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006547 }
6548
Daniel Dunbarc1964212009-03-26 16:23:12 +00006549 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6550 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6551 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6552 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6553 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006554 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006555 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6556 Args.AddAllArgs(CmdArgs, options::OPT_y);
6557 Args.AddLastArg(CmdArgs, options::OPT_w);
6558 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6559 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6560 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6561 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6562 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6563 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6564 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6565 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6566 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6567 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6568 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6569 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6570}
6571
Douglas Katzman95354292015-06-23 20:42:09 +00006572void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6573 const InputInfo &Output,
6574 const InputInfoList &Inputs,
6575 const ArgList &Args,
6576 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006577 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006578
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006579 // If the number of arguments surpasses the system limits, we will encode the
6580 // input files in a separate file, shortening the command line. To this end,
6581 // build a list of input file names that can be passed via a file with the
6582 // -filelist linker option.
6583 llvm::opt::ArgStringList InputFileList;
6584
Daniel Dunbarc1964212009-03-26 16:23:12 +00006585 // The logic here is derived from gcc's behavior; most of which
6586 // comes from specs (starting with link_command). Consult gcc for
6587 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006588 ArgStringList CmdArgs;
6589
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006590 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6591 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6592 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006593 for (const auto &Arg : Args)
6594 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006595 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006596 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006597 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006598 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006599 return;
6600 }
6601
Daniel Dunbarc1964212009-03-26 16:23:12 +00006602 // I'm not sure why this particular decomposition exists in gcc, but
6603 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006604 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006605
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006606 // It seems that the 'e' option is completely ignored for dynamic executables
6607 // (the default), and with static executables, the last one wins, as expected.
6608 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6609 options::OPT_Z_Flag, options::OPT_u_Group,
6610 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006611
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006612 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6613 // members of static archive libraries which implement Objective-C classes or
6614 // categories.
6615 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6616 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006617
Daniel Dunbarc1964212009-03-26 16:23:12 +00006618 CmdArgs.push_back("-o");
6619 CmdArgs.push_back(Output.getFilename());
6620
Chad Rosier06fd3c62012-05-16 23:45:12 +00006621 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006622 !Args.hasArg(options::OPT_nostartfiles))
6623 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006624
Peter Collingbournec4122c12015-06-15 21:08:13 +00006625 // SafeStack requires its own runtime libraries
6626 // These libraries should be linked first, to make sure the
6627 // __safestack_init constructor executes before everything else
6628 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6629 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6630 "libclang_rt.safestack_osx.a",
6631 /*AlwaysLink=*/true);
6632 }
6633
Daniel Dunbarc1964212009-03-26 16:23:12 +00006634 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006635
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006636 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6637 options::OPT_fno_openmp, false)) {
6638 switch (getOpenMPRuntime(getToolChain(), Args)) {
6639 case OMPRT_OMP:
6640 CmdArgs.push_back("-lomp");
6641 break;
6642 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006643 CmdArgs.push_back("-lgomp");
6644 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006645 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006646 CmdArgs.push_back("-liomp5");
6647 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006648 case OMPRT_Unknown:
6649 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006650 break;
6651 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006652 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006653
Douglas Gregor9295df02012-05-15 21:00:27 +00006654 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006655 // Build the input file for -filelist (list of linker input files) in case we
6656 // need it later
6657 for (const auto &II : Inputs) {
6658 if (!II.isFilename()) {
6659 // This is a linker input argument.
6660 // We cannot mix input arguments and file names in a -filelist input, thus
6661 // we prematurely stop our list (remaining files shall be passed as
6662 // arguments).
6663 if (InputFileList.size() > 0)
6664 break;
6665
6666 continue;
6667 }
6668
6669 InputFileList.push_back(II.getFilename());
6670 }
6671
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006672 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006673 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006674 // We use arclite library for both ARC and subscripting support.
6675 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6676
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006677 CmdArgs.push_back("-framework");
6678 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006679 // Link libobj.
6680 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006681 }
John McCall31168b02011-06-15 23:02:42 +00006682
Daniel Dunbarc1964212009-03-26 16:23:12 +00006683 if (LinkingOutput) {
6684 CmdArgs.push_back("-arch_multiple");
6685 CmdArgs.push_back("-final_output");
6686 CmdArgs.push_back(LinkingOutput);
6687 }
6688
Daniel Dunbarc1964212009-03-26 16:23:12 +00006689 if (Args.hasArg(options::OPT_fnested_functions))
6690 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006691
Justin Bognerc7701242015-05-12 05:44:36 +00006692 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6693 // paths are different enough from other toolchains that this needs a fair
6694 // amount of refactoring done first.
6695 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6696
Daniel Dunbarc1964212009-03-26 16:23:12 +00006697 if (!Args.hasArg(options::OPT_nostdlib) &&
6698 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006699 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006700 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006701
Daniel Dunbarc1964212009-03-26 16:23:12 +00006702 // link_ssp spec is empty.
6703
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006704 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006705 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006706 }
6707
Chad Rosier06fd3c62012-05-16 23:45:12 +00006708 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006709 !Args.hasArg(options::OPT_nostartfiles)) {
6710 // endfile_spec is empty.
6711 }
6712
6713 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6714 Args.AddAllArgs(CmdArgs, options::OPT_F);
6715
Steven Wu3ffb61b2015-02-06 18:08:29 +00006716 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006717 for (const Arg *A : Args.filtered(options::OPT_iframework))
6718 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006719
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006720 if (!Args.hasArg(options::OPT_nostdlib) &&
6721 !Args.hasArg(options::OPT_nodefaultlibs)) {
6722 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6723 if (A->getValue() == StringRef("Accelerate")) {
6724 CmdArgs.push_back("-framework");
6725 CmdArgs.push_back("Accelerate");
6726 }
6727 }
6728 }
6729
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006730 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006731 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006732 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006733 Cmd->setInputFileList(std::move(InputFileList));
6734 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006735}
6736
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006737void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006738 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006739 const InputInfoList &Inputs,
6740 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006741 const char *LinkingOutput) const {
6742 ArgStringList CmdArgs;
6743
6744 CmdArgs.push_back("-create");
6745 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006746
6747 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006748 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006749
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006750 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006751 assert(II.isFilename() && "Unexpected lipo input.");
6752 CmdArgs.push_back(II.getFilename());
6753 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006754
6755 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006756 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006757}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006758
Daniel Dunbar88299622010-06-04 18:28:36 +00006759void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006760 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006761 const InputInfoList &Inputs,
6762 const ArgList &Args,
6763 const char *LinkingOutput) const {
6764 ArgStringList CmdArgs;
6765
Daniel Dunbareb86b042011-05-09 17:23:16 +00006766 CmdArgs.push_back("-o");
6767 CmdArgs.push_back(Output.getFilename());
6768
Daniel Dunbar88299622010-06-04 18:28:36 +00006769 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6770 const InputInfo &Input = Inputs[0];
6771 assert(Input.isFilename() && "Unexpected dsymutil input.");
6772 CmdArgs.push_back(Input.getFilename());
6773
Daniel Dunbar88299622010-06-04 18:28:36 +00006774 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006775 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006776 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006777}
6778
Eric Christopher551ef452011-08-23 17:56:55 +00006779void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006780 const InputInfo &Output,
6781 const InputInfoList &Inputs,
6782 const ArgList &Args,
6783 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006784 ArgStringList CmdArgs;
6785 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006786 CmdArgs.push_back("--debug-info");
6787 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006788 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006789
6790 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6791 const InputInfo &Input = Inputs[0];
6792 assert(Input.isFilename() && "Unexpected verify input");
6793
6794 // Grabbing the output of the earlier dsymutil run.
6795 CmdArgs.push_back(Input.getFilename());
6796
6797 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006798 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006799 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006800}
6801
Douglas Katzman95354292015-06-23 20:42:09 +00006802void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006803 const InputInfo &Output,
6804 const InputInfoList &Inputs,
6805 const ArgList &Args,
6806 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006807 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006808 ArgStringList CmdArgs;
6809
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006810 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006811
6812 CmdArgs.push_back("-o");
6813 CmdArgs.push_back(Output.getFilename());
6814
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006815 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006816 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006817
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006818 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006819 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006820}
6821
Douglas Katzman95354292015-06-23 20:42:09 +00006822void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6823 const InputInfo &Output,
6824 const InputInfoList &Inputs,
6825 const ArgList &Args,
6826 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006827 // FIXME: Find a real GCC, don't hard-code versions here
6828 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6829 const llvm::Triple &T = getToolChain().getTriple();
6830 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006831 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006832 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006833 case llvm::Triple::x86:
6834 GCCLibPath +=
6835 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6836 break;
6837 case llvm::Triple::x86_64:
6838 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6839 GCCLibPath += "/4.5.2/amd64/";
6840 LibPath += "amd64/";
6841 break;
6842 default:
6843 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006844 }
6845
6846 ArgStringList CmdArgs;
6847
David Chisnall272a0712012-02-29 15:06:12 +00006848 // Demangle C++ names in errors
6849 CmdArgs.push_back("-C");
6850
David Chisnallf571cde2012-02-15 13:39:01 +00006851 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6852 (!Args.hasArg(options::OPT_shared))) {
6853 CmdArgs.push_back("-e");
6854 CmdArgs.push_back("_start");
6855 }
6856
6857 if (Args.hasArg(options::OPT_static)) {
6858 CmdArgs.push_back("-Bstatic");
6859 CmdArgs.push_back("-dn");
6860 } else {
6861 CmdArgs.push_back("-Bdynamic");
6862 if (Args.hasArg(options::OPT_shared)) {
6863 CmdArgs.push_back("-shared");
6864 } else {
6865 CmdArgs.push_back("--dynamic-linker");
6866 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6867 }
6868 }
6869
6870 if (Output.isFilename()) {
6871 CmdArgs.push_back("-o");
6872 CmdArgs.push_back(Output.getFilename());
6873 } else {
6874 assert(Output.isNothing() && "Invalid output.");
6875 }
6876
6877 if (!Args.hasArg(options::OPT_nostdlib) &&
6878 !Args.hasArg(options::OPT_nostartfiles)) {
6879 if (!Args.hasArg(options::OPT_shared)) {
6880 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6881 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006882 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006883 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6884 } else {
6885 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006886 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6887 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006888 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006889 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006890 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006891 }
6892
6893 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6894
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006895 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6896 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006897
6898 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6899
6900 if (!Args.hasArg(options::OPT_nostdlib) &&
6901 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006902 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006903 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006904 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006905 if (!Args.hasArg(options::OPT_shared)) {
6906 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006907 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006908 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006909 }
David Chisnallf571cde2012-02-15 13:39:01 +00006910 }
6911
6912 if (!Args.hasArg(options::OPT_nostdlib) &&
6913 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006914 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006915 }
David Chisnall96de9932012-02-16 16:00:47 +00006916 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006917
Alexey Samsonov7811d192014-02-20 13:57:37 +00006918 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006920 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006921 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006922}
6923
Douglas Katzman95354292015-06-23 20:42:09 +00006924void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6925 const InputInfo &Output,
6926 const InputInfoList &Inputs,
6927 const ArgList &Args,
6928 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006929 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006930 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006931 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006932
Rafael Espindolacc126272014-02-28 01:55:21 +00006933 switch (getToolChain().getArch()) {
6934 case llvm::Triple::x86:
6935 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6936 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006937 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006938 break;
6939
6940 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006941 CmdArgs.push_back("-mppc");
6942 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006943 break;
6944
6945 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006946 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006947 CmdArgs.push_back("-32");
6948 NeedsKPIC = true;
6949 break;
6950
6951 case llvm::Triple::sparcv9:
6952 CmdArgs.push_back("-64");
6953 CmdArgs.push_back("-Av9a");
6954 NeedsKPIC = true;
6955 break;
6956
6957 case llvm::Triple::mips64:
6958 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006959 StringRef CPUName;
6960 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006961 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006962
6963 CmdArgs.push_back("-mabi");
6964 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6965
6966 if (getToolChain().getArch() == llvm::Triple::mips64)
6967 CmdArgs.push_back("-EB");
6968 else
6969 CmdArgs.push_back("-EL");
6970
Rafael Espindolacc126272014-02-28 01:55:21 +00006971 NeedsKPIC = true;
6972 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006973 }
6974
Rafael Espindolacc126272014-02-28 01:55:21 +00006975 default:
6976 break;
6977 }
6978
6979 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006980 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00006981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006982 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006983
6984 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006985 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006986
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006987 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006988 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006990 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006991 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006992}
6993
Douglas Katzman95354292015-06-23 20:42:09 +00006994void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6995 const InputInfo &Output,
6996 const InputInfoList &Inputs,
6997 const ArgList &Args,
6998 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006999 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007000 ArgStringList CmdArgs;
7001
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007002 // Silence warning for "clang -g foo.o -o foo"
7003 Args.ClaimAllArgs(options::OPT_g_Group);
7004 // and "clang -emit-llvm foo.o -o foo"
7005 Args.ClaimAllArgs(options::OPT_emit_llvm);
7006 // and for "clang -w foo.o -o foo". Other warning options are already
7007 // handled somewhere else.
7008 Args.ClaimAllArgs(options::OPT_w);
7009
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007010 if (getToolChain().getArch() == llvm::Triple::mips64)
7011 CmdArgs.push_back("-EB");
7012 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7013 CmdArgs.push_back("-EL");
7014
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007015 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007016 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007017 CmdArgs.push_back("-e");
7018 CmdArgs.push_back("__start");
7019 }
7020
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007021 if (Args.hasArg(options::OPT_static)) {
7022 CmdArgs.push_back("-Bstatic");
7023 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007024 if (Args.hasArg(options::OPT_rdynamic))
7025 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007026 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007027 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007028 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007029 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007030 } else {
7031 CmdArgs.push_back("-dynamic-linker");
7032 CmdArgs.push_back("/usr/libexec/ld.so");
7033 }
7034 }
7035
Rafael Espindola044f7832013-06-05 04:28:55 +00007036 if (Args.hasArg(options::OPT_nopie))
7037 CmdArgs.push_back("-nopie");
7038
Daniel Dunbarb440f562010-08-02 02:38:21 +00007039 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007040 CmdArgs.push_back("-o");
7041 CmdArgs.push_back(Output.getFilename());
7042 } else {
7043 assert(Output.isNothing() && "Invalid output.");
7044 }
7045
7046 if (!Args.hasArg(options::OPT_nostdlib) &&
7047 !Args.hasArg(options::OPT_nostartfiles)) {
7048 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007049 if (Args.hasArg(options::OPT_pg))
7050 CmdArgs.push_back(
7051 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007052 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007053 CmdArgs.push_back(
7054 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7055 CmdArgs.push_back(
7056 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007057 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007058 CmdArgs.push_back(
7059 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007060 }
7061 }
7062
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007063 std::string Triple = getToolChain().getTripleString();
7064 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007065 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007066 CmdArgs.push_back(
7067 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007068
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007069 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7070 options::OPT_e, options::OPT_s, options::OPT_t,
7071 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007072
Daniel Dunbar54423b22010-09-17 00:24:54 +00007073 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007074
7075 if (!Args.hasArg(options::OPT_nostdlib) &&
7076 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007077 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007078 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007079 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007080 CmdArgs.push_back("-lm_p");
7081 else
7082 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007083 }
7084
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007085 // FIXME: For some reason GCC passes -lgcc before adding
7086 // the default system libraries. Just mimic this for now.
7087 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007088
Eric Christopher17674ec2012-09-13 06:32:34 +00007089 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007090 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7091 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007092 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007093 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007094 }
7095
Chandler Carruth45661652011-12-17 22:32:42 +00007096 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007097 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007098 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007099 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007100 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007101 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007102
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007103 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007104 }
7105
7106 if (!Args.hasArg(options::OPT_nostdlib) &&
7107 !Args.hasArg(options::OPT_nostartfiles)) {
7108 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007109 CmdArgs.push_back(
7110 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007111 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007112 CmdArgs.push_back(
7113 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007114 }
7115
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007116 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007117 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007118}
Ed Schoutene33194b2009-04-02 19:13:12 +00007119
Douglas Katzman95354292015-06-23 20:42:09 +00007120void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7121 const InputInfo &Output,
7122 const InputInfoList &Inputs,
7123 const ArgList &Args,
7124 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007125 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007126 ArgStringList CmdArgs;
7127
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007128 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007129
7130 CmdArgs.push_back("-o");
7131 CmdArgs.push_back(Output.getFilename());
7132
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007133 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007134 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007135
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007136 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007137 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007138}
7139
Douglas Katzman95354292015-06-23 20:42:09 +00007140void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7141 const InputInfo &Output,
7142 const InputInfoList &Inputs,
7143 const ArgList &Args,
7144 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007145 const Driver &D = getToolChain().getDriver();
7146 ArgStringList CmdArgs;
7147
7148 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7149 (!Args.hasArg(options::OPT_shared))) {
7150 CmdArgs.push_back("-e");
7151 CmdArgs.push_back("__start");
7152 }
7153
7154 if (Args.hasArg(options::OPT_static)) {
7155 CmdArgs.push_back("-Bstatic");
7156 } else {
7157 if (Args.hasArg(options::OPT_rdynamic))
7158 CmdArgs.push_back("-export-dynamic");
7159 CmdArgs.push_back("--eh-frame-hdr");
7160 CmdArgs.push_back("-Bdynamic");
7161 if (Args.hasArg(options::OPT_shared)) {
7162 CmdArgs.push_back("-shared");
7163 } else {
7164 CmdArgs.push_back("-dynamic-linker");
7165 CmdArgs.push_back("/usr/libexec/ld.so");
7166 }
7167 }
7168
7169 if (Output.isFilename()) {
7170 CmdArgs.push_back("-o");
7171 CmdArgs.push_back(Output.getFilename());
7172 } else {
7173 assert(Output.isNothing() && "Invalid output.");
7174 }
7175
7176 if (!Args.hasArg(options::OPT_nostdlib) &&
7177 !Args.hasArg(options::OPT_nostartfiles)) {
7178 if (!Args.hasArg(options::OPT_shared)) {
7179 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007180 CmdArgs.push_back(
7181 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007182 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007183 CmdArgs.push_back(
7184 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7185 CmdArgs.push_back(
7186 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007187 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007188 CmdArgs.push_back(
7189 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007190 }
7191 }
7192
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007193 Args.AddAllArgs(CmdArgs,
7194 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007195
7196 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7197
7198 if (!Args.hasArg(options::OPT_nostdlib) &&
7199 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007200 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007201 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7202 if (Args.hasArg(options::OPT_pg))
7203 CmdArgs.push_back("-lm_p");
7204 else
7205 CmdArgs.push_back("-lm");
7206 }
7207
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007208 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007209 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007210 CmdArgs.push_back("-lpthread_p");
7211 else
7212 CmdArgs.push_back("-lpthread");
7213 }
7214
Eli Friedman9fa28852012-08-08 23:57:20 +00007215 if (!Args.hasArg(options::OPT_shared)) {
7216 if (Args.hasArg(options::OPT_pg))
7217 CmdArgs.push_back("-lc_p");
7218 else
7219 CmdArgs.push_back("-lc");
7220 }
7221
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007222 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007223 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007224 case llvm::Triple::arm:
7225 MyArch = "arm";
7226 break;
7227 case llvm::Triple::x86:
7228 MyArch = "i386";
7229 break;
7230 case llvm::Triple::x86_64:
7231 MyArch = "amd64";
7232 break;
7233 default:
7234 llvm_unreachable("Unsupported architecture");
7235 }
7236 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007237 }
7238
7239 if (!Args.hasArg(options::OPT_nostdlib) &&
7240 !Args.hasArg(options::OPT_nostartfiles)) {
7241 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007242 CmdArgs.push_back(
7243 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007244 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007245 CmdArgs.push_back(
7246 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007247 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007248
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007249 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007250 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007251}
7252
Douglas Katzman95354292015-06-23 20:42:09 +00007253void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7254 const InputInfo &Output,
7255 const InputInfoList &Inputs,
7256 const ArgList &Args,
7257 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007258 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007259 ArgStringList CmdArgs;
7260
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007261 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7262 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007263 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007264 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007265 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007266 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007267 else if (getToolChain().getArch() == llvm::Triple::mips ||
7268 getToolChain().getArch() == llvm::Triple::mipsel ||
7269 getToolChain().getArch() == llvm::Triple::mips64 ||
7270 getToolChain().getArch() == llvm::Triple::mips64el) {
7271 StringRef CPUName;
7272 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007273 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007274
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007275 CmdArgs.push_back("-march");
7276 CmdArgs.push_back(CPUName.data());
7277
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007278 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007279 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007280
7281 if (getToolChain().getArch() == llvm::Triple::mips ||
7282 getToolChain().getArch() == llvm::Triple::mips64)
7283 CmdArgs.push_back("-EB");
7284 else
7285 CmdArgs.push_back("-EL");
7286
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007287 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007288 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007289 getToolChain().getArch() == llvm::Triple::armeb ||
7290 getToolChain().getArch() == llvm::Triple::thumb ||
7291 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007292 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007293 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007294 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7295
7296 if (FloatABI == "hard") {
7297 CmdArgs.push_back("-mfpu=vfp");
7298 } else {
7299 CmdArgs.push_back("-mfpu=softvfp");
7300 }
7301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007302 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007303 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007304 case llvm::Triple::GNUEABI:
7305 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007306 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007307 break;
7308
7309 default:
7310 CmdArgs.push_back("-matpcs");
7311 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007312 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007313 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007314 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007315 if (getToolChain().getArch() == llvm::Triple::sparc)
7316 CmdArgs.push_back("-Av8plusa");
7317 else
7318 CmdArgs.push_back("-Av9a");
7319
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007320 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007321 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007322
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007323 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007324
7325 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007326 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007327
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007328 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007329 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007330
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007331 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007332 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007333}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007334
Douglas Katzman95354292015-06-23 20:42:09 +00007335void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7336 const InputInfo &Output,
7337 const InputInfoList &Inputs,
7338 const ArgList &Args,
7339 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007340 const toolchains::FreeBSD &ToolChain =
7341 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007342 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007343 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007344 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007345 !Args.hasArg(options::OPT_shared) &&
7346 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007347 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007348
7349 // Silence warning for "clang -g foo.o -o foo"
7350 Args.ClaimAllArgs(options::OPT_g_Group);
7351 // and "clang -emit-llvm foo.o -o foo"
7352 Args.ClaimAllArgs(options::OPT_emit_llvm);
7353 // and for "clang -w foo.o -o foo". Other warning options are already
7354 // handled somewhere else.
7355 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007356
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007357 if (!D.SysRoot.empty())
7358 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7359
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007360 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007361 CmdArgs.push_back("-pie");
7362
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007363 if (Args.hasArg(options::OPT_static)) {
7364 CmdArgs.push_back("-Bstatic");
7365 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007366 if (Args.hasArg(options::OPT_rdynamic))
7367 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007368 CmdArgs.push_back("--eh-frame-hdr");
7369 if (Args.hasArg(options::OPT_shared)) {
7370 CmdArgs.push_back("-Bshareable");
7371 } else {
7372 CmdArgs.push_back("-dynamic-linker");
7373 CmdArgs.push_back("/libexec/ld-elf.so.1");
7374 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007375 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007376 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7377 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7378 CmdArgs.push_back("--hash-style=both");
7379 }
7380 }
7381 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007382 }
7383
7384 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7385 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007386 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007387 CmdArgs.push_back("-m");
7388 CmdArgs.push_back("elf_i386_fbsd");
7389 }
7390
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007391 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007392 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007393 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007394 }
7395
Daniel Dunbarb440f562010-08-02 02:38:21 +00007396 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007397 CmdArgs.push_back("-o");
7398 CmdArgs.push_back(Output.getFilename());
7399 } else {
7400 assert(Output.isNothing() && "Invalid output.");
7401 }
7402
7403 if (!Args.hasArg(options::OPT_nostdlib) &&
7404 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007405 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007406 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007407 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007408 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007409 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007410 crt1 = "Scrt1.o";
7411 else
7412 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007413 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007414 if (crt1)
7415 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7416
7417 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7418
Craig Topper92fc2df2014-05-17 16:56:41 +00007419 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007420 if (Args.hasArg(options::OPT_static))
7421 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007422 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007423 crtbegin = "crtbeginS.o";
7424 else
7425 crtbegin = "crtbegin.o";
7426
7427 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007428 }
7429
7430 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007431 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007432 for (const auto &Path : Paths)
7433 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007434 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7435 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007436 Args.AddAllArgs(CmdArgs, options::OPT_s);
7437 Args.AddAllArgs(CmdArgs, options::OPT_t);
7438 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7439 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007440
Alexey Samsonov907880e2015-06-19 19:57:46 +00007441 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007442 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007443
Alexey Samsonov52550342014-09-15 19:58:40 +00007444 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007445 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007446
7447 if (!Args.hasArg(options::OPT_nostdlib) &&
7448 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007449 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007450 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007451 if (Args.hasArg(options::OPT_pg))
7452 CmdArgs.push_back("-lm_p");
7453 else
7454 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007455 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007456 if (NeedsSanitizerDeps)
7457 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007458 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7459 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007460 if (Args.hasArg(options::OPT_pg))
7461 CmdArgs.push_back("-lgcc_p");
7462 else
7463 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007464 if (Args.hasArg(options::OPT_static)) {
7465 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007466 } else if (Args.hasArg(options::OPT_pg)) {
7467 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007468 } else {
7469 CmdArgs.push_back("--as-needed");
7470 CmdArgs.push_back("-lgcc_s");
7471 CmdArgs.push_back("--no-as-needed");
7472 }
7473
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007474 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007475 if (Args.hasArg(options::OPT_pg))
7476 CmdArgs.push_back("-lpthread_p");
7477 else
7478 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007479 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007480
Roman Divacky66f22762011-02-10 16:59:40 +00007481 if (Args.hasArg(options::OPT_pg)) {
7482 if (Args.hasArg(options::OPT_shared))
7483 CmdArgs.push_back("-lc");
7484 else
7485 CmdArgs.push_back("-lc_p");
7486 CmdArgs.push_back("-lgcc_p");
7487 } else {
7488 CmdArgs.push_back("-lc");
7489 CmdArgs.push_back("-lgcc");
7490 }
7491
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007492 if (Args.hasArg(options::OPT_static)) {
7493 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007494 } else if (Args.hasArg(options::OPT_pg)) {
7495 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007496 } else {
7497 CmdArgs.push_back("--as-needed");
7498 CmdArgs.push_back("-lgcc_s");
7499 CmdArgs.push_back("--no-as-needed");
7500 }
7501 }
7502
7503 if (!Args.hasArg(options::OPT_nostdlib) &&
7504 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007505 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007506 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007507 else
7508 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007509 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007510 }
7511
Alexey Samsonov7811d192014-02-20 13:57:37 +00007512 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007513
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007514 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007515 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007516}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007517
Douglas Katzman95354292015-06-23 20:42:09 +00007518void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007519 const InputInfo &Output,
7520 const InputInfoList &Inputs,
7521 const ArgList &Args,
7522 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007523 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007524 ArgStringList CmdArgs;
7525
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007526 // GNU as needs different flags for creating the correct output format
7527 // on architectures with different ABIs or optional feature sets.
7528 switch (getToolChain().getArch()) {
7529 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007530 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007531 break;
7532 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007533 case llvm::Triple::armeb:
7534 case llvm::Triple::thumb:
7535 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007536 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007537 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7538 std::string Arch =
7539 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007540 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007541 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007542 }
7543
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007544 case llvm::Triple::mips:
7545 case llvm::Triple::mipsel:
7546 case llvm::Triple::mips64:
7547 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007548 StringRef CPUName;
7549 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007550 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007551
7552 CmdArgs.push_back("-march");
7553 CmdArgs.push_back(CPUName.data());
7554
7555 CmdArgs.push_back("-mabi");
7556 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7557
7558 if (getToolChain().getArch() == llvm::Triple::mips ||
7559 getToolChain().getArch() == llvm::Triple::mips64)
7560 CmdArgs.push_back("-EB");
7561 else
7562 CmdArgs.push_back("-EL");
7563
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007564 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007565 break;
7566 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007567
7568 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007569 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007570 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007571 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007572 break;
7573
7574 case llvm::Triple::sparcv9:
7575 CmdArgs.push_back("-64");
7576 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007577 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007578 break;
7579
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007580 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007581 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007582 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007583
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007584 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007585
7586 CmdArgs.push_back("-o");
7587 CmdArgs.push_back(Output.getFilename());
7588
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007589 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007590 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007591
David Chisnallddbd68f2011-09-27 22:03:18 +00007592 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007593 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007594}
7595
Douglas Katzman95354292015-06-23 20:42:09 +00007596void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7597 const InputInfo &Output,
7598 const InputInfoList &Inputs,
7599 const ArgList &Args,
7600 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007601 const Driver &D = getToolChain().getDriver();
7602 ArgStringList CmdArgs;
7603
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007604 if (!D.SysRoot.empty())
7605 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7606
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007607 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007608 if (Args.hasArg(options::OPT_static)) {
7609 CmdArgs.push_back("-Bstatic");
7610 } else {
7611 if (Args.hasArg(options::OPT_rdynamic))
7612 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007613 if (Args.hasArg(options::OPT_shared)) {
7614 CmdArgs.push_back("-Bshareable");
7615 } else {
7616 CmdArgs.push_back("-dynamic-linker");
7617 CmdArgs.push_back("/libexec/ld.elf_so");
7618 }
7619 }
7620
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007621 // Many NetBSD architectures support more than one ABI.
7622 // Determine the correct emulation for ld.
7623 switch (getToolChain().getArch()) {
7624 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007625 CmdArgs.push_back("-m");
7626 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007627 break;
7628 case llvm::Triple::arm:
7629 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007630 CmdArgs.push_back("-m");
7631 switch (getToolChain().getTriple().getEnvironment()) {
7632 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007633 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007634 CmdArgs.push_back("armelf_nbsd_eabi");
7635 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007636 case llvm::Triple::EABIHF:
7637 case llvm::Triple::GNUEABIHF:
7638 CmdArgs.push_back("armelf_nbsd_eabihf");
7639 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007640 default:
7641 CmdArgs.push_back("armelf_nbsd");
7642 break;
7643 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007644 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007645 case llvm::Triple::armeb:
7646 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007647 arm::appendEBLinkFlags(
7648 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007649 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007650 CmdArgs.push_back("-m");
7651 switch (getToolChain().getTriple().getEnvironment()) {
7652 case llvm::Triple::EABI:
7653 case llvm::Triple::GNUEABI:
7654 CmdArgs.push_back("armelfb_nbsd_eabi");
7655 break;
7656 case llvm::Triple::EABIHF:
7657 case llvm::Triple::GNUEABIHF:
7658 CmdArgs.push_back("armelfb_nbsd_eabihf");
7659 break;
7660 default:
7661 CmdArgs.push_back("armelfb_nbsd");
7662 break;
7663 }
7664 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007665 case llvm::Triple::mips64:
7666 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007667 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007668 CmdArgs.push_back("-m");
7669 if (getToolChain().getArch() == llvm::Triple::mips64)
7670 CmdArgs.push_back("elf32btsmip");
7671 else
7672 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007673 } else if (mips::hasMipsAbiArg(Args, "64")) {
7674 CmdArgs.push_back("-m");
7675 if (getToolChain().getArch() == llvm::Triple::mips64)
7676 CmdArgs.push_back("elf64btsmip");
7677 else
7678 CmdArgs.push_back("elf64ltsmip");
7679 }
7680 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007681 case llvm::Triple::ppc:
7682 CmdArgs.push_back("-m");
7683 CmdArgs.push_back("elf32ppc_nbsd");
7684 break;
7685
7686 case llvm::Triple::ppc64:
7687 case llvm::Triple::ppc64le:
7688 CmdArgs.push_back("-m");
7689 CmdArgs.push_back("elf64ppc");
7690 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007691
7692 case llvm::Triple::sparc:
7693 CmdArgs.push_back("-m");
7694 CmdArgs.push_back("elf32_sparc");
7695 break;
7696
7697 case llvm::Triple::sparcv9:
7698 CmdArgs.push_back("-m");
7699 CmdArgs.push_back("elf64_sparc");
7700 break;
7701
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007702 default:
7703 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007704 }
7705
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007706 if (Output.isFilename()) {
7707 CmdArgs.push_back("-o");
7708 CmdArgs.push_back(Output.getFilename());
7709 } else {
7710 assert(Output.isNothing() && "Invalid output.");
7711 }
7712
7713 if (!Args.hasArg(options::OPT_nostdlib) &&
7714 !Args.hasArg(options::OPT_nostartfiles)) {
7715 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007716 CmdArgs.push_back(
7717 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7718 CmdArgs.push_back(
7719 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7720 CmdArgs.push_back(
7721 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007722 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007723 CmdArgs.push_back(
7724 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7725 CmdArgs.push_back(
7726 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007727 }
7728 }
7729
7730 Args.AddAllArgs(CmdArgs, options::OPT_L);
7731 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7732 Args.AddAllArgs(CmdArgs, options::OPT_e);
7733 Args.AddAllArgs(CmdArgs, options::OPT_s);
7734 Args.AddAllArgs(CmdArgs, options::OPT_t);
7735 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7736 Args.AddAllArgs(CmdArgs, options::OPT_r);
7737
7738 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7739
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007740 unsigned Major, Minor, Micro;
7741 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7742 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007743 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007744 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007745 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007746 case llvm::Triple::arm:
7747 case llvm::Triple::armeb:
7748 case llvm::Triple::thumb:
7749 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007750 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007751 case llvm::Triple::ppc64:
7752 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007753 case llvm::Triple::x86:
7754 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007755 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007756 break;
7757 default:
7758 break;
7759 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007760 }
7761
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007762 if (!Args.hasArg(options::OPT_nostdlib) &&
7763 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007764 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007765 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7766 CmdArgs.push_back("-lm");
7767 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007768 if (Args.hasArg(options::OPT_pthread))
7769 CmdArgs.push_back("-lpthread");
7770 CmdArgs.push_back("-lc");
7771
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007772 if (useLibgcc) {
7773 if (Args.hasArg(options::OPT_static)) {
7774 // libgcc_eh depends on libc, so resolve as much as possible,
7775 // pull in any new requirements from libc and then get the rest
7776 // of libgcc.
7777 CmdArgs.push_back("-lgcc_eh");
7778 CmdArgs.push_back("-lc");
7779 CmdArgs.push_back("-lgcc");
7780 } else {
7781 CmdArgs.push_back("-lgcc");
7782 CmdArgs.push_back("--as-needed");
7783 CmdArgs.push_back("-lgcc_s");
7784 CmdArgs.push_back("--no-as-needed");
7785 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007786 }
7787 }
7788
7789 if (!Args.hasArg(options::OPT_nostdlib) &&
7790 !Args.hasArg(options::OPT_nostartfiles)) {
7791 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007792 CmdArgs.push_back(
7793 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007794 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007795 CmdArgs.push_back(
7796 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7797 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007798 }
7799
Alexey Samsonov7811d192014-02-20 13:57:37 +00007800 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007801
Logan Chieneb9162f2014-06-26 14:23:45 +00007802 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007803 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007804}
7805
Douglas Katzman95354292015-06-23 20:42:09 +00007806void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7807 const InputInfo &Output,
7808 const InputInfoList &Inputs,
7809 const ArgList &Args,
7810 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007811 claimNoWarnArgs(Args);
7812
James Y Knight2db38f32015-08-15 03:45:25 +00007813 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7814 llvm::Triple Triple = llvm::Triple(TripleStr);
7815
Rafael Espindola92b00932010-08-10 00:25:48 +00007816 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007817 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007818
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007819 llvm::Reloc::Model RelocationModel;
7820 unsigned PICLevel;
7821 bool IsPIE;
7822 std::tie(RelocationModel, PICLevel, IsPIE) =
7823 ParsePICArgs(getToolChain(), Triple, Args);
7824
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007825 switch (getToolChain().getArch()) {
7826 default:
7827 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007828 // Add --32/--64 to make sure we get the format we want.
7829 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007830 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007831 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007832 break;
7833 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007834 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7835 CmdArgs.push_back("--x32");
7836 else
7837 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007838 break;
7839 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007840 CmdArgs.push_back("-a32");
7841 CmdArgs.push_back("-mppc");
7842 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007843 break;
7844 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007845 CmdArgs.push_back("-a64");
7846 CmdArgs.push_back("-mppc64");
7847 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007848 break;
7849 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007850 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007851 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007852 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007853 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007854 break;
7855 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007856 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007857 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007858 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007859 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007860 break;
7861 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007862 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007863 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007864 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007865 break;
7866 case llvm::Triple::arm:
7867 case llvm::Triple::armeb:
7868 case llvm::Triple::thumb:
7869 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007870 const llvm::Triple &Triple2 = getToolChain().getTriple();
7871 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007872 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007873 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007874 break;
7875 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007876 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007877 break;
7878 default:
7879 break;
7880 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007881
James Y Knight2db38f32015-08-15 03:45:25 +00007882 StringRef ARMFloatABI =
7883 tools::arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple);
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007884 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007885
7886 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007887
7888 // FIXME: remove krait check when GNU tools support krait cpu
7889 // for now replace it with -march=armv7-a to avoid a lower
7890 // march from being picked in the absence of a cpu flag.
7891 Arg *A;
7892 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007893 StringRef(A->getValue()).lower() == "krait")
7894 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007895 else
7896 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007897 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007898 break;
7899 }
7900 case llvm::Triple::mips:
7901 case llvm::Triple::mipsel:
7902 case llvm::Triple::mips64:
7903 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007904 StringRef CPUName;
7905 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007906 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007907 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007908
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007909 CmdArgs.push_back("-march");
7910 CmdArgs.push_back(CPUName.data());
7911
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007912 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007913 CmdArgs.push_back(ABIName.data());
7914
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007915 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7916 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007917 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007918 CmdArgs.push_back("-mno-shared");
7919
Daniel Sanders379d44b2014-07-16 11:52:23 +00007920 // LLVM doesn't support -mplt yet and acts as if it is always given.
7921 // However, -mplt has no effect with the N64 ABI.
7922 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007923
7924 if (getToolChain().getArch() == llvm::Triple::mips ||
7925 getToolChain().getArch() == llvm::Triple::mips64)
7926 CmdArgs.push_back("-EB");
7927 else
7928 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007929
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007930 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7931 if (StringRef(A->getValue()) == "2008")
7932 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7933 }
7934
Daniel Sanders379d44b2014-07-16 11:52:23 +00007935 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007936 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007937 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7938 options::OPT_mfp64)) {
7939 A->claim();
7940 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007941 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7942 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007943 CmdArgs.push_back("-mfpxx");
7944
7945 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7946 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007947 if (Arg *A =
7948 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007949 if (A->getOption().matches(options::OPT_mips16)) {
7950 A->claim();
7951 A->render(Args, CmdArgs);
7952 } else {
7953 A->claim();
7954 CmdArgs.push_back("-no-mips16");
7955 }
7956 }
7957
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007958 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7959 options::OPT_mno_micromips);
7960 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7961 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7962
Simon Atanasyanbd986632013-11-26 11:58:04 +00007963 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7964 // Do not use AddLastArg because not all versions of MIPS assembler
7965 // support -mmsa / -mno-msa options.
7966 if (A->getOption().matches(options::OPT_mmsa))
7967 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7968 }
7969
Daniel Sanders379d44b2014-07-16 11:52:23 +00007970 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7971 options::OPT_msoft_float);
7972
Toma Tabacub36d6102015-06-11 12:13:18 +00007973 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7974 options::OPT_msingle_float);
7975
Daniel Sanders379d44b2014-07-16 11:52:23 +00007976 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7977 options::OPT_mno_odd_spreg);
7978
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007979 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007980 break;
7981 }
7982 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007983 // Always pass an -march option, since our default of z10 is later
7984 // than the GNU assembler's default.
7985 StringRef CPUName = getSystemZTargetCPU(Args);
7986 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007987 break;
7988 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007989 }
7990
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007991 if (NeedsKPIC) {
7992 if (RelocationModel != llvm::Reloc::Static)
7993 CmdArgs.push_back("-KPIC");
7994 }
Rafael Espindola92b00932010-08-10 00:25:48 +00007995
Renato Golina74bbc72015-07-22 15:32:36 +00007996 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007997 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007998
7999 CmdArgs.push_back("-o");
8000 CmdArgs.push_back(Output.getFilename());
8001
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008002 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008003 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008004
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008005 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008006 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008007
8008 // Handle the debug info splitting at object creation time if we're
8009 // creating an object.
8010 // TODO: Currently only works on linux with newer objcopy.
8011 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008012 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008013 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008014 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008015}
8016
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008017static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008018 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008019 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008020 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008021 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8022 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008023 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008024 CmdArgs.push_back("-lgcc");
8025
Logan Chien3d3373c2012-11-19 12:04:11 +00008026 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008027 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008028 CmdArgs.push_back("-lgcc");
8029 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008030 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008031 CmdArgs.push_back("--as-needed");
8032 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008033 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008034 CmdArgs.push_back("--no-as-needed");
8035 }
8036
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008037 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008038 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008039 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008040 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008041
8042 // According to Android ABI, we have to link with libdl if we are
8043 // linking with non-static libgcc.
8044 //
8045 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8046 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8047 if (isAndroid && !StaticLibgcc)
8048 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008049}
8050
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008051static std::string getLinuxDynamicLinker(const ArgList &Args,
8052 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008053 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8054
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008055 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8056 if (ToolChain.getTriple().isArch64Bit())
8057 return "/system/bin/linker64";
8058 else
8059 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008060 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8061 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008062 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008063 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008064 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008065 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008066 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008067 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008068 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8069 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008070 return "/lib/ld-linux-armhf.so.3";
8071 else
8072 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008073 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8074 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008075 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8076 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008077 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008078 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008079 return "/lib/ld-linux.so.3";
8080 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8081 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008082 StringRef CPUName;
8083 StringRef ABIName;
8084 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8085 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8086
8087 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8088 .Case("o32", "/lib")
8089 .Case("n32", "/lib32")
8090 .Case("n64", "/lib64")
8091 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008092 StringRef LibName;
8093 if (mips::isUCLibc(Args))
8094 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8095 else
8096 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008097
8098 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008099 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008100 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008101 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008102 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8103 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008104 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008105 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008106 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8107 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008108 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008109 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00008110 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008111 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008112 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008113 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008114 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8115 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008116 else
8117 return "/lib64/ld-linux-x86-64.so.2";
8118}
8119
Renato Golinc4b49242014-02-13 10:01:16 +00008120static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008121 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008122 // Make use of compiler-rt if --rtlib option is used
8123 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8124
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008125 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008126 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008127 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008128 default:
8129 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008130 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008131 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008132 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008133 break;
8134 }
Renato Golinc4b49242014-02-13 10:01:16 +00008135 break;
8136 case ToolChain::RLT_Libgcc:
8137 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8138 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008139 }
8140}
8141
Rafael Espindola1e085772014-08-15 17:14:35 +00008142static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8143 switch (T.getArch()) {
8144 case llvm::Triple::x86:
8145 return "elf_i386";
8146 case llvm::Triple::aarch64:
8147 return "aarch64linux";
8148 case llvm::Triple::aarch64_be:
8149 return "aarch64_be_linux";
8150 case llvm::Triple::arm:
8151 case llvm::Triple::thumb:
8152 return "armelf_linux_eabi";
8153 case llvm::Triple::armeb:
8154 case llvm::Triple::thumbeb:
8155 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8156 case llvm::Triple::ppc:
8157 return "elf32ppclinux";
8158 case llvm::Triple::ppc64:
8159 return "elf64ppc";
8160 case llvm::Triple::ppc64le:
8161 return "elf64lppc";
8162 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008163 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008164 return "elf32_sparc";
8165 case llvm::Triple::sparcv9:
8166 return "elf64_sparc";
8167 case llvm::Triple::mips:
8168 return "elf32btsmip";
8169 case llvm::Triple::mipsel:
8170 return "elf32ltsmip";
8171 case llvm::Triple::mips64:
8172 if (mips::hasMipsAbiArg(Args, "n32"))
8173 return "elf32btsmipn32";
8174 return "elf64btsmip";
8175 case llvm::Triple::mips64el:
8176 if (mips::hasMipsAbiArg(Args, "n32"))
8177 return "elf32ltsmipn32";
8178 return "elf64ltsmip";
8179 case llvm::Triple::systemz:
8180 return "elf64_s390";
8181 case llvm::Triple::x86_64:
8182 if (T.getEnvironment() == llvm::Triple::GNUX32)
8183 return "elf32_x86_64";
8184 return "elf_x86_64";
8185 default:
8186 llvm_unreachable("Unexpected arch");
8187 }
8188}
8189
Douglas Katzman95354292015-06-23 20:42:09 +00008190void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8191 const InputInfo &Output,
8192 const InputInfoList &Inputs,
8193 const ArgList &Args,
8194 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008195 const toolchains::Linux &ToolChain =
8196 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008197 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008198
8199 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8200 llvm::Triple Triple = llvm::Triple(TripleStr);
8201
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008202 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008203 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008204 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008205 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008206 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8207 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008208
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008209 ArgStringList CmdArgs;
8210
Rafael Espindolad1002f62010-11-15 18:28:16 +00008211 // Silence warning for "clang -g foo.o -o foo"
8212 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008213 // and "clang -emit-llvm foo.o -o foo"
8214 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008215 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008216 // handled somewhere else.
8217 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008218
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008219 if (!D.SysRoot.empty())
8220 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008221
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008222 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008223 CmdArgs.push_back("-pie");
8224
Rafael Espindola1c76c592010-11-07 22:57:16 +00008225 if (Args.hasArg(options::OPT_rdynamic))
8226 CmdArgs.push_back("-export-dynamic");
8227
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008228 if (Args.hasArg(options::OPT_s))
8229 CmdArgs.push_back("-s");
8230
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008231 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008232 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008233
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008234 for (const auto &Opt : ToolChain.ExtraOpts)
8235 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008236
8237 if (!Args.hasArg(options::OPT_static)) {
8238 CmdArgs.push_back("--eh-frame-hdr");
8239 }
8240
8241 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008242 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008243
8244 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008245 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8246 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008247 CmdArgs.push_back("-Bstatic");
8248 else
8249 CmdArgs.push_back("-static");
8250 } else if (Args.hasArg(options::OPT_shared)) {
8251 CmdArgs.push_back("-shared");
8252 }
8253
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008254 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8255 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008256 (!Args.hasArg(options::OPT_static) &&
8257 !Args.hasArg(options::OPT_shared))) {
8258 CmdArgs.push_back("-dynamic-linker");
8259 CmdArgs.push_back(Args.MakeArgString(
8260 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8261 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008262
8263 CmdArgs.push_back("-o");
8264 CmdArgs.push_back(Output.getFilename());
8265
Rafael Espindola81937ec2010-12-01 01:52:43 +00008266 if (!Args.hasArg(options::OPT_nostdlib) &&
8267 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008268 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008269 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008270 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008271 if (Args.hasArg(options::OPT_pg))
8272 crt1 = "gcrt1.o";
8273 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008274 crt1 = "Scrt1.o";
8275 else
8276 crt1 = "crt1.o";
8277 }
8278 if (crt1)
8279 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008280
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008281 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8282 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008283
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008284 const char *crtbegin;
8285 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008286 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008287 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008288 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008289 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008290 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008291 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008292 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008293 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008294
8295 // Add crtfastmath.o if available and fast math is enabled.
8296 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008297 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008298
8299 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008300 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008301
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008302 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008303
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008304 for (const auto &Path : Paths)
8305 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008306
Alexey Samsonov907880e2015-06-19 19:57:46 +00008307 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008308 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008309
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008310 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8311 CmdArgs.push_back("--no-demangle");
8312
Alexey Samsonov52550342014-09-15 19:58:40 +00008313 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008314 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008315 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008316 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008318 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008319 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008320 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008321 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008322 if (OnlyLibstdcxxStatic)
8323 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008324 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008325 if (OnlyLibstdcxxStatic)
8326 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008327 CmdArgs.push_back("-lm");
8328 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008329 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8330 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008331
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008332 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008333 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8334 if (Args.hasArg(options::OPT_static))
8335 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008336
Alexey Samsonov52550342014-09-15 19:58:40 +00008337 if (NeedsSanitizerDeps)
8338 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8339
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008340 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8341 Args.hasArg(options::OPT_pthreads);
8342
8343 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8344 options::OPT_fno_openmp, false)) {
8345 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8346 // FIXME: Does this really make sense for all GNU toolchains?
8347 WantPthread = true;
8348
8349 // Also link the particular OpenMP runtimes.
8350 switch (getOpenMPRuntime(ToolChain, Args)) {
8351 case OMPRT_OMP:
8352 CmdArgs.push_back("-lomp");
8353 break;
8354 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008355 CmdArgs.push_back("-lgomp");
8356
8357 // FIXME: Exclude this for platforms with libgomp that don't require
8358 // librt. Most modern Linux platforms require it, but some may not.
8359 CmdArgs.push_back("-lrt");
8360 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008361 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008362 CmdArgs.push_back("-liomp5");
8363 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008364 case OMPRT_Unknown:
8365 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008366 break;
8367 }
Chandler Carruth01538002013-01-17 13:19:29 +00008368 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008369
Renato Golinc4b49242014-02-13 10:01:16 +00008370 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008371
Richard Smith31d1de22015-05-20 22:48:44 +00008372 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008373 CmdArgs.push_back("-lpthread");
8374
8375 CmdArgs.push_back("-lc");
8376
8377 if (Args.hasArg(options::OPT_static))
8378 CmdArgs.push_back("--end-group");
8379 else
Renato Golinc4b49242014-02-13 10:01:16 +00008380 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008381 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008382
Rafael Espindola81937ec2010-12-01 01:52:43 +00008383 if (!Args.hasArg(options::OPT_nostartfiles)) {
8384 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008385 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008386 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008387 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008388 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008389 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008390 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008391
Rafael Espindola81937ec2010-12-01 01:52:43 +00008392 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008393 if (!isAndroid)
8394 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008395 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008396 }
8397
Justin Bognerd3371d82015-07-17 03:35:54 +00008398 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8399 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008400}
8401
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008402// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8403// for the various SFI requirements like register masking. The assembly tool
8404// inserts the file containing the macros as an input into all the assembly
8405// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008406void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8407 const InputInfo &Output,
8408 const InputInfoList &Inputs,
8409 const ArgList &Args,
8410 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008411 const toolchains::NaClToolChain &ToolChain =
8412 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008413 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8414 "nacl-arm-macros.s");
8415 InputInfoList NewInputs;
8416 NewInputs.push_back(NaClMacros);
8417 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008418 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8419 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008420}
8421
Douglas Katzman750cfc52015-06-29 18:42:16 +00008422// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008423// we use static by default, do not yet support sanitizers or LTO, and a few
8424// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008425// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008426void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8427 const InputInfo &Output,
8428 const InputInfoList &Inputs,
8429 const ArgList &Args,
8430 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008431
Douglas Katzman54366072015-07-27 16:53:08 +00008432 const toolchains::NaClToolChain &ToolChain =
8433 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008434 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008435 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008436 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008437 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008438
8439 ArgStringList CmdArgs;
8440
8441 // Silence warning for "clang -g foo.o -o foo"
8442 Args.ClaimAllArgs(options::OPT_g_Group);
8443 // and "clang -emit-llvm foo.o -o foo"
8444 Args.ClaimAllArgs(options::OPT_emit_llvm);
8445 // and for "clang -w foo.o -o foo". Other warning options are already
8446 // handled somewhere else.
8447 Args.ClaimAllArgs(options::OPT_w);
8448
8449 if (!D.SysRoot.empty())
8450 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8451
8452 if (Args.hasArg(options::OPT_rdynamic))
8453 CmdArgs.push_back("-export-dynamic");
8454
8455 if (Args.hasArg(options::OPT_s))
8456 CmdArgs.push_back("-s");
8457
Douglas Katzman54366072015-07-27 16:53:08 +00008458 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8459 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008460 CmdArgs.push_back("--build-id");
8461
8462 if (!IsStatic)
8463 CmdArgs.push_back("--eh-frame-hdr");
8464
8465 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008466 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008467 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008468 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008469 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008470 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008471 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008472 else if (Arch == llvm::Triple::mipsel)
8473 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008474 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008475 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8476 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008477
8478 if (IsStatic)
8479 CmdArgs.push_back("-static");
8480 else if (Args.hasArg(options::OPT_shared))
8481 CmdArgs.push_back("-shared");
8482
8483 CmdArgs.push_back("-o");
8484 CmdArgs.push_back(Output.getFilename());
8485 if (!Args.hasArg(options::OPT_nostdlib) &&
8486 !Args.hasArg(options::OPT_nostartfiles)) {
8487 if (!Args.hasArg(options::OPT_shared))
8488 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8489 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8490
8491 const char *crtbegin;
8492 if (IsStatic)
8493 crtbegin = "crtbeginT.o";
8494 else if (Args.hasArg(options::OPT_shared))
8495 crtbegin = "crtbeginS.o";
8496 else
8497 crtbegin = "crtbegin.o";
8498 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8499 }
8500
8501 Args.AddAllArgs(CmdArgs, options::OPT_L);
8502 Args.AddAllArgs(CmdArgs, options::OPT_u);
8503
8504 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8505
8506 for (const auto &Path : Paths)
8507 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8508
8509 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8510 CmdArgs.push_back("--no-demangle");
8511
8512 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8513
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008514 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008515 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008516 bool OnlyLibstdcxxStatic =
8517 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008518 if (OnlyLibstdcxxStatic)
8519 CmdArgs.push_back("-Bstatic");
8520 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8521 if (OnlyLibstdcxxStatic)
8522 CmdArgs.push_back("-Bdynamic");
8523 CmdArgs.push_back("-lm");
8524 }
8525
8526 if (!Args.hasArg(options::OPT_nostdlib)) {
8527 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8528 // Always use groups, since it has no effect on dynamic libraries.
8529 CmdArgs.push_back("--start-group");
8530 CmdArgs.push_back("-lc");
8531 // NaCl's libc++ currently requires libpthread, so just always include it
8532 // in the group for C++.
8533 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008534 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008535 // Gold, used by Mips, handles nested groups differently than ld, and
8536 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8537 // which is not a desired behaviour here.
8538 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8539 if (getToolChain().getArch() == llvm::Triple::mipsel)
8540 CmdArgs.push_back("-lnacl");
8541
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008542 CmdArgs.push_back("-lpthread");
8543 }
8544
8545 CmdArgs.push_back("-lgcc");
8546 CmdArgs.push_back("--as-needed");
8547 if (IsStatic)
8548 CmdArgs.push_back("-lgcc_eh");
8549 else
8550 CmdArgs.push_back("-lgcc_s");
8551 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008552
8553 // Mips needs to create and use pnacl_legacy library that contains
8554 // definitions from bitcode/pnaclmm.c and definitions for
8555 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8556 if (getToolChain().getArch() == llvm::Triple::mipsel)
8557 CmdArgs.push_back("-lpnacl_legacy");
8558
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008559 CmdArgs.push_back("--end-group");
8560 }
8561
8562 if (!Args.hasArg(options::OPT_nostartfiles)) {
8563 const char *crtend;
8564 if (Args.hasArg(options::OPT_shared))
8565 crtend = "crtendS.o";
8566 else
8567 crtend = "crtend.o";
8568
8569 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8570 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8571 }
8572 }
8573
Justin Bognerd3371d82015-07-17 03:35:54 +00008574 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8575 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008576}
8577
Douglas Katzman95354292015-06-23 20:42:09 +00008578void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8579 const InputInfo &Output,
8580 const InputInfoList &Inputs,
8581 const ArgList &Args,
8582 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008583 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008584 ArgStringList CmdArgs;
8585
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008586 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008587
8588 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008589 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008590
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008591 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008592 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008593
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008594 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008595 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008596}
8597
Douglas Katzman95354292015-06-23 20:42:09 +00008598void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8599 const InputInfo &Output,
8600 const InputInfoList &Inputs,
8601 const ArgList &Args,
8602 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008603 const Driver &D = getToolChain().getDriver();
8604 ArgStringList CmdArgs;
8605
Daniel Dunbarb440f562010-08-02 02:38:21 +00008606 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008607 CmdArgs.push_back("-o");
8608 CmdArgs.push_back(Output.getFilename());
8609 } else {
8610 assert(Output.isNothing() && "Invalid output.");
8611 }
8612
8613 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008614 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008615 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8616 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8617 CmdArgs.push_back(
8618 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8619 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008620 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008621
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008622 Args.AddAllArgs(CmdArgs,
8623 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008624
Daniel Dunbar54423b22010-09-17 00:24:54 +00008625 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008626
Alexey Samsonov7811d192014-02-20 13:57:37 +00008627 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008628
Chris Lattner3e2ee142010-07-07 16:01:42 +00008629 if (!Args.hasArg(options::OPT_nostdlib) &&
8630 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008631 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008632 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008633 CmdArgs.push_back("-lm");
8634 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008635 }
8636
8637 if (!Args.hasArg(options::OPT_nostdlib) &&
8638 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008639 if (Args.hasArg(options::OPT_pthread))
8640 CmdArgs.push_back("-lpthread");
8641 CmdArgs.push_back("-lc");
8642 CmdArgs.push_back("-lCompilerRT-Generic");
8643 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8644 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008645 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008646 }
8647
Logan Chieneb9162f2014-06-26 14:23:45 +00008648 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008649 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008650}
8651
Daniel Dunbarcc912342009-05-02 18:28:39 +00008652/// DragonFly Tools
8653
8654// For now, DragonFly Assemble does just about the same as for
8655// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008656void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8657 const InputInfo &Output,
8658 const InputInfoList &Inputs,
8659 const ArgList &Args,
8660 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008661 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008662 ArgStringList CmdArgs;
8663
8664 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8665 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008666 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008667 CmdArgs.push_back("--32");
8668
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008669 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008670
8671 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008672 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008673
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008674 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008675 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008676
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008677 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008678 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008679}
8680
Douglas Katzman95354292015-06-23 20:42:09 +00008681void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8682 const InputInfo &Output,
8683 const InputInfoList &Inputs,
8684 const ArgList &Args,
8685 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008686 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008687 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008688 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008689
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008690 if (!D.SysRoot.empty())
8691 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8692
John McCall65b8da02013-04-11 22:55:55 +00008693 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008694 if (Args.hasArg(options::OPT_static)) {
8695 CmdArgs.push_back("-Bstatic");
8696 } else {
John McCall65b8da02013-04-11 22:55:55 +00008697 if (Args.hasArg(options::OPT_rdynamic))
8698 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008699 if (Args.hasArg(options::OPT_shared))
8700 CmdArgs.push_back("-Bshareable");
8701 else {
8702 CmdArgs.push_back("-dynamic-linker");
8703 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8704 }
John McCall65b8da02013-04-11 22:55:55 +00008705 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008706 }
8707
8708 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8709 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008710 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008711 CmdArgs.push_back("-m");
8712 CmdArgs.push_back("elf_i386");
8713 }
8714
Daniel Dunbarb440f562010-08-02 02:38:21 +00008715 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008716 CmdArgs.push_back("-o");
8717 CmdArgs.push_back(Output.getFilename());
8718 } else {
8719 assert(Output.isNothing() && "Invalid output.");
8720 }
8721
8722 if (!Args.hasArg(options::OPT_nostdlib) &&
8723 !Args.hasArg(options::OPT_nostartfiles)) {
8724 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008725 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008726 CmdArgs.push_back(
8727 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008728 else {
8729 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008730 CmdArgs.push_back(
8731 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008732 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008733 CmdArgs.push_back(
8734 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008735 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008736 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008737 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008738 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008739 CmdArgs.push_back(
8740 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008741 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008742 CmdArgs.push_back(
8743 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008744 }
8745
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008746 Args.AddAllArgs(CmdArgs,
8747 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008748
Daniel Dunbar54423b22010-09-17 00:24:54 +00008749 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008750
8751 if (!Args.hasArg(options::OPT_nostdlib) &&
8752 !Args.hasArg(options::OPT_nodefaultlibs)) {
8753 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8754 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008755 if (UseGCC47)
8756 CmdArgs.push_back("-L/usr/lib/gcc47");
8757 else
8758 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008759
8760 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008761 if (UseGCC47) {
8762 CmdArgs.push_back("-rpath");
8763 CmdArgs.push_back("/usr/lib/gcc47");
8764 } else {
8765 CmdArgs.push_back("-rpath");
8766 CmdArgs.push_back("/usr/lib/gcc44");
8767 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008768 }
8769
Hans Wennborg70850d82013-07-18 20:29:38 +00008770 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008771 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008772 CmdArgs.push_back("-lm");
8773 }
8774
Daniel Dunbarcc912342009-05-02 18:28:39 +00008775 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008776 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008777
8778 if (!Args.hasArg(options::OPT_nolibc)) {
8779 CmdArgs.push_back("-lc");
8780 }
8781
John McCall65b8da02013-04-11 22:55:55 +00008782 if (UseGCC47) {
8783 if (Args.hasArg(options::OPT_static) ||
8784 Args.hasArg(options::OPT_static_libgcc)) {
8785 CmdArgs.push_back("-lgcc");
8786 CmdArgs.push_back("-lgcc_eh");
8787 } else {
8788 if (Args.hasArg(options::OPT_shared_libgcc)) {
8789 CmdArgs.push_back("-lgcc_pic");
8790 if (!Args.hasArg(options::OPT_shared))
8791 CmdArgs.push_back("-lgcc");
8792 } else {
8793 CmdArgs.push_back("-lgcc");
8794 CmdArgs.push_back("--as-needed");
8795 CmdArgs.push_back("-lgcc_pic");
8796 CmdArgs.push_back("--no-as-needed");
8797 }
8798 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008799 } else {
John McCall65b8da02013-04-11 22:55:55 +00008800 if (Args.hasArg(options::OPT_shared)) {
8801 CmdArgs.push_back("-lgcc_pic");
8802 } else {
8803 CmdArgs.push_back("-lgcc");
8804 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008805 }
8806 }
8807
8808 if (!Args.hasArg(options::OPT_nostdlib) &&
8809 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008810 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008811 CmdArgs.push_back(
8812 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008813 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008814 CmdArgs.push_back(
8815 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8816 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008817 }
8818
Alexey Samsonov7811d192014-02-20 13:57:37 +00008819 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008820
Logan Chieneb9162f2014-06-26 14:23:45 +00008821 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008822 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008823}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008824
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008825// Try to find Exe from a Visual Studio distribution. This first tries to find
8826// an installed copy of Visual Studio and, failing that, looks in the PATH,
8827// making sure that whatever executable that's found is not a same-named exe
8828// from clang itself to prevent clang from falling back to itself.
8829static std::string FindVisualStudioExecutable(const ToolChain &TC,
8830 const char *Exe,
8831 const char *ClangProgramPath) {
8832 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8833 std::string visualStudioBinDir;
8834 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8835 visualStudioBinDir)) {
8836 SmallString<128> FilePath(visualStudioBinDir);
8837 llvm::sys::path::append(FilePath, Exe);
8838 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8839 return FilePath.str();
8840 }
8841
8842 return Exe;
8843}
8844
Douglas Katzman95354292015-06-23 20:42:09 +00008845void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8846 const InputInfo &Output,
8847 const InputInfoList &Inputs,
8848 const ArgList &Args,
8849 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008850 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008851 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008852
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008853 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8854 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008855 CmdArgs.push_back(
8856 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008857
8858 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008859 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008860 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008861
Zachary Turner10d75b22014-10-22 20:40:43 +00008862 if (!llvm::sys::Process::GetEnv("LIB")) {
8863 // If the VC environment hasn't been configured (perhaps because the user
8864 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008865 // the environment variable is set however, assume the user knows what
8866 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008867 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008868 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008869 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8870 SmallString<128> LibDir(VisualStudioDir);
8871 llvm::sys::path::append(LibDir, "VC", "lib");
8872 switch (MSVC.getArch()) {
8873 case llvm::Triple::x86:
8874 // x86 just puts the libraries directly in lib
8875 break;
8876 case llvm::Triple::x86_64:
8877 llvm::sys::path::append(LibDir, "amd64");
8878 break;
8879 case llvm::Triple::arm:
8880 llvm::sys::path::append(LibDir, "arm");
8881 break;
8882 default:
8883 break;
8884 }
8885 CmdArgs.push_back(
8886 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8887 }
8888
8889 std::string WindowsSdkLibPath;
8890 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8891 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8892 WindowsSdkLibPath.c_str()));
8893 }
8894
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008895 CmdArgs.push_back("-nologo");
8896
Reid Kleckner124955a2015-08-05 18:51:13 +00008897 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008898 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008899
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008900 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008901 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008902 if (DLL) {
8903 CmdArgs.push_back(Args.MakeArgString("-dll"));
8904
8905 SmallString<128> ImplibName(Output.getFilename());
8906 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008907 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008908 }
8909
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008910 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008911 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008912 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008913 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008914 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008915 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008916 };
8917 for (const auto &Component : CompilerRTComponents)
8918 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008919 // Make sure the dynamic runtime thunk is not optimized out at link time
8920 // to ensure proper SEH handling.
8921 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008922 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008923 CmdArgs.push_back(
8924 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008925 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008926 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008927 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008928 };
8929 for (const auto &Component : CompilerRTComponents)
8930 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008931 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008932 }
8933
Hans Wennborg2e274592013-08-13 23:38:57 +00008934 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008935
Alexey Bataevc7e84352015-08-19 04:49:01 +00008936 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8937 options::OPT_fno_openmp, false)) {
8938 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
8939 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
8940 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8941 TC.getDriver().Dir + "/../lib"));
8942 switch (getOpenMPRuntime(getToolChain(), Args)) {
8943 case OMPRT_OMP:
8944 CmdArgs.push_back("-defaultlib:libomp.lib");
8945 break;
8946 case OMPRT_IOMP5:
8947 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
8948 break;
8949 case OMPRT_GOMP:
8950 break;
8951 case OMPRT_Unknown:
8952 // Already diagnosed.
8953 break;
8954 }
8955 }
8956
Reid Kleckner337188f2014-09-16 19:22:00 +00008957 // Add filenames, libraries, and other linker inputs.
8958 for (const auto &Input : Inputs) {
8959 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008960 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008961 continue;
8962 }
8963
8964 const Arg &A = Input.getInputArg();
8965
8966 // Render -l options differently for the MSVC linker.
8967 if (A.getOption().matches(options::OPT_l)) {
8968 StringRef Lib = A.getValue();
8969 const char *LinkLibArg;
8970 if (Lib.endswith(".lib"))
8971 LinkLibArg = Args.MakeArgString(Lib);
8972 else
8973 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8974 CmdArgs.push_back(LinkLibArg);
8975 continue;
8976 }
8977
8978 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8979 // or -L. Render it, even if MSVC doesn't understand it.
8980 A.renderAsInput(Args, CmdArgs);
8981 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008982
Zachary Turner719f58c2014-12-01 23:06:47 +00008983 // We need to special case some linker paths. In the case of lld, we need to
8984 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8985 // linker, we need to use a special search algorithm.
8986 llvm::SmallString<128> linkPath;
8987 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8988 if (Linker.equals_lower("lld"))
8989 Linker = "lld-link";
8990
8991 if (Linker.equals_lower("link")) {
8992 // If we're using the MSVC linker, it's not sufficient to just use link
8993 // from the program PATH, because other environments like GnuWin32 install
8994 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008995 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008996 C.getDriver().getClangProgramPath());
8997 } else {
8998 linkPath = Linker;
8999 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009000 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009001 }
9002
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009003 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009004 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009005}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009006
Douglas Katzman95354292015-06-23 20:42:09 +00009007void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9008 const InputInfo &Output,
9009 const InputInfoList &Inputs,
9010 const ArgList &Args,
9011 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009012 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9013}
9014
Douglas Katzman95354292015-06-23 20:42:09 +00009015std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009016 Compilation &C, const JobAction &JA, const InputInfo &Output,
9017 const InputInfoList &Inputs, const ArgList &Args,
9018 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009019 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009020 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009021 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009022 CmdArgs.push_back("/W0"); // No warnings.
9023
9024 // The goal is to be able to invoke this tool correctly based on
9025 // any flag accepted by clang-cl.
9026
9027 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009028 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009029
9030 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009031 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9032 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9033 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009034 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9035 if (A->getOption().getID() == options::OPT_O0) {
9036 CmdArgs.push_back("/Od");
9037 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009038 CmdArgs.push_back("/Og");
9039
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009040 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009041 if (OptLevel == "s" || OptLevel == "z")
9042 CmdArgs.push_back("/Os");
9043 else
9044 CmdArgs.push_back("/Ot");
9045
9046 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009047 }
9048 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009049 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9050 options::OPT_fno_omit_frame_pointer))
9051 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9052 ? "/Oy"
9053 : "/Oy-");
9054 if (!Args.hasArg(options::OPT_fwritable_strings))
9055 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009056
Nico Weber3f8dafb2015-03-12 19:37:10 +00009057 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009058 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9059
David Majnemerf6072342014-07-01 22:24:56 +00009060 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9061 /*default=*/false))
9062 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009063 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9064 options::OPT_fno_function_sections))
9065 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9066 ? "/Gy"
9067 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009068 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9069 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009070 CmdArgs.push_back(
9071 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009072 if (Args.hasArg(options::OPT_fsyntax_only))
9073 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009074 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9075 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009076 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009077
Nico Weber3f8dafb2015-03-12 19:37:10 +00009078 std::vector<std::string> Includes =
9079 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009080 for (const auto &Include : Includes)
9081 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009082
Hans Wennborg87cfa712013-09-19 20:32:16 +00009083 // Flags that can simply be passed through.
9084 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9085 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009086 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009087 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009088
9089 // The order of these flags is relevant, so pick the last one.
9090 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9091 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9092 A->render(Args, CmdArgs);
9093
Hans Wennborg87cfa712013-09-19 20:32:16 +00009094 // Input filename.
9095 assert(Inputs.size() == 1);
9096 const InputInfo &II = Inputs[0];
9097 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9098 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9099 if (II.isFilename())
9100 CmdArgs.push_back(II.getFilename());
9101 else
9102 II.getInputArg().renderAsInput(Args, CmdArgs);
9103
9104 // Output filename.
9105 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009106 const char *Fo =
9107 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009108 CmdArgs.push_back(Fo);
9109
Hans Wennborg188382e2013-09-20 18:16:35 +00009110 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009111 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9112 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009113 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009114 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009115}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009116
Yaron Keren1c0070c2015-07-02 04:45:27 +00009117/// MinGW Tools
9118void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9119 const InputInfo &Output,
9120 const InputInfoList &Inputs,
9121 const ArgList &Args,
9122 const char *LinkingOutput) const {
9123 claimNoWarnArgs(Args);
9124 ArgStringList CmdArgs;
9125
9126 if (getToolChain().getArch() == llvm::Triple::x86) {
9127 CmdArgs.push_back("--32");
9128 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9129 CmdArgs.push_back("--64");
9130 }
9131
9132 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9133
9134 CmdArgs.push_back("-o");
9135 CmdArgs.push_back(Output.getFilename());
9136
9137 for (const auto &II : Inputs)
9138 CmdArgs.push_back(II.getFilename());
9139
9140 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009141 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009142
9143 if (Args.hasArg(options::OPT_gsplit_dwarf))
9144 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9145 SplitDebugName(Args, Inputs[0]));
9146}
9147
9148void MinGW::Linker::AddLibGCC(const ArgList &Args,
9149 ArgStringList &CmdArgs) const {
9150 if (Args.hasArg(options::OPT_mthreads))
9151 CmdArgs.push_back("-lmingwthrd");
9152 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009153
Yaron Kerenaa281332015-08-09 00:24:07 +00009154 // Make use of compiler-rt if --rtlib option is used
9155 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9156 if (RLT == ToolChain::RLT_Libgcc) {
9157 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9158 Args.hasArg(options::OPT_static);
9159 bool Shared = Args.hasArg(options::OPT_shared);
9160 bool CXX = getToolChain().getDriver().CCCIsCXX();
9161
9162 if (Static || (!CXX && !Shared)) {
9163 CmdArgs.push_back("-lgcc");
9164 CmdArgs.push_back("-lgcc_eh");
9165 } else {
9166 CmdArgs.push_back("-lgcc_s");
9167 CmdArgs.push_back("-lgcc");
9168 }
9169 } else {
9170 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9171 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009172
Yaron Keren1c0070c2015-07-02 04:45:27 +00009173 CmdArgs.push_back("-lmoldname");
9174 CmdArgs.push_back("-lmingwex");
9175 CmdArgs.push_back("-lmsvcrt");
9176}
9177
9178void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9179 const InputInfo &Output,
9180 const InputInfoList &Inputs,
9181 const ArgList &Args,
9182 const char *LinkingOutput) const {
9183 const ToolChain &TC = getToolChain();
9184 const Driver &D = TC.getDriver();
9185 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9186
9187 ArgStringList CmdArgs;
9188
9189 // Silence warning for "clang -g foo.o -o foo"
9190 Args.ClaimAllArgs(options::OPT_g_Group);
9191 // and "clang -emit-llvm foo.o -o foo"
9192 Args.ClaimAllArgs(options::OPT_emit_llvm);
9193 // and for "clang -w foo.o -o foo". Other warning options are already
9194 // handled somewhere else.
9195 Args.ClaimAllArgs(options::OPT_w);
9196
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009197 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9198 if (LinkerName.equals_lower("lld")) {
9199 CmdArgs.push_back("-flavor");
9200 CmdArgs.push_back("gnu");
9201 }
9202
Yaron Keren1c0070c2015-07-02 04:45:27 +00009203 if (!D.SysRoot.empty())
9204 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9205
9206 if (Args.hasArg(options::OPT_s))
9207 CmdArgs.push_back("-s");
9208
9209 CmdArgs.push_back("-m");
9210 if (TC.getArch() == llvm::Triple::x86)
9211 CmdArgs.push_back("i386pe");
9212 if (TC.getArch() == llvm::Triple::x86_64)
9213 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009214 if (TC.getArch() == llvm::Triple::arm)
9215 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009216
9217 if (Args.hasArg(options::OPT_mwindows)) {
9218 CmdArgs.push_back("--subsystem");
9219 CmdArgs.push_back("windows");
9220 } else if (Args.hasArg(options::OPT_mconsole)) {
9221 CmdArgs.push_back("--subsystem");
9222 CmdArgs.push_back("console");
9223 }
9224
9225 if (Args.hasArg(options::OPT_static))
9226 CmdArgs.push_back("-Bstatic");
9227 else {
9228 if (Args.hasArg(options::OPT_mdll))
9229 CmdArgs.push_back("--dll");
9230 else if (Args.hasArg(options::OPT_shared))
9231 CmdArgs.push_back("--shared");
9232 CmdArgs.push_back("-Bdynamic");
9233 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9234 CmdArgs.push_back("-e");
9235 if (TC.getArch() == llvm::Triple::x86)
9236 CmdArgs.push_back("_DllMainCRTStartup@12");
9237 else
9238 CmdArgs.push_back("DllMainCRTStartup");
9239 CmdArgs.push_back("--enable-auto-image-base");
9240 }
9241 }
9242
9243 CmdArgs.push_back("-o");
9244 CmdArgs.push_back(Output.getFilename());
9245
9246 Args.AddAllArgs(CmdArgs, options::OPT_e);
9247 // FIXME: add -N, -n flags
9248 Args.AddLastArg(CmdArgs, options::OPT_r);
9249 Args.AddLastArg(CmdArgs, options::OPT_s);
9250 Args.AddLastArg(CmdArgs, options::OPT_t);
9251 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9252 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9253
9254 if (!Args.hasArg(options::OPT_nostdlib) &&
9255 !Args.hasArg(options::OPT_nostartfiles)) {
9256 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9257 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9258 } else {
9259 if (Args.hasArg(options::OPT_municode))
9260 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9261 else
9262 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9263 }
9264 if (Args.hasArg(options::OPT_pg))
9265 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9266 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9267 }
9268
9269 Args.AddAllArgs(CmdArgs, options::OPT_L);
9270 const ToolChain::path_list Paths = TC.getFilePaths();
9271 for (const auto &Path : Paths)
9272 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9273
9274 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9275
9276 // TODO: Add ASan stuff here
9277
9278 // TODO: Add profile stuff here
9279
9280 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9281 !Args.hasArg(options::OPT_nodefaultlibs)) {
9282 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9283 !Args.hasArg(options::OPT_static);
9284 if (OnlyLibstdcxxStatic)
9285 CmdArgs.push_back("-Bstatic");
9286 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9287 if (OnlyLibstdcxxStatic)
9288 CmdArgs.push_back("-Bdynamic");
9289 }
9290
9291 if (!Args.hasArg(options::OPT_nostdlib)) {
9292 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9293 if (Args.hasArg(options::OPT_static))
9294 CmdArgs.push_back("--start-group");
9295
9296 if (Args.hasArg(options::OPT_fstack_protector) ||
9297 Args.hasArg(options::OPT_fstack_protector_strong) ||
9298 Args.hasArg(options::OPT_fstack_protector_all)) {
9299 CmdArgs.push_back("-lssp_nonshared");
9300 CmdArgs.push_back("-lssp");
9301 }
9302 if (Args.hasArg(options::OPT_fopenmp))
9303 CmdArgs.push_back("-lgomp");
9304
9305 AddLibGCC(Args, CmdArgs);
9306
9307 if (Args.hasArg(options::OPT_pg))
9308 CmdArgs.push_back("-lgmon");
9309
Yaron Kerenadce68e2015-07-06 18:52:19 +00009310 if (Args.hasArg(options::OPT_pthread))
9311 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009312
9313 // add system libraries
9314 if (Args.hasArg(options::OPT_mwindows)) {
9315 CmdArgs.push_back("-lgdi32");
9316 CmdArgs.push_back("-lcomdlg32");
9317 }
9318 CmdArgs.push_back("-ladvapi32");
9319 CmdArgs.push_back("-lshell32");
9320 CmdArgs.push_back("-luser32");
9321 CmdArgs.push_back("-lkernel32");
9322
9323 if (Args.hasArg(options::OPT_static))
9324 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009325 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009326 AddLibGCC(Args, CmdArgs);
9327 }
9328
9329 if (!Args.hasArg(options::OPT_nostartfiles)) {
9330 // Add crtfastmath.o if available and fast math is enabled.
9331 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9332
9333 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9334 }
9335 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009336 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009337 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009338}
9339
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009340/// XCore Tools
9341// We pass assemble and link construction to the xcc tool.
9342
Douglas Katzman95354292015-06-23 20:42:09 +00009343void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9344 const InputInfo &Output,
9345 const InputInfoList &Inputs,
9346 const ArgList &Args,
9347 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009348 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009349 ArgStringList CmdArgs;
9350
9351 CmdArgs.push_back("-o");
9352 CmdArgs.push_back(Output.getFilename());
9353
9354 CmdArgs.push_back("-c");
9355
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009356 if (Args.hasArg(options::OPT_v))
9357 CmdArgs.push_back("-v");
9358
Robert Lytton894d25c2014-05-02 09:33:25 +00009359 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9360 if (!A->getOption().matches(options::OPT_g0))
9361 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009362
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009363 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9364 false))
9365 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009366
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009367 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009368
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009369 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009370 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009371
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009372 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009373 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009374}
9375
Douglas Katzman95354292015-06-23 20:42:09 +00009376void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9377 const InputInfo &Output,
9378 const InputInfoList &Inputs,
9379 const ArgList &Args,
9380 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009381 ArgStringList CmdArgs;
9382
9383 if (Output.isFilename()) {
9384 CmdArgs.push_back("-o");
9385 CmdArgs.push_back(Output.getFilename());
9386 } else {
9387 assert(Output.isNothing() && "Invalid output.");
9388 }
9389
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009390 if (Args.hasArg(options::OPT_v))
9391 CmdArgs.push_back("-v");
9392
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009393 // Pass -fexceptions through to the linker if it was present.
9394 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9395 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009396 CmdArgs.push_back("-fexceptions");
9397
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009398 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9399
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009400 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009401 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009402}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009403
Douglas Katzman95354292015-06-23 20:42:09 +00009404void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9405 const InputInfo &Output,
9406 const InputInfoList &Inputs,
9407 const ArgList &Args,
9408 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009409 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009410 const auto &TC =
9411 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9412 ArgStringList CmdArgs;
9413 const char *Exec;
9414
9415 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009416 default:
9417 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009418 case llvm::Triple::arm:
9419 case llvm::Triple::thumb:
9420 break;
9421 case llvm::Triple::x86:
9422 CmdArgs.push_back("--32");
9423 break;
9424 case llvm::Triple::x86_64:
9425 CmdArgs.push_back("--64");
9426 break;
9427 }
9428
9429 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9430
9431 CmdArgs.push_back("-o");
9432 CmdArgs.push_back(Output.getFilename());
9433
9434 for (const auto &Input : Inputs)
9435 CmdArgs.push_back(Input.getFilename());
9436
9437 const std::string Assembler = TC.GetProgramPath("as");
9438 Exec = Args.MakeArgString(Assembler);
9439
Justin Bognerd3371d82015-07-17 03:35:54 +00009440 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009441}
9442
Douglas Katzman95354292015-06-23 20:42:09 +00009443void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9444 const InputInfo &Output,
9445 const InputInfoList &Inputs,
9446 const ArgList &Args,
9447 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009448 const auto &TC =
9449 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9450 const llvm::Triple &T = TC.getTriple();
9451 const Driver &D = TC.getDriver();
9452 SmallString<128> EntryPoint;
9453 ArgStringList CmdArgs;
9454 const char *Exec;
9455
9456 // Silence warning for "clang -g foo.o -o foo"
9457 Args.ClaimAllArgs(options::OPT_g_Group);
9458 // and "clang -emit-llvm foo.o -o foo"
9459 Args.ClaimAllArgs(options::OPT_emit_llvm);
9460 // and for "clang -w foo.o -o foo"
9461 Args.ClaimAllArgs(options::OPT_w);
9462 // Other warning options are already handled somewhere else.
9463
9464 if (!D.SysRoot.empty())
9465 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9466
9467 if (Args.hasArg(options::OPT_pie))
9468 CmdArgs.push_back("-pie");
9469 if (Args.hasArg(options::OPT_rdynamic))
9470 CmdArgs.push_back("-export-dynamic");
9471 if (Args.hasArg(options::OPT_s))
9472 CmdArgs.push_back("--strip-all");
9473
9474 CmdArgs.push_back("-m");
9475 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009476 default:
9477 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009478 case llvm::Triple::arm:
9479 case llvm::Triple::thumb:
9480 // FIXME: this is incorrect for WinCE
9481 CmdArgs.push_back("thumb2pe");
9482 break;
9483 case llvm::Triple::x86:
9484 CmdArgs.push_back("i386pe");
9485 EntryPoint.append("_");
9486 break;
9487 case llvm::Triple::x86_64:
9488 CmdArgs.push_back("i386pep");
9489 break;
9490 }
9491
9492 if (Args.hasArg(options::OPT_shared)) {
9493 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009494 default:
9495 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009496 case llvm::Triple::arm:
9497 case llvm::Triple::thumb:
9498 case llvm::Triple::x86_64:
9499 EntryPoint.append("_DllMainCRTStartup");
9500 break;
9501 case llvm::Triple::x86:
9502 EntryPoint.append("_DllMainCRTStartup@12");
9503 break;
9504 }
9505
9506 CmdArgs.push_back("-shared");
9507 CmdArgs.push_back("-Bdynamic");
9508
9509 CmdArgs.push_back("--enable-auto-image-base");
9510
9511 CmdArgs.push_back("--entry");
9512 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9513 } else {
9514 EntryPoint.append("mainCRTStartup");
9515
9516 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9517 : "-Bdynamic");
9518
9519 if (!Args.hasArg(options::OPT_nostdlib) &&
9520 !Args.hasArg(options::OPT_nostartfiles)) {
9521 CmdArgs.push_back("--entry");
9522 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9523 }
9524
9525 // FIXME: handle subsystem
9526 }
9527
9528 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009529 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009530
9531 CmdArgs.push_back("-o");
9532 CmdArgs.push_back(Output.getFilename());
9533
9534 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9535 SmallString<261> ImpLib(Output.getFilename());
9536 llvm::sys::path::replace_extension(ImpLib, ".lib");
9537
9538 CmdArgs.push_back("--out-implib");
9539 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9540 }
9541
9542 if (!Args.hasArg(options::OPT_nostdlib) &&
9543 !Args.hasArg(options::OPT_nostartfiles)) {
9544 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9545 const char *CRTBegin;
9546
9547 CRTBegin =
9548 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9549 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9550 }
9551
9552 Args.AddAllArgs(CmdArgs, options::OPT_L);
9553
9554 const auto &Paths = TC.getFilePaths();
9555 for (const auto &Path : Paths)
9556 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9557
9558 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9559
9560 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9561 !Args.hasArg(options::OPT_nodefaultlibs)) {
9562 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9563 !Args.hasArg(options::OPT_static);
9564 if (StaticCXX)
9565 CmdArgs.push_back("-Bstatic");
9566 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9567 if (StaticCXX)
9568 CmdArgs.push_back("-Bdynamic");
9569 }
9570
9571 if (!Args.hasArg(options::OPT_nostdlib)) {
9572 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9573 // TODO handle /MT[d] /MD[d]
9574 CmdArgs.push_back("-lmsvcrt");
9575 AddRunTimeLibs(TC, D, CmdArgs, Args);
9576 }
9577 }
9578
9579 const std::string Linker = TC.GetProgramPath("ld");
9580 Exec = Args.MakeArgString(Linker);
9581
Justin Bognerd3371d82015-07-17 03:35:54 +00009582 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009583}
Douglas Katzman84a75642015-06-19 14:55:19 +00009584
Douglas Katzman95354292015-06-23 20:42:09 +00009585void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9586 const InputInfo &Output,
9587 const InputInfoList &Inputs,
9588 const ArgList &Args,
9589 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009590
9591 ArgStringList CmdArgs;
9592
9593 assert(Inputs.size() == 1);
9594 const InputInfo &II = Inputs[0];
9595 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9596 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9597
Douglas Katzman84a75642015-06-19 14:55:19 +00009598 CmdArgs.push_back("-DMYRIAD2");
9599 CmdArgs.push_back("-mcpu=myriad2");
9600 CmdArgs.push_back("-S");
9601
Douglas Katzmanf6071112015-08-03 14:34:22 +00009602 // Append all -I, -iquote, -isystem paths, defines/undefines,
9603 // 'f' flags, optimize flags, and warning options.
9604 // These are spelled the same way in clang and moviCompile.
9605 Args.AddAllArgs(CmdArgs,
9606 {options::OPT_I_Group, options::OPT_clang_i_Group,
9607 options::OPT_D, options::OPT_U,
9608 options::OPT_f_Group,
9609 options::OPT_f_clang_Group,
9610 options::OPT_g_Group,
9611 options::OPT_O_Group,
9612 options::OPT_W_Group});
Douglas Katzman84a75642015-06-19 14:55:19 +00009613 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9614
9615 CmdArgs.push_back(II.getFilename());
9616 CmdArgs.push_back("-o");
9617 CmdArgs.push_back(Output.getFilename());
9618
9619 std::string Exec =
9620 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009621 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9622 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009623}
9624
Douglas Katzman95354292015-06-23 20:42:09 +00009625void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9626 const InputInfo &Output,
9627 const InputInfoList &Inputs,
9628 const ArgList &Args,
9629 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009630 ArgStringList CmdArgs;
9631
9632 assert(Inputs.size() == 1);
9633 const InputInfo &II = Inputs[0];
9634 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9635 assert(Output.getType() == types::TY_Object);
9636
9637 CmdArgs.push_back("-no6thSlotCompression");
9638 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9639 CmdArgs.push_back("-noSPrefixing");
9640 CmdArgs.push_back("-a"); // Mystery option.
9641 for (auto Arg : Args.filtered(options::OPT_I)) {
9642 Arg->claim();
9643 CmdArgs.push_back(
9644 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9645 }
9646 CmdArgs.push_back("-elf"); // Output format.
9647 CmdArgs.push_back(II.getFilename());
9648 CmdArgs.push_back(
9649 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9650
9651 std::string Exec =
9652 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009653 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9654 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009655}