blob: b2e8403fe1fb2b2234a710f70c8f4d88d039d06f [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"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.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"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000087 if (const Arg *A =
88 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
89 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
90 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000091}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000098 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000099 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000100 default:
101 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000102 case ' ':
103 case '\\':
104 Res.push_back('\\');
105 break;
106 }
107 Res.push_back(*Arg);
108 }
109}
110
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000111// Quote target names for inclusion in GNU Make dependency files.
112// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000113static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000139static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
140 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000141 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000142 bool CombinedArg = false;
143
Bill Wendling281ca292012-03-12 21:22:35 +0000144 if (!DirList)
145 return; // Nothing to do.
146
Chad Rosier616e8a52012-10-30 21:42:09 +0000147 StringRef Name(ArgName);
148 if (Name.equals("-I") || Name.equals("-L"))
149 CombinedArg = true;
150
Bill Wendling281ca292012-03-12 21:22:35 +0000151 StringRef Dirs(DirList);
152 if (Dirs.empty()) // Empty string should not add '.'.
153 return;
154
155 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000156 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000157 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 if (CombinedArg) {
159 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
160 } else {
161 CmdArgs.push_back(ArgName);
162 CmdArgs.push_back(".");
163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000165 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000166 CmdArgs.push_back(
167 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendling281ca292012-03-12 21:22:35 +0000172 }
Nico Weber89355782012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendling281ca292012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191}
192
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000193static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
194 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000195 const Driver &D = TC.getDriver();
196
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000197 // Add extra linker input arguments which are not treated as inputs
198 // (constructed via -Xarch_).
199 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
200
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000201 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000202 if (!TC.HasNativeLLVMSupport()) {
203 // Don't try to pass LLVM inputs unless we have native support.
204 if (II.getType() == types::TY_LLVM_IR ||
205 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000206 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
207 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000208 }
209
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000210 // Add filenames immediately.
211 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000212 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000213 continue;
214 }
215
216 // Otherwise, this is a linker input argument.
217 const Arg &A = II.getInputArg();
218
219 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000220 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000221 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000222 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000223 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000224 else if (A.getOption().matches(options::OPT_z)) {
225 // Pass -z prefix for gcc linker compatibility.
226 A.claim();
227 A.render(Args, CmdArgs);
228 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000229 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000230 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000231 }
Bill Wendling281ca292012-03-12 21:22:35 +0000232
233 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000234 // and only supported on native toolchains.
235 if (!TC.isCrossCompiling())
236 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237}
238
John McCall31168b02011-06-15 23:02:42 +0000239/// \brief Determine whether Objective-C automated reference counting is
240/// enabled.
241static bool isObjCAutoRefCount(const ArgList &Args) {
242 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
243}
244
Ted Kremeneke65b0862012-03-06 20:05:56 +0000245/// \brief Determine whether we are linking the ObjC runtime.
246static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000247 if (isObjCAutoRefCount(Args)) {
248 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000250 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000251 return Args.hasArg(options::OPT_fobjc_link_runtime);
252}
253
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000254static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000255 // Don't forward inputs from the original command line. They are added from
256 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000257 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000258 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000259}
260
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000261void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
262 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 ArgStringList &CmdArgs,
264 const InputInfo &Output,
265 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000266 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000267
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000268 CheckPreprocessingOptions(D, Args);
269
270 Args.AddLastArg(CmdArgs, options::OPT_C);
271 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000272
273 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000274 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 (A = Args.getLastArg(options::OPT_MD)) ||
276 (A = Args.getLastArg(options::OPT_MMD))) {
277 // Determine the output location.
278 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000279 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000280 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000281 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000282 } else if (Output.getType() == types::TY_Dependencies) {
283 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000284 } else if (A->getOption().matches(options::OPT_M) ||
285 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000286 DepFile = "-";
287 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000288 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000289 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000290 }
291 CmdArgs.push_back("-dependency-file");
292 CmdArgs.push_back(DepFile);
293
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000294 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000295 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
296 const char *DepTarget;
297
298 // If user provided -o, that is the dependency target, except
299 // when we are only generating a dependency file.
300 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
301 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000302 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 } else {
304 // Otherwise derive from the base input.
305 //
306 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000307 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000308 llvm::sys::path::replace_extension(P, "o");
309 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 }
311
312 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000314 QuoteTarget(DepTarget, Quoted);
315 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000318 if (A->getOption().matches(options::OPT_M) ||
319 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000321 if ((isa<PrecompileJobAction>(JA) &&
322 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
323 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000324 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000325 }
326
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000327 if (Args.hasArg(options::OPT_MG)) {
328 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000329 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000330 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000331 CmdArgs.push_back("-MG");
332 }
333
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000335 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336
337 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000338 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000339 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000340
Daniel Dunbara442fd52010-06-11 22:00:13 +0000341 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000342 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000343 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000344 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 CmdArgs.push_back(Args.MakeArgString(Quoted));
346
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000347 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000348 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000349 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350 }
351 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000352
Douglas Gregor111af7d2009-04-18 00:34:01 +0000353 // Add -i* options, and automatically translate to
354 // -include-pch/-include-pth for transparent PCH support. It's
355 // wonky, but we include looking for .gch so we can support seamless
356 // replacement into a build system already set up to be generating
357 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000358 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000359 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000360 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000361 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
362 RenderedImplicitInclude = true;
363
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000364 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000365 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000366
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000367 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000369 SmallString<128> P(A->getValue());
370 // We want the files to have a name like foo.h.pch. Add a dummy extension
371 // so that replace_extension does the right thing.
372 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000373 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000374 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000375 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000377 }
378
Douglas Gregor111af7d2009-04-18 00:34:01 +0000379 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000380 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000381 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000382 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000383 }
384
Douglas Gregor111af7d2009-04-18 00:34:01 +0000385 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000387 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000388 FoundPCH = UsePCH;
389 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000390 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000391 }
392
393 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000394 if (IsFirstImplicitInclude) {
395 A->claim();
396 if (UsePCH)
397 CmdArgs.push_back("-include-pch");
398 else
399 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000401 continue;
402 } else {
403 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000404 D.Diag(diag::warn_drv_pch_not_first_include) << P
405 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000406 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000407 }
408 }
409
410 // Not translated, render as usual.
411 A->claim();
412 A->render(Args, CmdArgs);
413 }
414
415 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000416 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
417 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000418
419 // Add -Wp, and -Xassembler if using the preprocessor.
420
421 // FIXME: There is a very unfortunate problem here, some troubled
422 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
423 // really support that we would have to parse and then translate
424 // those options. :(
425 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
426 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000427
428 // -I- is a deprecated GCC feature, reject it.
429 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000430 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000431
432 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
433 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000434 StringRef sysroot = C.getSysRoot();
435 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000436 if (!Args.hasArg(options::OPT_isysroot)) {
437 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000438 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000439 }
440 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000441
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000442 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000443 // FIXME: We should probably sink the logic for handling these from the
444 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000445 // CPATH - included following the user specified includes (but prior to
446 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000447 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000448 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000449 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000450 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000451 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000452 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000453 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000454 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000455 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000456
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000457 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000458 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000459 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000460
461 // Add system include arguments.
462 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463}
464
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000465// FIXME: Move to target hook.
466static bool isSignedCharDefault(const llvm::Triple &Triple) {
467 switch (Triple.getArch()) {
468 default:
469 return true;
470
Tim Northover9bb857a2013-01-31 12:13:10 +0000471 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000472 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000473 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000474 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000475 case llvm::Triple::thumb:
476 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000477 if (Triple.isOSDarwin() || Triple.isOSWindows())
478 return true;
479 return false;
480
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000481 case llvm::Triple::ppc:
482 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000483 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000484 return true;
485 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000486
David Majnemerdcecd932015-05-23 19:23:55 +0000487 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000488 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000489 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000490 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000491 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492 }
493}
494
Robert Lytton0e076492013-08-13 09:43:10 +0000495static bool isNoCommonDefault(const llvm::Triple &Triple) {
496 switch (Triple.getArch()) {
497 default:
498 return false;
499
500 case llvm::Triple::xcore:
501 return true;
502 }
503}
504
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000505// Handle -mhwdiv=.
506static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000507 const ArgList &Args,
508 std::vector<const char *> &Features) {
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000509 StringRef HWDiv = A->getValue();
510 if (HWDiv == "arm") {
511 Features.push_back("+hwdiv-arm");
512 Features.push_back("-hwdiv");
513 } else if (HWDiv == "thumb") {
514 Features.push_back("-hwdiv-arm");
515 Features.push_back("+hwdiv");
516 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
517 Features.push_back("+hwdiv-arm");
518 Features.push_back("+hwdiv");
519 } else if (HWDiv == "none") {
520 Features.push_back("-hwdiv-arm");
521 Features.push_back("-hwdiv");
522 } else
523 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
524}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000525
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000526// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000527static void getARMFPUFeatures(const Driver &D, const Arg *A,
528 const ArgList &Args,
529 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000530 StringRef FPU = A->getValue();
John Brawn5a589ad2015-06-05 13:34:11 +0000531 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
532 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000533 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
534}
535
John Brawn94fd9632015-05-21 12:19:49 +0000536static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000537 llvm::StringRef Arch = Triple.getArchName();
538 return llvm::ARMTargetParser::parseArchVersion(Arch);
John Brawn94fd9632015-05-21 12:19:49 +0000539}
540
John Brawn94fd9632015-05-21 12:19:49 +0000541static bool isARMMProfile(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000542 llvm::StringRef Arch = Triple.getArchName();
543 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
544 return Profile == llvm::ARM::PK_M;
John Brawn94fd9632015-05-21 12:19:49 +0000545}
546
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000547// Select the float ABI as determined by -msoft-float, -mhard-float, and
548// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000549StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000550 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000551 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000552 if (Arg *A =
553 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
554 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000555 if (A->getOption().matches(options::OPT_msoft_float))
556 FloatABI = "soft";
557 else if (A->getOption().matches(options::OPT_mhard_float))
558 FloatABI = "hard";
559 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000560 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000561 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000562 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000563 FloatABI = "soft";
564 }
565 }
566 }
567
568 // If unspecified, choose the default based on the platform.
569 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000570 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000571 case llvm::Triple::Darwin:
572 case llvm::Triple::MacOSX:
573 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000574 // Darwin defaults to "softfp" for v6 and v7.
575 //
John Brawn94fd9632015-05-21 12:19:49 +0000576 if (getARMSubArchVersionNumber(Triple) == 6 ||
577 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000578 FloatABI = "softfp";
579 else
580 FloatABI = "soft";
581 break;
582 }
583
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000584 // FIXME: this is invalid for WindowsCE
585 case llvm::Triple::Win32:
586 FloatABI = "hard";
587 break;
588
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000589 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000590 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000591 case llvm::Triple::GNUEABIHF:
592 FloatABI = "hard";
593 break;
594 default:
595 // FreeBSD defaults to soft float
596 FloatABI = "soft";
597 break;
598 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000599 break;
600
Daniel Dunbar78485922009-09-10 23:00:09 +0000601 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000602 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000603 case llvm::Triple::GNUEABIHF:
604 FloatABI = "hard";
605 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000606 case llvm::Triple::GNUEABI:
607 FloatABI = "softfp";
608 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000609 case llvm::Triple::EABIHF:
610 FloatABI = "hard";
611 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000612 case llvm::Triple::EABI:
613 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
614 FloatABI = "softfp";
615 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000616 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000617 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000618 FloatABI = "softfp";
619 else
620 FloatABI = "soft";
621 break;
622 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000623 default:
624 // Assume "soft", but warn the user we are guessing.
625 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000626 if (Triple.getOS() != llvm::Triple::UnknownOS ||
627 !Triple.isOSBinFormatMachO())
628 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000629 break;
630 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 }
632 }
633
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000634 return FloatABI;
635}
636
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000637static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
638 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000639 std::vector<const char *> &Features,
640 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000641 bool KernelOrKext =
642 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000643 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
644 if (!ForAS) {
645 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
646 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
647 // stripped out by the ARM target. We should probably pass this a new
648 // -target-option, which is handled by the -cc1/-cc1as invocation.
649 //
650 // FIXME2: For consistency, it would be ideal if we set up the target
651 // machine state the same when using the frontend or the assembler. We don't
652 // currently do that for the assembler, we pass the options directly to the
653 // backend and never even instantiate the frontend TargetInfo. If we did,
654 // and used its handleTargetFeatures hook, then we could ensure the
655 // assembler and the frontend behave the same.
656
657 // Use software floating point operations?
658 if (FloatABI == "soft")
659 Features.push_back("+soft-float");
660
661 // Use software floating point argument passing?
662 if (FloatABI != "hard")
663 Features.push_back("+soft-float-abi");
664 }
665
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000666 // Honor -mfpu=.
667 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000668 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000669 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
670 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000671
John Brawna8f82342015-05-29 13:10:44 +0000672 // Check if -march is valid by checking if it can be canonicalised and parsed.
673 // getARMArch is used here instead of just checking the -march value in order
674 // to handle -march=native correctly.
John Brawn94fd9632015-05-21 12:19:49 +0000675 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000676 std::string Arch = arm::getARMArch(Args, Triple);
John Brawna8f82342015-05-29 13:10:44 +0000677 if (llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_INVALID)
John Brawna95c1a82015-05-08 12:52:18 +0000678 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000679 }
680
681 // We do a similar thing with -mcpu, but here things are complicated because
682 // the only function we have to check if a cpu is valid is
683 // getLLVMArchSuffixForARM which also needs an architecture.
684 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000685 std::string CPU = arm::getARMTargetCPU(Args, Triple);
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000686 std::string Arch = arm::getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000687 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
688 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
689 }
John Brawna95c1a82015-05-08 12:52:18 +0000690
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000691 // Setting -msoft-float effectively disables NEON because of the GCC
692 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000693 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000694 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000695 // Also need to explicitly disable features which imply NEON.
696 Features.push_back("-crypto");
697 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000698
Eric Christopher269c2a22015-04-04 03:34:43 +0000699 // En/disable crc code generation.
700 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000701 if (A->getOption().matches(options::OPT_mcrc))
702 Features.push_back("+crc");
703 else
704 Features.push_back("-crc");
705 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000706
707 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
708 Features.insert(Features.begin(), "+v8.1a");
709 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000710
Akira Hatanakac2694822015-07-07 08:28:42 +0000711 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
712 // neither options are specified, see if we are compiling for kernel/kext and
713 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000714 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
715 options::OPT_mno_long_calls)) {
716 if (A->getOption().matches(options::OPT_mlong_calls))
717 Features.push_back("+long-calls");
718 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
719 Features.push_back("+long-calls");
720 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000721
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000722 // llvm does not support reserving registers in general. There is support
723 // for reserving r9 on ARM though (defined as a platform-specific register
724 // in ARM EABI).
725 if (Args.hasArg(options::OPT_ffixed_r9))
726 Features.push_back("+reserve-r9");
727
Akira Hatanaka580efb22015-07-16 00:43:00 +0000728 // The kext linker doesn't know how to deal with movw/movt.
729 if (KernelOrKext)
730 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000731}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000732
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000733void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000734 bool KernelOrKext) const {
735 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000736 // Get the effective triple, which takes into account the deployment target.
737 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
738 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000739
740 // Select the ABI to use.
741 //
742 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000743 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000744 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000745 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000746 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000747 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000748 // The backend is hardwired to assume AAPCS for M-class processors, ensure
749 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000750 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000751 Triple.getOS() == llvm::Triple::UnknownOS || isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000752 ABIName = "aapcs";
753 } else {
754 ABIName = "apcs-gnu";
755 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000756 } else if (Triple.isOSWindows()) {
757 // FIXME: this is invalid for WindowsCE
758 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000759 } else {
760 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000761 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000762 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000763 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000764 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000765 ABIName = "aapcs-linux";
766 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000767 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000768 case llvm::Triple::EABI:
769 ABIName = "aapcs";
770 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000771 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000772 if (Triple.getOS() == llvm::Triple::NetBSD)
773 ABIName = "apcs-gnu";
774 else
775 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000776 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000777 }
778 }
779 CmdArgs.push_back("-target-abi");
780 CmdArgs.push_back(ABIName);
781
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000782 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000783 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000784 if (FloatABI == "soft") {
785 // Floating point operations and argument passing are soft.
786 //
787 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000788 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000789 CmdArgs.push_back("-mfloat-abi");
790 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000791 } else if (FloatABI == "softfp") {
792 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000793 CmdArgs.push_back("-mfloat-abi");
794 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000795 } else {
796 // Floating point operations and argument passing are hard.
797 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000798 CmdArgs.push_back("-mfloat-abi");
799 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000800 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000801
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000802 // Kernel code has more strict alignment requirements.
803 if (KernelOrKext) {
Daniel Dunbar12100e22011-03-22 16:48:17 +0000804 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000805 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000806 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000807
Bob Wilson0874e532014-07-29 00:23:18 +0000808 // -mkernel implies -mstrict-align; don't add the redundant option.
809 if (!KernelOrKext) {
810 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
811 options::OPT_munaligned_access)) {
812 CmdArgs.push_back("-backend-option");
813 if (A->getOption().matches(options::OPT_mno_unaligned_access))
814 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000815 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000816 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000817 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000818 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000819 }
Bob Wilson0874e532014-07-29 00:23:18 +0000820 }
821 }
822
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000823 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000824 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
825 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000826 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000827 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000828 CmdArgs.push_back("-arm-global-merge=false");
829 else
830 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000831 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000832
Bob Wilson9c8af452013-04-11 18:53:25 +0000833 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000834 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000835 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000836
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000837}
838
Tim Northover573cbee2014-05-24 12:52:07 +0000839/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
840/// targeting.
841static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000842 Arg *A;
843 std::string CPU;
844 // If we have -mtune or -mcpu, use that.
845 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000846 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000847 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000848 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000849 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000850 }
851
Kevin Qin110db6f2014-07-18 07:03:22 +0000852 // Handle CPU name is 'native'.
853 if (CPU == "native")
854 return llvm::sys::getHostCPUName();
855 else if (CPU.size())
856 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000857
James Molloy9b1586b2014-04-17 12:51:17 +0000858 // Make sure we pick "cyclone" if -arch is used.
859 // FIXME: Should this be picked by checking the target triple instead?
860 if (Args.getLastArg(options::OPT_arch))
861 return "cyclone";
862
863 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000864}
865
Tim Northover573cbee2014-05-24 12:52:07 +0000866void Clang::AddAArch64TargetArgs(const ArgList &Args,
867 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000868 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
869 llvm::Triple Triple(TripleStr);
870
871 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
872 Args.hasArg(options::OPT_mkernel) ||
873 Args.hasArg(options::OPT_fapple_kext))
874 CmdArgs.push_back("-disable-red-zone");
875
876 if (!Args.hasFlag(options::OPT_mimplicit_float,
877 options::OPT_mno_implicit_float, true))
878 CmdArgs.push_back("-no-implicit-float");
879
Craig Topper92fc2df2014-05-17 16:56:41 +0000880 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000881 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
882 ABIName = A->getValue();
883 else if (Triple.isOSDarwin())
884 ABIName = "darwinpcs";
885 else
886 ABIName = "aapcs";
887
888 CmdArgs.push_back("-target-abi");
889 CmdArgs.push_back(ABIName);
890
Bob Wilson0874e532014-07-29 00:23:18 +0000891 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
892 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000893 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000894 if (A->getOption().matches(options::OPT_mno_unaligned_access))
895 CmdArgs.push_back("-aarch64-strict-align");
896 else
897 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000898 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000899
Bradley Smith9ff64332014-10-13 10:16:06 +0000900 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
901 options::OPT_mno_fix_cortex_a53_835769)) {
902 CmdArgs.push_back("-backend-option");
903 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
904 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
905 else
906 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000907 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
908 // Enabled A53 errata (835769) workaround by default on android
909 CmdArgs.push_back("-backend-option");
910 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000911 }
912
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000913 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +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");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000917 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000918 CmdArgs.push_back("-aarch64-global-merge=false");
919 else
920 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000921 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000922}
923
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000924// Get CPU and ABI names. They are not independent
925// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000926void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
927 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000928 const char *DefMips32CPU = "mips32r2";
929 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000930
Daniel Sanders2bf13662014-07-10 14:40:57 +0000931 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
932 // default for mips64(el)?-img-linux-gnu.
933 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
934 Triple.getEnvironment() == llvm::Triple::GNU) {
935 DefMips32CPU = "mips32r6";
936 DefMips64CPU = "mips64r6";
937 }
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +0000938
939 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
940 if (Triple.getEnvironment() == llvm::Triple::Android)
941 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +0000942
Brad Smithba26f582015-01-06 02:53:17 +0000943 // MIPS3 is the default for mips64*-unknown-openbsd.
944 if (Triple.getOS() == llvm::Triple::OpenBSD)
945 DefMips64CPU = "mips3";
946
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000947 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000948 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000949
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000950 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000951 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000952 // Convert a GNU style Mips ABI name to the name
953 // accepted by LLVM Mips backend.
954 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000955 .Case("32", "o32")
956 .Case("64", "n64")
957 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000958 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000959
960 // Setup default CPU and ABI names.
961 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000962 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000963 default:
964 llvm_unreachable("Unexpected triple arch name");
965 case llvm::Triple::mips:
966 case llvm::Triple::mipsel:
967 CPUName = DefMips32CPU;
968 break;
969 case llvm::Triple::mips64:
970 case llvm::Triple::mips64el:
971 CPUName = DefMips64CPU;
972 break;
973 }
974 }
975
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000976 if (ABIName.empty()) {
977 // Deduce ABI name from the target triple.
978 if (Triple.getArch() == llvm::Triple::mips ||
979 Triple.getArch() == llvm::Triple::mipsel)
980 ABIName = "o32";
981 else
982 ABIName = "n64";
983 }
984
985 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000986 // Deduce CPU name from ABI name.
987 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000988 .Cases("o32", "eabi", DefMips32CPU)
989 .Cases("n32", "n64", DefMips64CPU)
990 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000991 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +0000992
993 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000994}
995
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000996// Convert ABI name to the GNU tools acceptable variant.
997static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
998 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000999 .Case("o32", "32")
1000 .Case("n64", "64")
1001 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001002}
1003
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001004// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1005// and -mfloat-abi=.
1006static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001007 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001008 if (Arg *A =
1009 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1010 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001011 if (A->getOption().matches(options::OPT_msoft_float))
1012 FloatABI = "soft";
1013 else if (A->getOption().matches(options::OPT_mhard_float))
1014 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001015 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001016 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001017 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001018 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001019 FloatABI = "hard";
1020 }
1021 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001022 }
1023
1024 // If unspecified, choose the default based on the platform.
1025 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001026 // Assume "hard", because it's a default value used by gcc.
1027 // When we start to recognize specific target MIPS processors,
1028 // we will be able to select the default more correctly.
1029 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001030 }
1031
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001032 return FloatABI;
1033}
1034
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001035static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001036 std::vector<const char *> &Features,
1037 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001038 StringRef FeatureName) {
1039 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001040 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001041 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001042 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001043 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001044 }
1045}
1046
Daniel Sanders379d44b2014-07-16 11:52:23 +00001047static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1048 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001049 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001050 StringRef CPUName;
1051 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001052 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001053 ABIName = getGnuCompatibleMipsABIName(ABIName);
1054
Daniel Sandersfeb61302014-08-08 15:47:17 +00001055 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1056 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001057
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001058 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001059 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001060 // FIXME: Note, this is a hack. We need to pass the selected float
1061 // mode to the MipsTargetInfoBase to define appropriate macros there.
1062 // Now it is the only method.
1063 Features.push_back("+soft-float");
1064 }
1065
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001066 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001067 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001068 if (Val == "2008") {
1069 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1070 Features.push_back("+nan2008");
1071 else {
1072 Features.push_back("-nan2008");
1073 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1074 }
1075 } else if (Val == "legacy") {
1076 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1077 Features.push_back("-nan2008");
1078 else {
1079 Features.push_back("+nan2008");
1080 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1081 }
1082 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001083 D.Diag(diag::err_drv_unsupported_option_argument)
1084 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001085 }
1086
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001087 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1088 options::OPT_mdouble_float, "single-float");
1089 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1090 "mips16");
1091 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1092 options::OPT_mno_micromips, "micromips");
1093 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1094 "dsp");
1095 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1096 "dspr2");
1097 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1098 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001099
1100 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1101 // pass -mfpxx
1102 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1103 options::OPT_mfp64)) {
1104 if (A->getOption().matches(options::OPT_mfp32))
1105 Features.push_back(Args.MakeArgString("-fp64"));
1106 else if (A->getOption().matches(options::OPT_mfpxx)) {
1107 Features.push_back(Args.MakeArgString("+fpxx"));
1108 Features.push_back(Args.MakeArgString("+nooddspreg"));
1109 } else
1110 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001111 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001112 Features.push_back(Args.MakeArgString("+fpxx"));
1113 Features.push_back(Args.MakeArgString("+nooddspreg"));
1114 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001115
Daniel Sanders28e5d392014-07-10 10:39:51 +00001116 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1117 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001118}
1119
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001120void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001121 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001122 const Driver &D = getToolChain().getDriver();
1123 StringRef CPUName;
1124 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001125 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001126 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001127
1128 CmdArgs.push_back("-target-abi");
1129 CmdArgs.push_back(ABIName.data());
1130
1131 StringRef FloatABI = getMipsFloatABI(D, Args);
1132
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001133 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001134 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001135 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001136 CmdArgs.push_back("-mfloat-abi");
1137 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001138 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001139 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001140 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001141 CmdArgs.push_back("-mfloat-abi");
1142 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001143 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001144
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001145 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1146 if (A->getOption().matches(options::OPT_mxgot)) {
1147 CmdArgs.push_back("-mllvm");
1148 CmdArgs.push_back("-mxgot");
1149 }
1150 }
1151
Simon Atanasyanc580b322013-05-11 06:33:44 +00001152 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1153 options::OPT_mno_ldc1_sdc1)) {
1154 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1155 CmdArgs.push_back("-mllvm");
1156 CmdArgs.push_back("-mno-ldc1-sdc1");
1157 }
1158 }
1159
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1161 options::OPT_mno_check_zero_division)) {
1162 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1163 CmdArgs.push_back("-mllvm");
1164 CmdArgs.push_back("-mno-check-zero-division");
1165 }
1166 }
1167
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001168 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001169 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001170 CmdArgs.push_back("-mllvm");
1171 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1172 A->claim();
1173 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001174}
1175
Hal Finkel8eb59282012-06-11 22:35:19 +00001176/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1177static std::string getPPCTargetCPU(const ArgList &Args) {
1178 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001179 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001180
1181 if (CPUName == "native") {
1182 std::string CPU = llvm::sys::getHostCPUName();
1183 if (!CPU.empty() && CPU != "generic")
1184 return CPU;
1185 else
1186 return "";
1187 }
1188
1189 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001190 .Case("common", "generic")
1191 .Case("440", "440")
1192 .Case("440fp", "440")
1193 .Case("450", "450")
1194 .Case("601", "601")
1195 .Case("602", "602")
1196 .Case("603", "603")
1197 .Case("603e", "603e")
1198 .Case("603ev", "603ev")
1199 .Case("604", "604")
1200 .Case("604e", "604e")
1201 .Case("620", "620")
1202 .Case("630", "pwr3")
1203 .Case("G3", "g3")
1204 .Case("7400", "7400")
1205 .Case("G4", "g4")
1206 .Case("7450", "7450")
1207 .Case("G4+", "g4+")
1208 .Case("750", "750")
1209 .Case("970", "970")
1210 .Case("G5", "g5")
1211 .Case("a2", "a2")
1212 .Case("a2q", "a2q")
1213 .Case("e500mc", "e500mc")
1214 .Case("e5500", "e5500")
1215 .Case("power3", "pwr3")
1216 .Case("power4", "pwr4")
1217 .Case("power5", "pwr5")
1218 .Case("power5x", "pwr5x")
1219 .Case("power6", "pwr6")
1220 .Case("power6x", "pwr6x")
1221 .Case("power7", "pwr7")
1222 .Case("power8", "pwr8")
1223 .Case("pwr3", "pwr3")
1224 .Case("pwr4", "pwr4")
1225 .Case("pwr5", "pwr5")
1226 .Case("pwr5x", "pwr5x")
1227 .Case("pwr6", "pwr6")
1228 .Case("pwr6x", "pwr6x")
1229 .Case("pwr7", "pwr7")
1230 .Case("pwr8", "pwr8")
1231 .Case("powerpc", "ppc")
1232 .Case("powerpc64", "ppc64")
1233 .Case("powerpc64le", "ppc64le")
1234 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001235 }
1236
1237 return "";
1238}
1239
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001240static void getPPCTargetFeatures(const ArgList &Args,
1241 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001242 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1243 StringRef Name = A->getOption().getName();
1244 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001245
1246 // Skip over "-m".
1247 assert(Name.startswith("m") && "Invalid feature name.");
1248 Name = Name.substr(1);
1249
1250 bool IsNegative = Name.startswith("no-");
1251 if (IsNegative)
1252 Name = Name.substr(3);
1253
1254 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1255 // pass the correct option to the backend while calling the frontend
1256 // option the same.
1257 // TODO: Change the LLVM backend option maybe?
1258 if (Name == "mfcrf")
1259 Name = "mfocrf";
1260
1261 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1262 }
1263
1264 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001265 AddTargetFeature(Args, Features, options::OPT_faltivec,
1266 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001267}
1268
Ulrich Weigand8afad612014-07-28 13:17:52 +00001269void Clang::AddPPCTargetArgs(const ArgList &Args,
1270 ArgStringList &CmdArgs) const {
1271 // Select the ABI to use.
1272 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001273 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001274 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001275 case llvm::Triple::ppc64: {
1276 // When targeting a processor that supports QPX, or if QPX is
1277 // specifically enabled, default to using the ABI that supports QPX (so
1278 // long as it is not specifically disabled).
1279 bool HasQPX = false;
1280 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1281 HasQPX = A->getValue() == StringRef("a2q");
1282 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1283 if (HasQPX) {
1284 ABIName = "elfv1-qpx";
1285 break;
1286 }
1287
Ulrich Weigand8afad612014-07-28 13:17:52 +00001288 ABIName = "elfv1";
1289 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001290 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001291 case llvm::Triple::ppc64le:
1292 ABIName = "elfv2";
1293 break;
1294 default:
1295 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001296 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001297
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001298 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1299 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1300 // the option if given as we don't have backend support for any targets
1301 // that don't use the altivec abi.
1302 if (StringRef(A->getValue()) != "altivec")
1303 ABIName = A->getValue();
1304
Ulrich Weigand8afad612014-07-28 13:17:52 +00001305 if (ABIName) {
1306 CmdArgs.push_back("-target-abi");
1307 CmdArgs.push_back(ABIName);
1308 }
1309}
1310
1311bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1312 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1313 return A && (A->getValue() == StringRef(Value));
1314}
1315
Tom Stellard6674c702013-04-01 20:56:53 +00001316/// Get the (LLVM) name of the R600 gpu we are targeting.
1317static std::string getR600TargetGPU(const ArgList &Args) {
1318 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001319 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001320 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001321 .Cases("rv630", "rv635", "r600")
1322 .Cases("rv610", "rv620", "rs780", "rs880")
1323 .Case("rv740", "rv770")
1324 .Case("palm", "cedar")
1325 .Cases("sumo", "sumo2", "sumo")
1326 .Case("hemlock", "cypress")
1327 .Case("aruba", "cayman")
1328 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001329 }
1330 return "";
1331}
1332
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001333void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001334 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001335 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001336 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001337
James Y Knightb2406522015-06-15 20:51:24 +00001338 bool SoftFloatABI = false;
1339 if (Arg *A =
1340 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001341 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001342 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001343 }
1344
James Y Knightb2406522015-06-15 20:51:24 +00001345 // Only the hard-float ABI on Sparc is standardized, and it is the
1346 // default. GCC also supports a nonstandard soft-float ABI mode, and
1347 // perhaps LLVM should implement that, too. However, since llvm
1348 // currently does not support Sparc soft-float, at all, display an
1349 // error if it's requested.
1350 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001351 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1352 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001353 }
1354}
1355
Richard Sandiford4652d892013-07-19 16:51:51 +00001356static const char *getSystemZTargetCPU(const ArgList &Args) {
1357 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1358 return A->getValue();
1359 return "z10";
1360}
1361
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001362static void getSystemZTargetFeatures(const ArgList &Args,
1363 std::vector<const char *> &Features) {
1364 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001365 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001366 if (A->getOption().matches(options::OPT_mhtm))
1367 Features.push_back("+transactional-execution");
1368 else
1369 Features.push_back("-transactional-execution");
1370 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001371 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001372 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001373 if (A->getOption().matches(options::OPT_mvx))
1374 Features.push_back("+vector");
1375 else
1376 Features.push_back("-vector");
1377 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001378}
1379
Chandler Carruth953fb082013-01-13 11:46:33 +00001380static const char *getX86TargetCPU(const ArgList &Args,
1381 const llvm::Triple &Triple) {
1382 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001383 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001384 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001385 return "core-avx2";
1386
Chandler Carruth953fb082013-01-13 11:46:33 +00001387 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001388 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001389
1390 // FIXME: Reject attempts to use -march=native unless the target matches
1391 // the host.
1392 //
1393 // FIXME: We should also incorporate the detected target features for use
1394 // with -native.
1395 std::string CPU = llvm::sys::getHostCPUName();
1396 if (!CPU.empty() && CPU != "generic")
1397 return Args.MakeArgString(CPU);
1398 }
1399
Reid Kleckner3123eff2015-06-30 16:32:04 +00001400 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1401 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1402 StringRef Arch = A->getValue();
1403 const char *CPU;
1404 if (Triple.getArch() == llvm::Triple::x86) {
1405 CPU = llvm::StringSwitch<const char *>(Arch)
1406 .Case("IA32", "i386")
1407 .Case("SSE", "pentium3")
1408 .Case("SSE2", "pentium4")
1409 .Case("AVX", "sandybridge")
1410 .Case("AVX2", "haswell")
1411 .Default(nullptr);
1412 } else {
1413 CPU = llvm::StringSwitch<const char *>(Arch)
1414 .Case("AVX", "sandybridge")
1415 .Case("AVX2", "haswell")
1416 .Default(nullptr);
1417 }
1418 if (CPU)
1419 return CPU;
1420 }
1421
Chandler Carruth953fb082013-01-13 11:46:33 +00001422 // Select the default CPU if none was given (or detection failed).
1423
1424 if (Triple.getArch() != llvm::Triple::x86_64 &&
1425 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001426 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001427
1428 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1429
1430 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001431 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001432 if (Triple.getArchName() == "x86_64h")
1433 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001434 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001435 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001436
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001437 // Set up default CPU name for PS4 compilers.
1438 if (Triple.isPS4CPU())
1439 return "btver2";
1440
Alexey Bataev286d1b92014-01-31 04:07:13 +00001441 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001442 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001443 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001444
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001445 // Everything else goes to x86-64 in 64-bit mode.
1446 if (Is64Bit)
1447 return "x86-64";
1448
1449 switch (Triple.getOS()) {
1450 case llvm::Triple::FreeBSD:
1451 case llvm::Triple::NetBSD:
1452 case llvm::Triple::OpenBSD:
1453 return "i486";
1454 case llvm::Triple::Haiku:
1455 return "i586";
1456 case llvm::Triple::Bitrig:
1457 return "i686";
1458 default:
1459 // Fallback to p4.
1460 return "pentium4";
1461 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001462}
1463
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001464static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001465 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001466 default:
1467 return "";
1468
Amara Emerson703da2e2013-10-31 09:32:33 +00001469 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001470 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001471 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001472
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001473 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001474 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001475 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001476 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001477 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001478
1479 case llvm::Triple::mips:
1480 case llvm::Triple::mipsel:
1481 case llvm::Triple::mips64:
1482 case llvm::Triple::mips64el: {
1483 StringRef CPUName;
1484 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001485 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001486 return CPUName;
1487 }
1488
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001489 case llvm::Triple::nvptx:
1490 case llvm::Triple::nvptx64:
1491 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1492 return A->getValue();
1493 return "";
1494
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001495 case llvm::Triple::ppc:
1496 case llvm::Triple::ppc64:
1497 case llvm::Triple::ppc64le: {
1498 std::string TargetCPUName = getPPCTargetCPU(Args);
1499 // LLVM may default to generating code for the native CPU,
1500 // but, like gcc, we default to a more generic option for
1501 // each architecture. (except on Darwin)
1502 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1503 if (T.getArch() == llvm::Triple::ppc64)
1504 TargetCPUName = "ppc64";
1505 else if (T.getArch() == llvm::Triple::ppc64le)
1506 TargetCPUName = "ppc64le";
1507 else
1508 TargetCPUName = "ppc";
1509 }
1510 return TargetCPUName;
1511 }
1512
1513 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001514 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001515 case llvm::Triple::sparcv9:
1516 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001517 return A->getValue();
1518 return "";
1519
1520 case llvm::Triple::x86:
1521 case llvm::Triple::x86_64:
1522 return getX86TargetCPU(Args, T);
1523
1524 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001525 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001526
1527 case llvm::Triple::systemz:
1528 return getSystemZTargetCPU(Args);
1529
1530 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001531 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001532 return getR600TargetGPU(Args);
1533 }
1534}
1535
Alp Tokerce365ca2013-12-02 12:43:03 +00001536static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1537 ArgStringList &CmdArgs) {
1538 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1539 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1540 // forward.
1541 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001542 std::string Plugin =
1543 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001544 CmdArgs.push_back(Args.MakeArgString(Plugin));
1545
1546 // Try to pass driver level flags relevant to LTO code generation down to
1547 // the plugin.
1548
1549 // Handle flags for selecting CPU variants.
1550 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1551 if (!CPU.empty())
1552 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1553}
1554
Sanjay Patel2987c292015-06-11 14:53:41 +00001555/// This is a helper function for validating the optional refinement step
1556/// parameter in reciprocal argument strings. Return false if there is an error
1557/// parsing the refinement step. Otherwise, return true and set the Position
1558/// of the refinement step in the input string.
1559static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001560 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001561 const char RefinementStepToken = ':';
1562 Position = In.find(RefinementStepToken);
1563 if (Position != StringRef::npos) {
1564 StringRef Option = A.getOption().getName();
1565 StringRef RefStep = In.substr(Position + 1);
1566 // Allow exactly one numeric character for the additional refinement
1567 // step parameter. This is reasonable for all currently-supported
1568 // operations and architectures because we would expect that a larger value
1569 // of refinement steps would cause the estimate "optimization" to
1570 // under-perform the native operation. Also, if the estimate does not
1571 // converge quickly, it probably will not ever converge, so further
1572 // refinement steps will not produce a better answer.
1573 if (RefStep.size() != 1) {
1574 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1575 return false;
1576 }
1577 char RefStepChar = RefStep[0];
1578 if (RefStepChar < '0' || RefStepChar > '9') {
1579 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1580 return false;
1581 }
1582 }
1583 return true;
1584}
1585
1586/// The -mrecip flag requires processing of many optional parameters.
1587static void ParseMRecip(const Driver &D, const ArgList &Args,
1588 ArgStringList &OutStrings) {
1589 StringRef DisabledPrefixIn = "!";
1590 StringRef DisabledPrefixOut = "!";
1591 StringRef EnabledPrefixOut = "";
1592 StringRef Out = "-mrecip=";
1593
1594 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1595 if (!A)
1596 return;
1597
1598 unsigned NumOptions = A->getNumValues();
1599 if (NumOptions == 0) {
1600 // No option is the same as "all".
1601 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1602 return;
1603 }
1604
1605 // Pass through "all", "none", or "default" with an optional refinement step.
1606 if (NumOptions == 1) {
1607 StringRef Val = A->getValue(0);
1608 size_t RefStepLoc;
1609 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1610 return;
1611 StringRef ValBase = Val.slice(0, RefStepLoc);
1612 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1613 OutStrings.push_back(Args.MakeArgString(Out + Val));
1614 return;
1615 }
1616 }
1617
1618 // Each reciprocal type may be enabled or disabled individually.
1619 // Check each input value for validity, concatenate them all back together,
1620 // and pass through.
1621
1622 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001623 OptionStrings.insert(std::make_pair("divd", false));
1624 OptionStrings.insert(std::make_pair("divf", false));
1625 OptionStrings.insert(std::make_pair("vec-divd", false));
1626 OptionStrings.insert(std::make_pair("vec-divf", false));
1627 OptionStrings.insert(std::make_pair("sqrtd", false));
1628 OptionStrings.insert(std::make_pair("sqrtf", false));
1629 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1630 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001631
1632 for (unsigned i = 0; i != NumOptions; ++i) {
1633 StringRef Val = A->getValue(i);
1634
1635 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1636 // Ignore the disablement token for string matching.
1637 if (IsDisabled)
1638 Val = Val.substr(1);
1639
1640 size_t RefStep;
1641 if (!getRefinementStep(Val, D, *A, RefStep))
1642 return;
1643
1644 StringRef ValBase = Val.slice(0, RefStep);
1645 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1646 if (OptionIter == OptionStrings.end()) {
1647 // Try again specifying float suffix.
1648 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1649 if (OptionIter == OptionStrings.end()) {
1650 // The input name did not match any known option string.
1651 D.Diag(diag::err_drv_unknown_argument) << Val;
1652 return;
1653 }
1654 // The option was specified without a float or double suffix.
1655 // Make sure that the double entry was not already specified.
1656 // The float entry will be checked below.
1657 if (OptionStrings[ValBase.str() + 'd']) {
1658 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1659 return;
1660 }
1661 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001662
Sanjay Patel2987c292015-06-11 14:53:41 +00001663 if (OptionIter->second == true) {
1664 // Duplicate option specified.
1665 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1666 return;
1667 }
1668
1669 // Mark the matched option as found. Do not allow duplicate specifiers.
1670 OptionIter->second = true;
1671
1672 // If the precision was not specified, also mark the double entry as found.
1673 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1674 OptionStrings[ValBase.str() + 'd'] = true;
1675
1676 // Build the output string.
1677 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1678 Out = Args.MakeArgString(Out + Prefix + Val);
1679 if (i != NumOptions - 1)
1680 Out = Args.MakeArgString(Out + ",");
1681 }
1682
1683 OutStrings.push_back(Args.MakeArgString(Out));
1684}
1685
Eric Christopherc54920a2015-03-23 19:26:05 +00001686static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001687 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001688 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001689 // If -march=native, autodetect the feature list.
1690 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1691 if (StringRef(A->getValue()) == "native") {
1692 llvm::StringMap<bool> HostFeatures;
1693 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1694 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001695 Features.push_back(
1696 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001697 }
1698 }
1699
Jim Grosbach82eee262013-11-16 00:53:35 +00001700 if (Triple.getArchName() == "x86_64h") {
1701 // x86_64h implies quite a few of the more modern subtarget features
1702 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1703 Features.push_back("-rdrnd");
1704 Features.push_back("-aes");
1705 Features.push_back("-pclmul");
1706 Features.push_back("-rtm");
1707 Features.push_back("-hle");
1708 Features.push_back("-fsgsbase");
1709 }
1710
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001711 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001712 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001713 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001714 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001715 Features.push_back("+sse4.2");
1716 Features.push_back("+popcnt");
1717 } else
1718 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001719 }
1720
Eric Christopherc54920a2015-03-23 19:26:05 +00001721 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001722 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1723 StringRef Arch = A->getValue();
1724 bool ArchUsed = false;
1725 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001726 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001727 if (Arch == "AVX" || Arch == "AVX2") {
1728 ArchUsed = true;
1729 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1730 }
1731 }
1732 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001733 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001734 if (Arch == "IA32") {
1735 ArchUsed = true;
1736 } else if (Arch == "SSE" || Arch == "SSE2") {
1737 ArchUsed = true;
1738 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1739 }
1740 }
1741 if (!ArchUsed)
1742 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1743 }
1744
Jim Grosbach82eee262013-11-16 00:53:35 +00001745 // Now add any that the user explicitly requested on the command line,
1746 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001747 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1748 StringRef Name = A->getOption().getName();
1749 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001750
1751 // Skip over "-m".
1752 assert(Name.startswith("m") && "Invalid feature name.");
1753 Name = Name.substr(1);
1754
1755 bool IsNegative = Name.startswith("no-");
1756 if (IsNegative)
1757 Name = Name.substr(3);
1758
1759 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1760 }
1761}
1762
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001763void Clang::AddX86TargetArgs(const ArgList &Args,
1764 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001765 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001766 Args.hasArg(options::OPT_mkernel) ||
1767 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001768 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001769
Bob Wilson2616e2e2013-02-10 16:01:41 +00001770 // Default to avoid implicit floating-point for kernel/kext code, but allow
1771 // that to be overridden with -mno-soft-float.
1772 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1773 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001774 if (Arg *A = Args.getLastArg(
1775 options::OPT_msoft_float, options::OPT_mno_soft_float,
1776 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001777 const Option &O = A->getOption();
1778 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1779 O.matches(options::OPT_msoft_float));
1780 }
1781 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001782 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001783
1784 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1785 StringRef Value = A->getValue();
1786 if (Value == "intel" || Value == "att") {
1787 CmdArgs.push_back("-mllvm");
1788 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1789 } else {
1790 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1791 << A->getOption().getName() << Value;
1792 }
1793 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001794}
1795
Tony Linthicum76329bf2011-12-12 21:14:55 +00001796void Clang::AddHexagonTargetArgs(const ArgList &Args,
1797 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001798 CmdArgs.push_back("-mqdsp6-compat");
1799 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001800
Douglas Katzman54366072015-07-27 16:53:08 +00001801 if (const char *v =
1802 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001803 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001804 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001805 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001806 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001807 }
1808
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001809 if (!Args.hasArg(options::OPT_fno_short_enums))
1810 CmdArgs.push_back("-fshort-enums");
1811 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001812 CmdArgs.push_back("-mllvm");
1813 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001814 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001815 CmdArgs.push_back("-mllvm");
1816 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001817}
1818
Kevin Qin110db6f2014-07-18 07:03:22 +00001819// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001820static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001821 std::vector<const char *> &Features) {
1822 SmallVector<StringRef, 8> Split;
1823 text.split(Split, StringRef("+"), -1, false);
1824
Douglas Katzman2675d012015-06-29 19:12:56 +00001825 for (const StringRef Feature : Split) {
1826 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001827 .Case("fp", "+fp-armv8")
1828 .Case("simd", "+neon")
1829 .Case("crc", "+crc")
1830 .Case("crypto", "+crypto")
1831 .Case("nofp", "-fp-armv8")
1832 .Case("nosimd", "-neon")
1833 .Case("nocrc", "-crc")
1834 .Case("nocrypto", "-crypto")
1835 .Default(nullptr);
1836 if (result)
1837 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001838 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001839 D.Diag(diag::err_drv_no_neon_modifier);
1840 else
1841 return false;
1842 }
1843 return true;
1844}
1845
1846// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1847// decode CPU and feature.
1848static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1849 std::vector<const char *> &Features) {
1850 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1851 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001852 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1853 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001854 Features.push_back("+neon");
1855 Features.push_back("+crc");
1856 Features.push_back("+crypto");
1857 } else if (CPU == "generic") {
1858 Features.push_back("+neon");
1859 } else {
1860 return false;
1861 }
1862
1863 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1864 return false;
1865
1866 return true;
1867}
1868
1869static bool
1870getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1871 const ArgList &Args,
1872 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001873 std::string MarchLowerCase = March.lower();
1874 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001875
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001876 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001877 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001878 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001879 Features.push_back("+v8.1a");
1880 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001881 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001882 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001883
1884 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1885 return false;
1886
1887 return true;
1888}
1889
1890static bool
1891getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1892 const ArgList &Args,
1893 std::vector<const char *> &Features) {
1894 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001895 std::string McpuLowerCase = Mcpu.lower();
1896 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001897 return false;
1898
1899 return true;
1900}
1901
1902static bool
1903getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1904 const ArgList &Args,
1905 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001906 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001907 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001908 if (MtuneLowerCase == "native")
1909 MtuneLowerCase = llvm::sys::getHostCPUName();
1910 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001911 Features.push_back("+zcm");
1912 Features.push_back("+zcz");
1913 }
1914 return true;
1915}
1916
1917static bool
1918getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1919 const ArgList &Args,
1920 std::vector<const char *> &Features) {
1921 StringRef CPU;
1922 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001923 std::string McpuLowerCase = Mcpu.lower();
1924 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00001925 return false;
1926
1927 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1928}
1929
Akira Hatanaka92500472015-07-27 19:29:04 +00001930static void getAArch64TargetFeatures(const Driver &D,
1931 const llvm::Triple &Triple,
1932 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001933 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001934 Arg *A;
1935 bool success = true;
1936 // Enable NEON by default.
1937 Features.push_back("+neon");
1938 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1939 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1940 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1941 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001942 else if (Args.hasArg(options::OPT_arch))
1943 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1944 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001945
1946 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1947 success =
1948 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1949 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1950 success =
1951 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001952 else if (Args.hasArg(options::OPT_arch))
1953 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1954 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001955
1956 if (!success)
1957 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001958
1959 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1960 Features.push_back("-fp-armv8");
1961 Features.push_back("-crypto");
1962 Features.push_back("-neon");
1963 }
Bradley Smith418c5932014-05-02 15:17:51 +00001964
1965 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001966 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00001967 if (A->getOption().matches(options::OPT_mcrc))
1968 Features.push_back("+crc");
1969 else
1970 Features.push_back("-crc");
1971 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00001972
Akira Hatanaka92500472015-07-27 19:29:04 +00001973 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00001974 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001975}
1976
1977static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001978 const ArgList &Args, ArgStringList &CmdArgs,
1979 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001980 std::vector<const char *> Features;
1981 switch (Triple.getArch()) {
1982 default:
1983 break;
1984 case llvm::Triple::mips:
1985 case llvm::Triple::mipsel:
1986 case llvm::Triple::mips64:
1987 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001988 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001989 break;
1990
1991 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001992 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001993 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001994 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001995 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001996 break;
1997
1998 case llvm::Triple::ppc:
1999 case llvm::Triple::ppc64:
2000 case llvm::Triple::ppc64le:
2001 getPPCTargetFeatures(Args, Features);
2002 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002003 case llvm::Triple::systemz:
2004 getSystemZTargetFeatures(Args, Features);
2005 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002006 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002007 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002008 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002009 break;
2010 case llvm::Triple::x86:
2011 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002012 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002013 break;
2014 }
Rafael Espindola43964802013-08-21 17:34:32 +00002015
2016 // Find the last of each feature.
2017 llvm::StringMap<unsigned> LastOpt;
2018 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2019 const char *Name = Features[I];
2020 assert(Name[0] == '-' || Name[0] == '+');
2021 LastOpt[Name + 1] = I;
2022 }
2023
2024 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2025 // If this feature was overridden, ignore it.
2026 const char *Name = Features[I];
2027 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2028 assert(LastI != LastOpt.end());
2029 unsigned Last = LastI->second;
2030 if (Last != I)
2031 continue;
2032
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002033 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002034 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002035 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002036}
2037
David Majnemerae394812014-12-09 00:12:30 +00002038static bool
2039shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2040 const llvm::Triple &Triple) {
2041 // We use the zero-cost exception tables for Objective-C if the non-fragile
2042 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2043 // later.
2044 if (runtime.isNonFragile())
2045 return true;
2046
2047 if (!Triple.isMacOSX())
2048 return false;
2049
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002050 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002051 (Triple.getArch() == llvm::Triple::x86_64 ||
2052 Triple.getArch() == llvm::Triple::arm));
2053}
2054
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002055/// Adds exception related arguments to the driver command arguments. There's a
2056/// master flag, -fexceptions and also language specific flags to enable/disable
2057/// C++ and Objective-C exceptions. This makes it possible to for example
2058/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002059static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002060 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002061 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002062 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002063 const Driver &D = TC.getDriver();
2064 const llvm::Triple &Triple = TC.getTriple();
2065
Chad Rosier4fab82c2012-03-26 22:04:46 +00002066 if (KernelOrKext) {
2067 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2068 // arguments now to avoid warnings about unused arguments.
2069 Args.ClaimAllArgs(options::OPT_fexceptions);
2070 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2071 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2072 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2073 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2074 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002075 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002076 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002077
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002078 // See if the user explicitly enabled exceptions.
2079 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2080 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002081
David Majnemerae394812014-12-09 00:12:30 +00002082 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2083 // is not necessarily sensible, but follows GCC.
2084 if (types::isObjC(InputType) &&
2085 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002086 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002087 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002088
David Majnemerae394812014-12-09 00:12:30 +00002089 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002090 }
2091
2092 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002093 // Disable C++ EH by default on XCore, PS4, and MSVC.
2094 // FIXME: Remove MSVC from this list once things work.
2095 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2096 !Triple.isPS4CPU() &&
2097 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002098 Arg *ExceptionArg = Args.getLastArg(
2099 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2100 options::OPT_fexceptions, options::OPT_fno_exceptions);
2101 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002102 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002103 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2104 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002105
2106 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002107 if (Triple.isPS4CPU()) {
2108 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2109 assert(ExceptionArg &&
2110 "On the PS4 exceptions should only be enabled if passing "
2111 "an argument");
2112 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2113 const Arg *RTTIArg = TC.getRTTIArg();
2114 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2115 D.Diag(diag::err_drv_argument_not_allowed_with)
2116 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2117 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2118 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2119 } else
2120 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2121
Anders Carlssone96ab552011-02-28 02:27:16 +00002122 CmdArgs.push_back("-fcxx-exceptions");
2123
David Majnemer8de68642014-12-05 08:11:58 +00002124 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002125 }
2126 }
2127
David Majnemer8de68642014-12-05 08:11:58 +00002128 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002129 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002130}
2131
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002132static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002133 bool Default = true;
2134 if (TC.getTriple().isOSDarwin()) {
2135 // The native darwin assembler doesn't support the linker_option directives,
2136 // so we disable them if we think the .s file will be passed to it.
2137 Default = TC.useIntegratedAs();
2138 }
2139 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2140 Default);
2141}
2142
Ted Kremenek62093662013-03-12 17:02:12 +00002143static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2144 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 bool UseDwarfDirectory =
2146 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2147 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002148 return !UseDwarfDirectory;
2149}
2150
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002151/// \brief Check whether the given input tree contains any compilation actions.
2152static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002153 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002154 return true;
2155
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002156 for (const auto &Act : *A)
2157 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002158 return true;
2159
2160 return false;
2161}
2162
2163/// \brief Check if -relax-all should be passed to the internal assembler.
2164/// This is done by default when compiling non-assembler source with -O0.
2165static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2166 bool RelaxDefault = true;
2167
2168 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2169 RelaxDefault = A->getOption().matches(options::OPT_O0);
2170
2171 if (RelaxDefault) {
2172 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002173 for (const auto &Act : C.getActions()) {
2174 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002175 RelaxDefault = true;
2176 break;
2177 }
2178 }
2179 }
2180
2181 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002182 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002183}
2184
David Blaikie9260ed62013-07-25 21:19:01 +00002185static void CollectArgsForIntegratedAssembler(Compilation &C,
2186 const ArgList &Args,
2187 ArgStringList &CmdArgs,
2188 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002189 if (UseRelaxAll(C, Args))
2190 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002191
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002192 // When passing -I arguments to the assembler we sometimes need to
2193 // unconditionally take the next argument. For example, when parsing
2194 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2195 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2196 // arg after parsing the '-I' arg.
2197 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002198
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002199 // When using an integrated assembler, translate -Wa, and -Xassembler
2200 // options.
2201 bool CompressDebugSections = false;
2202 for (const Arg *A :
2203 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2204 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002205
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002206 for (const StringRef Value : A->getValues()) {
David Peixottodfb66142013-11-14 22:52:58 +00002207 if (TakeNextArg) {
2208 CmdArgs.push_back(Value.data());
2209 TakeNextArg = false;
2210 continue;
2211 }
David Blaikie9260ed62013-07-25 21:19:01 +00002212
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002213 if (Value == "-force_cpusubtype_ALL") {
2214 // Do nothing, this is the default and we don't support anything else.
2215 } else if (Value == "-L") {
2216 CmdArgs.push_back("-msave-temp-labels");
2217 } else if (Value == "--fatal-warnings") {
2218 CmdArgs.push_back("-massembler-fatal-warnings");
2219 } else if (Value == "--noexecstack") {
2220 CmdArgs.push_back("-mnoexecstack");
2221 } else if (Value == "-compress-debug-sections" ||
2222 Value == "--compress-debug-sections") {
2223 CompressDebugSections = true;
2224 } else if (Value == "-nocompress-debug-sections" ||
2225 Value == "--nocompress-debug-sections") {
2226 CompressDebugSections = false;
2227 } else if (Value.startswith("-I")) {
2228 CmdArgs.push_back(Value.data());
2229 // We need to consume the next argument if the current arg is a plain
2230 // -I. The next arg will be the include directory.
2231 if (Value == "-I")
2232 TakeNextArg = true;
2233 } else if (Value.startswith("-gdwarf-")) {
2234 CmdArgs.push_back(Value.data());
2235 } else {
2236 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002237 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002238 }
2239 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002240 }
2241 if (CompressDebugSections) {
2242 if (llvm::zlib::isAvailable())
2243 CmdArgs.push_back("-compress-debug-sections");
2244 else
2245 D.Diag(diag::warn_debug_compression_unavailable);
2246 }
David Blaikie9260ed62013-07-25 21:19:01 +00002247}
2248
Renato Goline807c122014-01-31 11:47:28 +00002249// Until ARM libraries are build separately, we have them all in one library
2250static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002251 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002252 TC.getArch() == llvm::Triple::x86)
2253 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002254 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002255 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002256 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002257}
2258
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002259static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2260 // The runtimes are located in the OS-specific resource directory.
2261 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002262 const llvm::Triple &Triple = TC.getTriple();
2263 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002264 StringRef OSLibName =
2265 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002266 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002267 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002268}
2269
Peter Collingbourne581f4382015-07-02 01:48:12 +00002270SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2271 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002272 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2273 ? "-android"
2274 : "";
2275
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002276 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002277 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2278 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002279 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002280 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002281 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002282 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002283
2284 SmallString<128> Path = getCompilerRTLibDir(TC);
2285 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2286 Arch + Env + Suffix);
2287
2288 return Path;
2289}
2290
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002291// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002292// FIXME: Make sure we can also emit shared objects if they're requested
2293// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002294static void addClangRT(const ToolChain &TC, const ArgList &Args,
2295 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002296 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002297}
2298
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002299static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2300 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002301 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2302 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002303 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002304 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002305 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002306 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002307 Args.hasArg(options::OPT_fcreate_profile) ||
2308 Args.hasArg(options::OPT_coverage)))
2309 return;
2310
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002311 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002312}
2313
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002314namespace {
2315enum OpenMPRuntimeKind {
2316 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2317 /// without knowing what runtime to target.
2318 OMPRT_Unknown,
2319
2320 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2321 /// the default for Clang.
2322 OMPRT_OMP,
2323
2324 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2325 /// this runtime but can swallow the pragmas, and find and link against the
2326 /// runtime library itself.
2327 OMPRT_GOMP,
2328
Chandler Carruthc6625c62015-05-28 21:10:31 +00002329 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002330 /// OpenMP runtime. We support this mode for users with existing dependencies
2331 /// on this runtime library name.
2332 OMPRT_IOMP5
2333};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002334}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002335
2336/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002337static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2338 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002339 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2340
2341 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2342 if (A)
2343 RuntimeName = A->getValue();
2344
2345 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002346 .Case("libomp", OMPRT_OMP)
2347 .Case("libgomp", OMPRT_GOMP)
2348 .Case("libiomp5", OMPRT_IOMP5)
2349 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002350
2351 if (RT == OMPRT_Unknown) {
2352 if (A)
2353 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002354 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002355 else
2356 // FIXME: We could use a nicer diagnostic here.
2357 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2358 }
2359
2360 return RT;
2361}
2362
Alexey Samsonov52550342014-09-15 19:58:40 +00002363static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2364 ArgStringList &CmdArgs, StringRef Sanitizer,
2365 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002366 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002367 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002368 if (!IsShared)
2369 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002370 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002371 if (!IsShared)
2372 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002373}
2374
Alexey Samsonov52550342014-09-15 19:58:40 +00002375// Tries to use a file with the list of dynamic symbols that need to be exported
2376// from the runtime library. Returns true if the file was found.
2377static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2378 ArgStringList &CmdArgs,
2379 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002380 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2381 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2382 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002383 return true;
2384 }
2385 return false;
2386}
2387
2388static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2389 ArgStringList &CmdArgs) {
2390 // Force linking against the system libraries sanitizers depends on
2391 // (see PR15823 why this is necessary).
2392 CmdArgs.push_back("--no-as-needed");
2393 CmdArgs.push_back("-lpthread");
2394 CmdArgs.push_back("-lrt");
2395 CmdArgs.push_back("-lm");
2396 // There's no libdl on FreeBSD.
2397 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2398 CmdArgs.push_back("-ldl");
2399}
2400
2401static void
2402collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2403 SmallVectorImpl<StringRef> &SharedRuntimes,
2404 SmallVectorImpl<StringRef> &StaticRuntimes,
2405 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2406 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2407 // Collect shared runtimes.
2408 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2409 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002410 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002411
Alexey Samsonov52550342014-09-15 19:58:40 +00002412 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002413 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002414 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2415 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002416 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002417 }
2418 if (SanArgs.needsAsanRt()) {
2419 if (SanArgs.needsSharedAsanRt()) {
2420 HelperStaticRuntimes.push_back("asan-preinit");
2421 } else {
2422 StaticRuntimes.push_back("asan");
2423 if (SanArgs.linkCXXRuntimes())
2424 StaticRuntimes.push_back("asan_cxx");
2425 }
2426 }
2427 if (SanArgs.needsDfsanRt())
2428 StaticRuntimes.push_back("dfsan");
2429 if (SanArgs.needsLsanRt())
2430 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002431 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002432 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002433 if (SanArgs.linkCXXRuntimes())
2434 StaticRuntimes.push_back("msan_cxx");
2435 }
2436 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002437 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002438 if (SanArgs.linkCXXRuntimes())
2439 StaticRuntimes.push_back("tsan_cxx");
2440 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002441 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002442 StaticRuntimes.push_back("ubsan_standalone");
2443 if (SanArgs.linkCXXRuntimes())
2444 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002445 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002446 if (SanArgs.needsSafeStackRt())
2447 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002448}
2449
Alexey Samsonov52550342014-09-15 19:58:40 +00002450// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2451// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2452static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002453 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002454 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2455 HelperStaticRuntimes;
2456 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2457 HelperStaticRuntimes);
2458 for (auto RT : SharedRuntimes)
2459 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2460 for (auto RT : HelperStaticRuntimes)
2461 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2462 bool AddExportDynamic = false;
2463 for (auto RT : StaticRuntimes) {
2464 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2465 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2466 }
2467 // If there is a static runtime with no dynamic list, force all the symbols
2468 // to be dynamic to be sure we export sanitizer interface functions.
2469 if (AddExportDynamic)
2470 CmdArgs.push_back("-export-dynamic");
2471 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002472}
2473
Reid Kleckner86ea7702015-02-04 23:45:07 +00002474static bool areOptimizationsEnabled(const ArgList &Args) {
2475 // Find the last -O arg and see if it is non-zero.
2476 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2477 return !A->getOption().matches(options::OPT_O0);
2478 // Defaults to -O0.
2479 return false;
2480}
2481
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002482static bool shouldUseFramePointerForTarget(const ArgList &Args,
2483 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002484 // XCore never wants frame pointers, regardless of OS.
2485 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002486 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002487 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002488
2489 if (Triple.isOSLinux()) {
2490 switch (Triple.getArch()) {
2491 // Don't use a frame pointer on linux if optimizing for certain targets.
2492 case llvm::Triple::mips64:
2493 case llvm::Triple::mips64el:
2494 case llvm::Triple::mips:
2495 case llvm::Triple::mipsel:
2496 case llvm::Triple::systemz:
2497 case llvm::Triple::x86:
2498 case llvm::Triple::x86_64:
2499 return !areOptimizationsEnabled(Args);
2500 default:
2501 return true;
2502 }
2503 }
2504
2505 if (Triple.isOSWindows()) {
2506 switch (Triple.getArch()) {
2507 case llvm::Triple::x86:
2508 return !areOptimizationsEnabled(Args);
2509 default:
2510 // All other supported Windows ISAs use xdata unwind information, so frame
2511 // pointers are not generally useful.
2512 return false;
2513 }
2514 }
2515
2516 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002517}
2518
Rafael Espindola224dd632011-12-14 21:02:23 +00002519static bool shouldUseFramePointer(const ArgList &Args,
2520 const llvm::Triple &Triple) {
2521 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2522 options::OPT_fomit_frame_pointer))
2523 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2524
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002525 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002526}
2527
Eric Christopherb7d97e92013-04-03 01:58:53 +00002528static bool shouldUseLeafFramePointer(const ArgList &Args,
2529 const llvm::Triple &Triple) {
2530 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2531 options::OPT_momit_leaf_frame_pointer))
2532 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2533
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002534 if (Triple.isPS4CPU())
2535 return false;
2536
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002537 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002538}
2539
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002540/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002541static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002542 SmallString<128> cwd;
2543 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002544 CmdArgs.push_back("-fdebug-compilation-dir");
2545 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002546 }
2547}
2548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002549static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002550 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2551 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2552 SmallString<128> T(FinalOutput->getValue());
2553 llvm::sys::path::replace_extension(T, "dwo");
2554 return Args.MakeArgString(T);
2555 } else {
2556 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002557 SmallString<128> T(
2558 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002559 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002560 llvm::sys::path::replace_extension(F, "dwo");
2561 T += F;
2562 return Args.MakeArgString(F);
2563 }
2564}
2565
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002566static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2567 const JobAction &JA, const ArgList &Args,
2568 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002569 ArgStringList ExtractArgs;
2570 ExtractArgs.push_back("--extract-dwo");
2571
2572 ArgStringList StripArgs;
2573 StripArgs.push_back("--strip-dwo");
2574
2575 // Grabbing the output of the earlier compile step.
2576 StripArgs.push_back(Output.getFilename());
2577 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002578 ExtractArgs.push_back(OutFile);
2579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002581 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002582
2583 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002584 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002585
2586 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002587 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002588}
2589
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002590/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002591/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2592static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002593 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002594 if (A->getOption().matches(options::OPT_O4) ||
2595 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002596 return true;
2597
2598 if (A->getOption().matches(options::OPT_O0))
2599 return false;
2600
2601 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2602
Rafael Espindola91780de2013-08-26 14:05:41 +00002603 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002604 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002605 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002606 return true;
2607
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002608 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002609 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002610 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002611
2612 unsigned OptLevel = 0;
2613 if (S.getAsInteger(10, OptLevel))
2614 return false;
2615
2616 return OptLevel > 1;
2617 }
2618
2619 return false;
2620}
2621
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002622/// Add -x lang to \p CmdArgs for \p Input.
2623static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2624 ArgStringList &CmdArgs) {
2625 // When using -verify-pch, we don't want to provide the type
2626 // 'precompiled-header' if it was inferred from the file extension
2627 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2628 return;
2629
2630 CmdArgs.push_back("-x");
2631 if (Args.hasArg(options::OPT_rewrite_objc))
2632 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2633 else
2634 CmdArgs.push_back(types::getTypeName(Input.getType()));
2635}
2636
David Majnemerc371ff02015-03-22 08:39:22 +00002637static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002638 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002639 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002640
2641 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002642 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002643
2644 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002645 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002646 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002647 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002648}
2649
Rafael Espindola577637a2015-01-03 00:06:04 +00002650// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002651// options that build systems might add but are unused when assembling or only
2652// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002653static void claimNoWarnArgs(const ArgList &Args) {
2654 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002655 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002656 Args.ClaimAllArgs(options::OPT_flto);
2657 Args.ClaimAllArgs(options::OPT_fno_lto);
2658}
2659
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002660static void appendUserToPath(SmallVectorImpl<char> &Result) {
2661#ifdef LLVM_ON_UNIX
2662 const char *Username = getenv("LOGNAME");
2663#else
2664 const char *Username = getenv("USERNAME");
2665#endif
2666 if (Username) {
2667 // Validate that LoginName can be used in a path, and get its length.
2668 size_t Len = 0;
2669 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002670 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002671 Username = nullptr;
2672 break;
2673 }
2674 }
2675
2676 if (Username && Len > 0) {
2677 Result.append(Username, Username + Len);
2678 return;
2679 }
2680 }
2681
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002682// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002683#ifdef LLVM_ON_UNIX
2684 std::string UID = llvm::utostr(getuid());
2685#else
2686 // FIXME: Windows seems to have an 'SID' that might work.
2687 std::string UID = "9999";
2688#endif
2689 Result.append(UID.begin(), UID.end());
2690}
2691
David Majnemere11d3732015-06-08 00:22:46 +00002692VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2693 const llvm::Triple &Triple,
2694 const llvm::opt::ArgList &Args,
2695 bool IsWindowsMSVC) {
2696 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2697 IsWindowsMSVC) ||
2698 Args.hasArg(options::OPT_fmsc_version) ||
2699 Args.hasArg(options::OPT_fms_compatibility_version)) {
2700 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2701 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002702 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002703
2704 if (MSCVersion && MSCompatibilityVersion) {
2705 if (D)
2706 D->Diag(diag::err_drv_argument_not_allowed_with)
2707 << MSCVersion->getAsString(Args)
2708 << MSCompatibilityVersion->getAsString(Args);
2709 return VersionTuple();
2710 }
2711
2712 if (MSCompatibilityVersion) {
2713 VersionTuple MSVT;
2714 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2715 D->Diag(diag::err_drv_invalid_value)
2716 << MSCompatibilityVersion->getAsString(Args)
2717 << MSCompatibilityVersion->getValue();
2718 return MSVT;
2719 }
2720
2721 if (MSCVersion) {
2722 unsigned Version = 0;
2723 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2724 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2725 << MSCVersion->getValue();
2726 return getMSCompatibilityVersion(Version);
2727 }
2728
2729 unsigned Major, Minor, Micro;
2730 Triple.getEnvironmentVersion(Major, Minor, Micro);
2731 if (Major || Minor || Micro)
2732 return VersionTuple(Major, Minor, Micro);
2733
2734 return VersionTuple(18);
2735 }
2736 return VersionTuple();
2737}
2738
Diego Novilloa0545962015-07-10 18:00:07 +00002739static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2740 const InputInfo &Output, const ArgList &Args,
2741 ArgStringList &CmdArgs) {
2742 auto *ProfileGenerateArg = Args.getLastArg(
2743 options::OPT_fprofile_instr_generate,
2744 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
2745 options::OPT_fprofile_generate_EQ);
2746
2747 auto *ProfileUseArg = Args.getLastArg(
2748 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
2749 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ);
2750
2751 if (ProfileGenerateArg && ProfileUseArg)
2752 D.Diag(diag::err_drv_argument_not_allowed_with)
2753 << ProfileGenerateArg->getSpelling()
2754 << ProfileUseArg->getSpelling();
2755
2756 if (ProfileGenerateArg &&
2757 ProfileGenerateArg->getOption().matches(
2758 options::OPT_fprofile_instr_generate_EQ))
2759 ProfileGenerateArg->render(Args, CmdArgs);
2760 else if (ProfileGenerateArg &&
2761 ProfileGenerateArg->getOption().matches(
2762 options::OPT_fprofile_generate_EQ)) {
2763 SmallString<128> Path(ProfileGenerateArg->getValue());
2764 llvm::sys::path::append(Path, "default.profraw");
2765 CmdArgs.push_back(
2766 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2767 } else
2768 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2769
2770 if (ProfileUseArg &&
2771 ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2772 ProfileUseArg->render(Args, CmdArgs);
2773 else if (ProfileUseArg &&
2774 (ProfileUseArg->getOption().matches(options::OPT_fprofile_use_EQ) ||
2775 ProfileUseArg->getOption().matches(
2776 options::OPT_fprofile_instr_use))) {
2777 SmallString<128> Path(
2778 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2779 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2780 llvm::sys::path::append(Path, "default.profdata");
2781 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2782 }
2783
2784 if (Args.hasArg(options::OPT_ftest_coverage) ||
2785 Args.hasArg(options::OPT_coverage))
2786 CmdArgs.push_back("-femit-coverage-notes");
2787 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2788 false) ||
2789 Args.hasArg(options::OPT_coverage))
2790 CmdArgs.push_back("-femit-coverage-data");
2791
2792 if (Args.hasArg(options::OPT_fcoverage_mapping) && !ProfileGenerateArg)
2793 D.Diag(diag::err_drv_argument_only_allowed_with)
2794 << "-fcoverage-mapping"
2795 << "-fprofile-instr-generate";
2796
2797 if (Args.hasArg(options::OPT_fcoverage_mapping))
2798 CmdArgs.push_back("-fcoverage-mapping");
2799
2800 if (C.getArgs().hasArg(options::OPT_c) ||
2801 C.getArgs().hasArg(options::OPT_S)) {
2802 if (Output.isFilename()) {
2803 CmdArgs.push_back("-coverage-file");
2804 SmallString<128> CoverageFilename;
2805 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2806 CoverageFilename = FinalOutput->getValue();
2807 } else {
2808 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2809 }
2810 if (llvm::sys::path::is_relative(CoverageFilename)) {
2811 SmallString<128> Pwd;
2812 if (!llvm::sys::fs::current_path(Pwd)) {
2813 llvm::sys::path::append(Pwd, CoverageFilename);
2814 CoverageFilename.swap(Pwd);
2815 }
2816 }
2817 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2818 }
2819 }
2820}
2821
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002822void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002823 const InputInfo &Output, const InputInfoList &Inputs,
2824 const ArgList &Args, const char *LinkingOutput) const {
2825 bool KernelOrKext =
2826 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002827 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002828 ArgStringList CmdArgs;
2829
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002830 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002831 bool IsWindowsCygnus =
2832 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002833 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2834
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002835 // Check number of inputs for sanity. We need at least one input.
2836 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00002837 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002838 // CUDA compilation may have multiple inputs (source file + results of
2839 // device-side compilations). All other jobs are expected to have exactly one
2840 // input.
2841 bool IsCuda = types::isCuda(Input.getType());
2842 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00002843
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002844 // Invoke ourselves in -cc1 mode.
2845 //
2846 // FIXME: Implement custom jobs for internal actions.
2847 CmdArgs.push_back("-cc1");
2848
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002849 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002850 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002851 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002852 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002853
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002854 const llvm::Triple TT(TripleStr);
2855 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2856 TT.getArch() == llvm::Triple::thumb)) {
2857 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2858 unsigned Version;
2859 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2860 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002861 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2862 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002863 }
2864
Tim Northover336f1892014-03-29 13:16:12 +00002865 // Push all default warning arguments that are specific to
2866 // the given target. These come before user provided warning options
2867 // are provided.
2868 getToolChain().addClangWarningOptions(CmdArgs);
2869
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002870 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002871 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002872
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002873 if (isa<AnalyzeJobAction>(JA)) {
2874 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2875 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002876 } else if (isa<MigrateJobAction>(JA)) {
2877 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002878 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002879 if (Output.getType() == types::TY_Dependencies)
2880 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002881 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002882 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002883 if (Args.hasArg(options::OPT_rewrite_objc) &&
2884 !Args.hasArg(options::OPT_g_Group))
2885 CmdArgs.push_back("-P");
2886 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002887 } else if (isa<AssembleJobAction>(JA)) {
2888 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002889
David Blaikie9260ed62013-07-25 21:19:01 +00002890 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002891
2892 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002893 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002894 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002895 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002896 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002897
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002898 if (JA.getType() == types::TY_Nothing)
2899 CmdArgs.push_back("-fsyntax-only");
2900 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002901 CmdArgs.push_back("-emit-pch");
2902 else
2903 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002904 } else if (isa<VerifyPCHJobAction>(JA)) {
2905 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002906 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002907 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2908 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002909
Teresa Johnson8749d8042015-07-06 16:23:00 +00002910 if (JA.getType() == types::TY_LTO_IR ||
2911 JA.getType() == types::TY_LTO_BC) {
2912 CmdArgs.push_back("-flto");
2913 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002914 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002915 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002916 } else if (JA.getType() == types::TY_LLVM_IR ||
2917 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002918 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002919 } else if (JA.getType() == types::TY_LLVM_BC ||
2920 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002921 CmdArgs.push_back("-emit-llvm-bc");
2922 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002923 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002924 } else if (JA.getType() == types::TY_AST) {
2925 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002926 } else if (JA.getType() == types::TY_ModuleFile) {
2927 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002928 } else if (JA.getType() == types::TY_RewrittenObjC) {
2929 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002930 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002931 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2932 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002933 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002934 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002935 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002936 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002937
2938 // Preserve use-list order by default when emitting bitcode, so that
2939 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2940 // same result as running passes here. For LTO, we don't need to preserve
2941 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002942 if (JA.getType() == types::TY_LLVM_BC)
2943 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002944 }
2945
Justin Bognera88f0122014-06-20 22:59:50 +00002946 // We normally speed up the clang process a bit by skipping destructors at
2947 // exit, but when we're generating diagnostics we can rely on some of the
2948 // cleanup.
2949 if (!C.isForDiagnostics())
2950 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002951
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002952// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00002953#ifdef NDEBUG
2954 CmdArgs.push_back("-disable-llvm-verifier");
2955#endif
2956
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002957 // Set the main file name, so that debug info works even with
2958 // -save-temps.
2959 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002960 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002961
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002962 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002963 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002964 if (Args.hasArg(options::OPT_static))
2965 CmdArgs.push_back("-static-define");
2966
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002967 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002968 // Enable region store model by default.
2969 CmdArgs.push_back("-analyzer-store=region");
2970
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002971 // Treat blocks as analysis entry points.
2972 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2973
Ted Kremenek49c79792011-03-24 00:28:47 +00002974 CmdArgs.push_back("-analyzer-eagerly-assume");
2975
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002976 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002977 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002978 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002979
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002980 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002981 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002982
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002983 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002984 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002985
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002986 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002987
Artem Belevichba558952015-05-06 18:20:23 +00002988 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002989 CmdArgs.push_back("-analyzer-checker=cplusplus");
2990
Nico Webere8e53112014-05-11 01:04:02 +00002991 // Enable the following experimental checkers for testing.
2992 CmdArgs.push_back(
2993 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002994 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2995 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002996 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00002997 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2998 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002999 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003000
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003001 // Set the output format. The default is plist, for (lame) historical
3002 // reasons.
3003 CmdArgs.push_back("-analyzer-output");
3004 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003005 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003006 else
3007 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003008
Ted Kremenekfe449a22010-03-22 22:32:05 +00003009 // Disable the presentation of standard compiler warnings when
3010 // using --analyze. We only want to show static analyzer diagnostics
3011 // or frontend errors.
3012 CmdArgs.push_back("-w");
3013
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003014 // Add -Xanalyzer arguments when running as analyzer.
3015 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003016 }
3017
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003018 CheckCodeGenerationOptions(D, Args);
3019
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003020 bool PIE = getToolChain().isPIEDefault();
3021 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003022 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003023
Alexey Bataev40e75222014-01-28 06:30:35 +00003024 // Android-specific defaults for PIC/PIE
3025 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003026 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00003027 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003028 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00003029 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003030 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00003031 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00003032 case llvm::Triple::mips:
3033 case llvm::Triple::mipsel:
3034 case llvm::Triple::mips64:
3035 case llvm::Triple::mips64el:
3036 PIC = true; // "-fpic"
3037 break;
3038
3039 case llvm::Triple::x86:
3040 case llvm::Triple::x86_64:
3041 PIC = true; // "-fPIC"
3042 IsPICLevelTwo = true;
3043 break;
3044
3045 default:
3046 break;
3047 }
3048 }
3049
Brad Smith5b05db82014-06-24 19:51:29 +00003050 // OpenBSD-specific defaults for PIE
3051 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003052 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00003053 case llvm::Triple::mips64:
3054 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003055 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00003056 case llvm::Triple::x86:
3057 case llvm::Triple::x86_64:
3058 IsPICLevelTwo = false; // "-fpie"
3059 break;
3060
3061 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00003062 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00003063 case llvm::Triple::sparcv9:
3064 IsPICLevelTwo = true; // "-fPIE"
3065 break;
3066
3067 default:
3068 break;
3069 }
3070 }
3071
Alexey Samsonov090301e2013-04-09 12:28:19 +00003072 // For the PIC and PIE flag options, this logic is different from the
3073 // legacy logic in very old versions of GCC, as that logic was just
3074 // a bug no one had ever fixed. This logic is both more rational and
3075 // consistent with GCC's new logic now that the bugs are fixed. The last
3076 // argument relating to either PIC or PIE wins, and no other argument is
3077 // used. If the last argument is any flavor of the '-fno-...' arguments,
3078 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
3079 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003080 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3081 options::OPT_fpic, options::OPT_fno_pic,
3082 options::OPT_fPIE, options::OPT_fno_PIE,
3083 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00003084 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3085 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003086 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00003087 if (LastPICArg) {
3088 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003089 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3090 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3091 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003092 PIC =
3093 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3094 IsPICLevelTwo =
3095 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003096 } else {
3097 PIE = PIC = false;
3098 }
3099 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003100 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00003101
Nick Lewycky609dd662013-10-11 03:33:53 +00003102 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00003103 // specified while enabling PIC enabled level 1 PIC, just force it back to
3104 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
3105 // informal testing).
3106 if (PIC && getToolChain().getTriple().isOSDarwin())
3107 IsPICLevelTwo |= getToolChain().isPICDefault();
3108
Chandler Carruthc0c04552012-04-08 16:40:35 +00003109 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3110 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003111 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00003112 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003113 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003114 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003115 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003116
Chandler Carruth76a943b2012-11-19 03:52:03 +00003117 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3118 // This is a very special mode. It trumps the other modes, almost no one
3119 // uses it, and it isn't even valid on any OS but Darwin.
3120 if (!getToolChain().getTriple().isOSDarwin())
3121 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003122 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003123
3124 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3125
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003126 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003127 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003128
Chandler Carruth76a943b2012-11-19 03:52:03 +00003129 // Only a forced PIC mode can cause the actual compile to have PIC defines
3130 // etc., no flags are sufficient. This behavior was selected to closely
3131 // match that of llvm-gcc and Apple GCC before that.
3132 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3133 CmdArgs.push_back("-pic-level");
3134 CmdArgs.push_back("2");
3135 }
3136 } else {
3137 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3138 // handled in Clang's IRGen by the -pie-level flag.
3139 CmdArgs.push_back("-mrelocation-model");
3140 CmdArgs.push_back(PIC ? "pic" : "static");
3141
3142 if (PIC) {
3143 CmdArgs.push_back("-pic-level");
3144 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3145 if (PIE) {
3146 CmdArgs.push_back("-pie-level");
3147 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3148 }
3149 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003150 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003151
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003152 CmdArgs.push_back("-mthread-model");
3153 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3154 CmdArgs.push_back(A->getValue());
3155 else
3156 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3157
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003158 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3159
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003160 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3161 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003162 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003163
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003164 // LLVM Code Generator Options.
3165
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003166 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3167 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003168 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3169 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003170 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003171 CmdArgs.push_back(A->getValue());
3172 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003173 }
3174 }
3175
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003176 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3177 StringRef v = A->getValue();
3178 CmdArgs.push_back("-mllvm");
3179 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3180 A->claim();
3181 }
3182
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003183 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3184 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003185 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003186 }
3187
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003188 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3189 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003190 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003191 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003192 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003193 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3194 CmdArgs.push_back("-fpcc-struct-return");
3195 } else {
3196 assert(A->getOption().matches(options::OPT_freg_struct_return));
3197 CmdArgs.push_back("-freg-struct-return");
3198 }
3199 }
3200
Roman Divacky65b88cd2011-03-01 17:40:53 +00003201 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3202 CmdArgs.push_back("-mrtd");
3203
Rafael Espindola224dd632011-12-14 21:02:23 +00003204 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003205 CmdArgs.push_back("-mdisable-fp-elim");
3206 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3207 options::OPT_fno_zero_initialized_in_bss))
3208 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003209
3210 bool OFastEnabled = isOptimizationLevelFast(Args);
3211 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3212 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003213 OptSpecifier StrictAliasingAliasOption =
3214 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003215 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3216 // doesn't do any TBAA.
3217 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003218 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003219 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003220 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003221 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3222 options::OPT_fno_struct_path_tbaa))
3223 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003224 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3225 false))
3226 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003227 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3228 options::OPT_fno_optimize_sibling_calls))
3229 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003230
Eric Christopher006208c2013-04-04 06:29:47 +00003231 // Handle segmented stacks.
3232 if (Args.hasArg(options::OPT_fsplit_stack))
3233 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003234
3235 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3236 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003237 OptSpecifier FastMathAliasOption =
3238 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3239
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003240 // Handle various floating point optimization flags, mapping them to the
3241 // appropriate LLVM code generation flags. The pattern for all of these is to
3242 // default off the codegen optimizations, and if any flag enables them and no
3243 // flag disables them after the flag enabling them, enable the codegen
3244 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003245 if (Arg *A = Args.getLastArg(
3246 options::OPT_ffast_math, FastMathAliasOption,
3247 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3248 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3249 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003250 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3251 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003252 A->getOption().getID() != options::OPT_fhonor_infinities)
3253 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003254 if (Arg *A = Args.getLastArg(
3255 options::OPT_ffast_math, FastMathAliasOption,
3256 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3257 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3258 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003259 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3260 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003261 A->getOption().getID() != options::OPT_fhonor_nans)
3262 CmdArgs.push_back("-menable-no-nans");
3263
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003264 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3265 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003266 if (Arg *A =
3267 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3268 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3269 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003270 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3271 // However, turning *off* -ffast_math merely restores the toolchain default
3272 // (which may be false).
3273 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3274 A->getOption().getID() == options::OPT_ffast_math ||
3275 A->getOption().getID() == options::OPT_Ofast)
3276 MathErrno = false;
3277 else if (A->getOption().getID() == options::OPT_fmath_errno)
3278 MathErrno = true;
3279 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003280 if (MathErrno)
3281 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003282
3283 // There are several flags which require disabling very specific
3284 // optimizations. Any of these being disabled forces us to turn off the
3285 // entire set of LLVM optimizations, so collect them through all the flag
3286 // madness.
3287 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003288 if (Arg *A = Args.getLastArg(
3289 options::OPT_ffast_math, FastMathAliasOption,
3290 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3291 options::OPT_fno_unsafe_math_optimizations,
3292 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003293 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3294 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003295 A->getOption().getID() != options::OPT_fno_associative_math)
3296 AssociativeMath = true;
3297 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003298 if (Arg *A = Args.getLastArg(
3299 options::OPT_ffast_math, FastMathAliasOption,
3300 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3301 options::OPT_fno_unsafe_math_optimizations,
3302 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003303 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3304 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003305 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3306 ReciprocalMath = true;
3307 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003308 if (Arg *A = Args.getLastArg(
3309 options::OPT_ffast_math, FastMathAliasOption,
3310 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3311 options::OPT_fno_unsafe_math_optimizations,
3312 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003313 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3314 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003315 A->getOption().getID() != options::OPT_fsigned_zeros)
3316 SignedZeros = false;
3317 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003318 if (Arg *A = Args.getLastArg(
3319 options::OPT_ffast_math, FastMathAliasOption,
3320 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3321 options::OPT_fno_unsafe_math_optimizations,
3322 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003323 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3324 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003325 A->getOption().getID() != options::OPT_ftrapping_math)
3326 TrappingMath = false;
3327 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3328 !TrappingMath)
3329 CmdArgs.push_back("-menable-unsafe-fp-math");
3330
Sanjay Patel76c9e092015-01-23 16:40:50 +00003331 if (!SignedZeros)
3332 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003333
Sanjay Patel359b1052015-04-09 15:03:23 +00003334 if (ReciprocalMath)
3335 CmdArgs.push_back("-freciprocal-math");
3336
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003337 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003338 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003339 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003340 options::OPT_ffp_contract)) {
3341 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003342 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003343 if (Val == "fast" || Val == "on" || Val == "off") {
3344 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3345 } else {
3346 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003347 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003348 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003349 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3350 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003351 // If fast-math is set then set the fp-contract mode to fast.
3352 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3353 }
3354 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003355
Sanjay Patel2987c292015-06-11 14:53:41 +00003356 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003357
Bob Wilson6a039162012-07-19 03:52:53 +00003358 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3359 // and if we find them, tell the frontend to provide the appropriate
3360 // preprocessor macros. This is distinct from enabling any optimizations as
3361 // these options induce language changes which must survive serialization
3362 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003363 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3364 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003365 if (!A->getOption().matches(options::OPT_fno_fast_math))
3366 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003367 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3368 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003369 if (A->getOption().matches(options::OPT_ffinite_math_only))
3370 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003371
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003372 // Decide whether to use verbose asm. Verbose assembly is the default on
3373 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003374 bool IsIntegratedAssemblerDefault =
3375 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003376 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003377 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003378 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003379 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003380
Rafael Espindolab8a12932015-05-22 20:44:03 +00003381 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3382 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003383 CmdArgs.push_back("-no-integrated-as");
3384
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003385 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3386 CmdArgs.push_back("-mdebug-pass");
3387 CmdArgs.push_back("Structure");
3388 }
3389 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3390 CmdArgs.push_back("-mdebug-pass");
3391 CmdArgs.push_back("Arguments");
3392 }
3393
John McCall8517abc2010-02-19 02:45:38 +00003394 // Enable -mconstructor-aliases except on darwin, where we have to
3395 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003396 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003397 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003398
John McCall7ef5cb32011-03-18 02:56:14 +00003399 // Darwin's kernel doesn't support guard variables; just die if we
3400 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003401 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003402 CmdArgs.push_back("-fforbid-guard-variables");
3403
Douglas Gregordbe39272011-02-01 15:15:22 +00003404 if (Args.hasArg(options::OPT_mms_bitfields)) {
3405 CmdArgs.push_back("-mms-bitfields");
3406 }
John McCall8517abc2010-02-19 02:45:38 +00003407
Daniel Dunbar306945d2009-09-16 06:17:29 +00003408 // This is a coarse approximation of what llvm-gcc actually does, both
3409 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3410 // complicated ways.
3411 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003412 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3413 options::OPT_fno_asynchronous_unwind_tables,
3414 (getToolChain().IsUnwindTablesDefault() ||
3415 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3416 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003417 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3418 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003419 CmdArgs.push_back("-munwind-tables");
3420
Chandler Carruth05fb5852012-11-21 23:40:23 +00003421 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003422
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003423 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3424 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003425 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003426 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003427
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003428 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003429 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003430
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003431 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003432 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003433 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003434 }
3435
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003436 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003437 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003438 if (!CPU.empty()) {
3439 CmdArgs.push_back("-target-cpu");
3440 CmdArgs.push_back(Args.MakeArgString(CPU));
3441 }
3442
Rafael Espindolaeb265472013-08-21 21:59:03 +00003443 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3444 CmdArgs.push_back("-mfpmath");
3445 CmdArgs.push_back(A->getValue());
3446 }
3447
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003448 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003449 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003450
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003451 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003452 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003453 default:
3454 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003455
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003456 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003457 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003458 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003459 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003460 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003461 break;
3462
Tim Northover573cbee2014-05-24 12:52:07 +00003463 case llvm::Triple::aarch64:
3464 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003465 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003466 break;
3467
Eric Christopher0b26a612010-03-02 02:41:08 +00003468 case llvm::Triple::mips:
3469 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003470 case llvm::Triple::mips64:
3471 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003472 AddMIPSTargetArgs(Args, CmdArgs);
3473 break;
3474
Ulrich Weigand8afad612014-07-28 13:17:52 +00003475 case llvm::Triple::ppc:
3476 case llvm::Triple::ppc64:
3477 case llvm::Triple::ppc64le:
3478 AddPPCTargetArgs(Args, CmdArgs);
3479 break;
3480
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003481 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003482 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003483 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003484 AddSparcTargetArgs(Args, CmdArgs);
3485 break;
3486
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003487 case llvm::Triple::x86:
3488 case llvm::Triple::x86_64:
3489 AddX86TargetArgs(Args, CmdArgs);
3490 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003491
3492 case llvm::Triple::hexagon:
3493 AddHexagonTargetArgs(Args, CmdArgs);
3494 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003495 }
3496
Hans Wennborg75958c42013-08-08 00:17:41 +00003497 // Add clang-cl arguments.
3498 if (getToolChain().getDriver().IsCLMode())
3499 AddClangCLArgs(Args, CmdArgs);
3500
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003501 // Pass the linker version in use.
3502 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3503 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003504 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003505 }
3506
Eric Christopherb7d97e92013-04-03 01:58:53 +00003507 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003508 CmdArgs.push_back("-momit-leaf-frame-pointer");
3509
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003510 // Explicitly error on some things we know we don't support and can't just
3511 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003512 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003513 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3514 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003515 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003516 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003517 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3518 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003519 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003520 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003521 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003522 }
3523
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003524 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003525 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003526 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003527 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003528 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3529 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003530 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003531 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003532 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003533
Chad Rosierbe10f982011-08-02 17:58:04 +00003534 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003535 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003536 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3537 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003538 }
3539
Manman Ren17bdb0f2013-11-20 20:22:14 +00003540 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3541 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003542 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003543 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003544 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3545 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003546 // FIXME: we should support specifying dwarf version with
3547 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003548 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003549 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003550 const llvm::Triple &Triple = getToolChain().getTriple();
3551 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003552 Triple.getOS() == llvm::Triple::FreeBSD ||
3553 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003554 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003555 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003556 CmdArgs.push_back("-gdwarf-2");
3557 else if (A->getOption().matches(options::OPT_gdwarf_3))
3558 CmdArgs.push_back("-gdwarf-3");
3559 else if (A->getOption().matches(options::OPT_gdwarf_4))
3560 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003561 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003562 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003563 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003564 const llvm::Triple &Triple = getToolChain().getTriple();
3565 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003566 Triple.getOS() == llvm::Triple::FreeBSD ||
3567 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003568 CmdArgs.push_back("-gdwarf-2");
3569 else
3570 CmdArgs.push_back("-g");
3571 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003572 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003573
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003574 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3575 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003576 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3577 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003578 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003579
Eric Christopher138c32b2013-09-13 22:37:55 +00003580 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003581 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3582 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003583 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003584 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003585 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003586 CmdArgs.push_back("-g");
3587 CmdArgs.push_back("-backend-option");
3588 CmdArgs.push_back("-split-dwarf=Enable");
3589 }
3590
Eric Christopher138c32b2013-09-13 22:37:55 +00003591 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3592 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3593 CmdArgs.push_back("-backend-option");
3594 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3595 }
Eric Christophereec89c22013-06-18 00:03:50 +00003596
Eric Christopher0d403d22014-02-14 01:27:03 +00003597 // -gdwarf-aranges turns on the emission of the aranges section in the
3598 // backend.
3599 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3600 CmdArgs.push_back("-backend-option");
3601 CmdArgs.push_back("-generate-arange-section");
3602 }
3603
David Blaikief36d9ba2014-01-27 18:52:43 +00003604 if (Args.hasFlag(options::OPT_fdebug_types_section,
3605 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003606 CmdArgs.push_back("-backend-option");
3607 CmdArgs.push_back("-generate-type-units");
3608 }
Eric Christophereec89c22013-06-18 00:03:50 +00003609
Ed Schouten6e576152015-03-26 17:50:28 +00003610 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3611 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3612
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003613 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003614 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003615 CmdArgs.push_back("-ffunction-sections");
3616 }
3617
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003618 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3619 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003620 CmdArgs.push_back("-fdata-sections");
3621 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003622
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003623 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003624 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003625 CmdArgs.push_back("-fno-unique-section-names");
3626
Chris Lattner3c77a352010-06-22 00:03:40 +00003627 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3628
Diego Novilloa0545962015-07-10 18:00:07 +00003629 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003630
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003631 // Pass options for controlling the default header search paths.
3632 if (Args.hasArg(options::OPT_nostdinc)) {
3633 CmdArgs.push_back("-nostdsysteminc");
3634 CmdArgs.push_back("-nobuiltininc");
3635 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003636 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003637 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003638 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3639 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3640 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003641
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003642 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003643 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003644 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003645
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003646 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3647
Ted Kremenekf7639e12012-03-06 20:06:33 +00003648 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003649 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003650 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003651 options::OPT_ccc_arcmt_modify,
3652 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003653 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003654 switch (A->getOption().getID()) {
3655 default:
3656 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003657 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003658 CmdArgs.push_back("-arcmt-check");
3659 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003660 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003661 CmdArgs.push_back("-arcmt-modify");
3662 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003663 case options::OPT_ccc_arcmt_migrate:
3664 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003665 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003666 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003667
3668 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3669 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003670 break;
John McCalld70fb982011-06-15 23:25:17 +00003671 }
3672 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003673 } else {
3674 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3675 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3676 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003677 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003678
Ted Kremenekf7639e12012-03-06 20:06:33 +00003679 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3680 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003681 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3682 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003683 }
3684 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003685 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003686
3687 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003688 options::OPT_objcmt_migrate_subscripting,
3689 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003690 // None specified, means enable them all.
3691 CmdArgs.push_back("-objcmt-migrate-literals");
3692 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003693 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003694 } else {
3695 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3696 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003697 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003698 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003699 } else {
3700 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3701 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3702 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3703 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3704 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3705 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003706 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003707 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3708 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3709 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3710 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3711 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3712 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3713 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003714 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003715 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003716 }
3717
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003718 // Add preprocessing options like -I, -D, etc. if we are using the
3719 // preprocessor.
3720 //
3721 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003722 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003723 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003724
Rafael Espindolaa7431922011-07-21 23:40:37 +00003725 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3726 // that "The compiler can only warn and ignore the option if not recognized".
3727 // When building with ccache, it will pass -D options to clang even on
3728 // preprocessed inputs and configure concludes that -fPIC is not supported.
3729 Args.ClaimAllArgs(options::OPT_D);
3730
Alp Toker7874bdc2013-11-15 20:40:58 +00003731 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003732 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3733 if (A->getOption().matches(options::OPT_O4)) {
3734 CmdArgs.push_back("-O3");
3735 D.Diag(diag::warn_O4_is_O3);
3736 } else {
3737 A->render(Args, CmdArgs);
3738 }
3739 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003740
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003741 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003742 for (const Arg *A :
3743 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3744 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003745 }
3746
Rafael Espindola577637a2015-01-03 00:06:04 +00003747 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003748
Richard Smith3be1cb22014-08-07 00:24:21 +00003749 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003750 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003751 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3752 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003753 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003754 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003755
3756 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003757 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003758 //
3759 // If a std is supplied, only add -trigraphs if it follows the
3760 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003761 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003762 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3763 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003764 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003765 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003766 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003767 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003768 else
3769 Std->render(Args, CmdArgs);
3770
Nico Weber00721502014-12-23 22:32:37 +00003771 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003772 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003773 options::OPT_ftrigraphs,
3774 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003775 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003776 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003777 } else {
3778 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003779 //
3780 // FIXME: Clang doesn't correctly handle -std= when the input language
3781 // doesn't match. For the time being just ignore this for C++ inputs;
3782 // eventually we want to do all the standard defaulting here instead of
3783 // splitting it between the driver and clang -cc1.
3784 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003785 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3786 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003787 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003788 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003789
Nico Weber00721502014-12-23 22:32:37 +00003790 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3791 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003792 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003793
Richard Smith282b4492013-09-04 22:50:31 +00003794 // GCC's behavior for -Wwrite-strings is a bit strange:
3795 // * In C, this "warning flag" changes the types of string literals from
3796 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3797 // for the discarded qualifier.
3798 // * In C++, this is just a normal warning flag.
3799 //
3800 // Implementing this warning correctly in C is hard, so we follow GCC's
3801 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3802 // a non-const char* in C, rather than using this crude hack.
3803 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003804 // FIXME: This should behave just like a warning flag, and thus should also
3805 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3806 Arg *WriteStrings =
3807 Args.getLastArg(options::OPT_Wwrite_strings,
3808 options::OPT_Wno_write_strings, options::OPT_w);
3809 if (WriteStrings &&
3810 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003811 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003812 }
3813
Chandler Carruth61fbf622011-04-23 09:27:53 +00003814 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003815 // during C++ compilation, which it is by default. GCC keeps this define even
3816 // in the presence of '-w', match this behavior bug-for-bug.
3817 if (types::isCXX(InputType) &&
3818 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3819 true)) {
3820 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003821 }
3822
Chandler Carruthe0391482010-05-22 02:21:53 +00003823 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3824 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3825 if (Asm->getOption().matches(options::OPT_fasm))
3826 CmdArgs.push_back("-fgnu-keywords");
3827 else
3828 CmdArgs.push_back("-fno-gnu-keywords");
3829 }
3830
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003831 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3832 CmdArgs.push_back("-fno-dwarf-directory-asm");
3833
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003834 if (ShouldDisableAutolink(Args, getToolChain()))
3835 CmdArgs.push_back("-fno-autolink");
3836
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003837 // Add in -fdebug-compilation-dir if necessary.
3838 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003839
Richard Smith9a568822011-11-21 19:36:32 +00003840 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3841 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003842 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003843 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003844 }
3845
Richard Smith79c927b2013-11-06 19:31:51 +00003846 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3847 CmdArgs.push_back("-foperator-arrow-depth");
3848 CmdArgs.push_back(A->getValue());
3849 }
3850
Richard Smith9a568822011-11-21 19:36:32 +00003851 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3852 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003853 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003854 }
3855
Richard Smitha3d3bd22013-05-08 02:12:03 +00003856 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3857 CmdArgs.push_back("-fconstexpr-steps");
3858 CmdArgs.push_back(A->getValue());
3859 }
3860
Richard Smithb3a14522013-02-22 01:59:51 +00003861 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3862 CmdArgs.push_back("-fbracket-depth");
3863 CmdArgs.push_back(A->getValue());
3864 }
3865
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003866 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3867 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003868 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003869 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003870 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3871 } else
3872 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003873 }
3874
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003875 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003876 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003877
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003878 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3879 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003880 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003881 }
David Chisnall5778fce2009-08-31 16:41:57 +00003882
Chris Lattnere23003d2010-01-09 21:54:33 +00003883 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3884 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003885 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003886 }
3887
Chris Lattnerb35583d2010-04-07 20:49:23 +00003888 CmdArgs.push_back("-ferror-limit");
3889 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003890 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003891 else
3892 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003893
Chandler Carrutha77a7272010-05-06 04:55:18 +00003894 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3895 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003896 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003897 }
3898
3899 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3900 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003901 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003902 }
3903
Richard Smithf6f003a2011-12-16 19:06:07 +00003904 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3905 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003906 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003907 }
3908
Nick Lewycky24653262014-12-16 21:39:02 +00003909 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3910 CmdArgs.push_back("-fspell-checking-limit");
3911 CmdArgs.push_back(A->getValue());
3912 }
3913
Daniel Dunbar2c978472009-11-04 06:24:47 +00003914 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003915 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003916 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003917 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003918 } else {
3919 // If -fmessage-length=N was not specified, determine whether this is a
3920 // terminal and, if so, implicitly define -fmessage-length appropriately.
3921 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003922 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003923 }
3924
John McCallb4a99d32013-02-19 01:57:35 +00003925 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3926 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3927 options::OPT_fvisibility_ms_compat)) {
3928 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3929 CmdArgs.push_back("-fvisibility");
3930 CmdArgs.push_back(A->getValue());
3931 } else {
3932 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3933 CmdArgs.push_back("-fvisibility");
3934 CmdArgs.push_back("hidden");
3935 CmdArgs.push_back("-ftype-visibility");
3936 CmdArgs.push_back("default");
3937 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003938 }
3939
Douglas Gregor08329632010-06-15 17:05:35 +00003940 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003941
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003942 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3943
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003944 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003945 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3946 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003947 CmdArgs.push_back("-ffreestanding");
3948
Daniel Dunbare357d562009-12-03 18:42:11 +00003949 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003950 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003951 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003952 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3953 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003954 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003955 // AltiVec language extensions aren't relevant for assembling.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003956 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm)
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003957 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003958 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3959 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003960
Alexey Bataevdb390212015-05-20 04:24:19 +00003961 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003962 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3963 options::OPT_fno_openmp, false))
3964 switch (getOpenMPRuntime(getToolChain(), Args)) {
3965 case OMPRT_OMP:
3966 case OMPRT_IOMP5:
3967 // Clang can generate useful OpenMP code for these two runtime libraries.
3968 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00003969
3970 // If no option regarding the use of TLS in OpenMP codegeneration is
3971 // given, decide a default based on the target. Otherwise rely on the
3972 // options and pass the right information to the frontend.
3973 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
3974 options::OPT_fnoopenmp_use_tls,
3975 getToolChain().getArch() == llvm::Triple::ppc ||
3976 getToolChain().getArch() == llvm::Triple::ppc64 ||
3977 getToolChain().getArch() == llvm::Triple::ppc64le))
3978 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003979 break;
3980 default:
3981 // By default, if Clang doesn't know how to generate useful OpenMP code
3982 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3983 // down to the actual compilation.
3984 // FIXME: It would be better to have a mode which *only* omits IR
3985 // generation based on the OpenMP support so that we get consistent
3986 // semantic analysis, etc.
3987 break;
3988 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003989
Peter Collingbourne32701642013-11-01 18:16:25 +00003990 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00003991 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00003992
Eric Christopher459d2712013-02-19 06:16:53 +00003993 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003994 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
3995 const llvm::Triple::ArchType Arch = getToolChain().getArch();
3996 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
3997 Arch == llvm::Triple::ppc64le))
3998 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3999 << "ppc/ppc64/ppc64le";
4000 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004001
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004002 if (getToolChain().SupportsProfiling())
4003 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004004
4005 // -flax-vector-conversions is default.
4006 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4007 options::OPT_fno_lax_vector_conversions))
4008 CmdArgs.push_back("-fno-lax-vector-conversions");
4009
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004010 if (Args.getLastArg(options::OPT_fapple_kext))
4011 CmdArgs.push_back("-fapple-kext");
4012
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004013 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004014 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004015 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004016 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4017 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004018
4019 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4020 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004021 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004022 }
4023
Bob Wilson14adb362012-02-03 06:27:22 +00004024 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004025
Chandler Carruth6e501032011-03-27 00:04:55 +00004026 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4027 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004028 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004029 if (A->getOption().matches(options::OPT_fwrapv))
4030 CmdArgs.push_back("-fwrapv");
4031 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4032 options::OPT_fno_strict_overflow)) {
4033 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4034 CmdArgs.push_back("-fwrapv");
4035 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004036
4037 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4038 options::OPT_fno_reroll_loops))
4039 if (A->getOption().matches(options::OPT_freroll_loops))
4040 CmdArgs.push_back("-freroll-loops");
4041
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004042 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004043 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4044 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004045
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004046 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4047
Daniel Dunbar4930e332009-11-17 08:07:36 +00004048 // -stack-protector=0 is default.
4049 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004050 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4051 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4052 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4053 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4054 Args.ClaimAllArgs(options::OPT_fstack_protector);
4055 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004056 options::OPT_fstack_protector_all,
4057 options::OPT_fstack_protector_strong,
4058 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004059 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004060 StackProtectorLevel = std::max<unsigned>(
4061 LangOptions::SSPOn,
4062 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004063 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004064 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004065 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004066 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004067 } else {
4068 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004069 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004070 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004071 if (StackProtectorLevel) {
4072 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004073 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004074 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004075
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004076 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004077 for (const Arg *A : Args.filtered(options::OPT__param)) {
4078 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004079 if (Str.startswith("ssp-buffer-size=")) {
4080 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004081 CmdArgs.push_back("-stack-protector-buffer-size");
4082 // FIXME: Verify the argument is a valid integer.
4083 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004084 }
Sean Silva14facf32015-06-09 01:57:17 +00004085 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004086 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004087 }
4088
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004089 // Translate -mstackrealign
4090 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4091 false)) {
4092 CmdArgs.push_back("-backend-option");
4093 CmdArgs.push_back("-force-align-stack");
4094 }
4095 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004096 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004097 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4098 }
4099
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004100 if (Args.hasArg(options::OPT_mstack_alignment)) {
4101 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4102 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004103 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004104
Hans Wennborg77dc2362015-01-20 19:45:50 +00004105 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4106 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4107
4108 if (!Size.empty())
4109 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4110 else
4111 CmdArgs.push_back("-mstack-probe-size=0");
4112 }
4113
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004114 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4115 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004116 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4117
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004118 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4119 options::OPT_mno_restrict_it)) {
4120 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4121 CmdArgs.push_back("-backend-option");
4122 CmdArgs.push_back("-arm-restrict-it");
4123 } else {
4124 CmdArgs.push_back("-backend-option");
4125 CmdArgs.push_back("-arm-no-restrict-it");
4126 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004127 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4128 TT.getArch() == llvm::Triple::thumb)) {
4129 // Windows on ARM expects restricted IT blocks
4130 CmdArgs.push_back("-backend-option");
4131 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004132 }
4133
Daniel Dunbard18049a2009-04-07 21:16:11 +00004134 // Forward -f options with positive and negative forms; we translate
4135 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004136 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4137 StringRef fname = A->getValue();
4138 if (!llvm::sys::fs::exists(fname))
4139 D.Diag(diag::err_drv_no_such_file) << fname;
4140 else
4141 A->render(Args, CmdArgs);
4142 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004143
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004144 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004145 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004146 CmdArgs.push_back("-fapple-kext");
4147 if (!Args.hasArg(options::OPT_fbuiltin))
4148 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004149 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004150 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004151 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004152 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004153 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004154
Nuno Lopes13c88c72009-12-16 16:59:22 +00004155 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4156 options::OPT_fno_assume_sane_operator_new))
4157 CmdArgs.push_back("-fno-assume-sane-operator-new");
4158
Daniel Dunbar4930e332009-11-17 08:07:36 +00004159 // -fblocks=0 is default.
4160 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004161 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004162 (Args.hasArg(options::OPT_fgnu_runtime) &&
4163 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4164 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004165 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004166
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004167 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004168 !getToolChain().hasBlocksRuntime())
4169 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004170 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004171
Richard Smith47972af2015-06-16 00:08:24 +00004172 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004173 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004174 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004175 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004176 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004177 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4178 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004179 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004180 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004181 HaveModules = true;
4182 }
4183 }
4184
Richard Smith47972af2015-06-16 00:08:24 +00004185 // -fmodule-maps enables implicit reading of module map files. By default,
4186 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004187 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4188 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004189 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004190 }
4191
Daniel Jasperac42b752013-10-21 06:34:34 +00004192 // -fmodules-decluse checks that modules used are declared so (off by
4193 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004194 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004195 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004196 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004197 }
4198
Daniel Jasper962b38e2014-04-11 11:47:45 +00004199 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4200 // all #included headers are part of modules.
4201 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004202 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004203 CmdArgs.push_back("-fmodules-strict-decluse");
4204 }
4205
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004206 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4207 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4208 options::OPT_fno_implicit_modules)) {
4209 CmdArgs.push_back("-fno-implicit-modules");
4210 }
4211
Daniel Jasperac42b752013-10-21 06:34:34 +00004212 // -fmodule-name specifies the module that is currently being built (or
4213 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004214 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004215
Richard Smith9887d792014-10-17 01:42:53 +00004216 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004217 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004218 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004219
Richard Smithe842a472014-10-22 02:05:46 +00004220 // -fmodule-file can be used to specify files containing precompiled modules.
4221 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4222
4223 // -fmodule-cache-path specifies where our implicitly-built module files
4224 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004225 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004226 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004227 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004228 if (HaveModules) {
4229 if (C.isForDiagnostics()) {
4230 // When generating crash reports, we want to emit the modules along with
4231 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004232 Path = Output.getFilename();
4233 llvm::sys::path::replace_extension(Path, ".cache");
4234 llvm::sys::path::append(Path, "modules");
4235 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004236 // No module path was provided: use the default.
4237 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
Daniel Jasper7450f912015-07-10 08:25:54 +00004238 Path);
4239 llvm::sys::path::append(Path, "org.llvm.clang.");
4240 appendUserToPath(Path);
4241 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004242 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004243 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004244 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4245 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004246 }
4247
4248 // When building modules and generating crashdumps, we need to dump a module
4249 // dependency VFS alongside the output.
4250 if (HaveModules && C.isForDiagnostics()) {
4251 SmallString<128> VFSDir(Output.getFilename());
4252 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004253 // Add the cache directory as a temp so the crash diagnostics pick it up.
4254 C.addTempFile(Args.MakeArgString(VFSDir));
4255
Justin Bognera88f0122014-06-20 22:59:50 +00004256 llvm::sys::path::append(VFSDir, "vfs");
4257 CmdArgs.push_back("-module-dependency-dir");
4258 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004259 }
4260
Richard Smith9887d792014-10-17 01:42:53 +00004261 if (HaveModules)
4262 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004263
Douglas Gregor35b04d62013-02-07 19:01:24 +00004264 // Pass through all -fmodules-ignore-macro arguments.
4265 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004266 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4267 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004268
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004269 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4270
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004271 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4272 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4273 D.Diag(diag::err_drv_argument_not_allowed_with)
4274 << A->getAsString(Args) << "-fbuild-session-timestamp";
4275
4276 llvm::sys::fs::file_status Status;
4277 if (llvm::sys::fs::status(A->getValue(), Status))
4278 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004279 CmdArgs.push_back(Args.MakeArgString(
4280 "-fbuild-session-timestamp=" +
4281 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004282 }
4283
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004284 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004285 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4286 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004287 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4288
4289 Args.AddLastArg(CmdArgs,
4290 options::OPT_fmodules_validate_once_per_build_session);
4291 }
4292
Ben Langmuirdcf73862014-03-12 00:06:17 +00004293 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4294
John McCalldfea9982010-04-09 19:12:06 +00004295 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004296 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004297 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004298 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004299
Anders Carlssond470fef2010-11-21 00:09:52 +00004300 // -felide-constructors is the default.
4301 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004302 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004303 CmdArgs.push_back("-fno-elide-constructors");
4304
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004305 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004306
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004307 if (KernelOrKext || (types::isCXX(InputType) &&
4308 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4309 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004310 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004311
Tony Linthicum76329bf2011-12-12 21:14:55 +00004312 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004313 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4314 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004315 CmdArgs.push_back("-fshort-enums");
4316
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004317 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004318 if (Arg *A = Args.getLastArg(
4319 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4320 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4321 if (A->getOption().matches(options::OPT_funsigned_char) ||
4322 A->getOption().matches(options::OPT_fno_signed_char)) {
4323 CmdArgs.push_back("-fno-signed-char");
4324 }
4325 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004326 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004327 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004328
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004329 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004330 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4331 options::OPT_fno_use_cxa_atexit,
4332 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004333 getToolChain().getArch() != llvm::Triple::hexagon &&
4334 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004335 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004336 CmdArgs.push_back("-fno-use-cxa-atexit");
4337
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004338 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004339 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004340 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004341 CmdArgs.push_back("-fms-extensions");
4342
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004343 // -fno-use-line-directives is default.
4344 if (Args.hasFlag(options::OPT_fuse_line_directives,
4345 options::OPT_fno_use_line_directives, false))
4346 CmdArgs.push_back("-fuse-line-directives");
4347
Francois Pichet1b4f1632011-09-17 04:32:15 +00004348 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004349 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004350 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004351 (IsWindowsMSVC &&
4352 Args.hasFlag(options::OPT_fms_extensions,
4353 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004354 CmdArgs.push_back("-fms-compatibility");
4355
David Majnemerc371ff02015-03-22 08:39:22 +00004356 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004357 VersionTuple MSVT = visualstudio::getMSVCVersion(
4358 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4359 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004360 CmdArgs.push_back(
4361 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004362
David Majnemer8db91762015-05-18 04:49:30 +00004363 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4364 if (ImplyVCPPCXXVer) {
4365 if (IsMSVC2015Compatible)
4366 CmdArgs.push_back("-std=c++14");
4367 else
4368 CmdArgs.push_back("-std=c++11");
4369 }
4370
Eric Christopher5ecce122013-02-18 00:38:31 +00004371 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004372 if (Args.hasFlag(options::OPT_fborland_extensions,
4373 options::OPT_fno_borland_extensions, false))
4374 CmdArgs.push_back("-fborland-extensions");
4375
David Majnemerc371ff02015-03-22 08:39:22 +00004376 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4377 // than 19.
4378 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4379 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004380 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004381 CmdArgs.push_back("-fno-threadsafe-statics");
4382
Francois Pichet02744872011-09-01 16:38:08 +00004383 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4384 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004385 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004386 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004387 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004388
Chandler Carruthe03aa552010-04-17 20:17:31 +00004389 // -fgnu-keywords default varies depending on language; only pass if
4390 // specified.
4391 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004392 options::OPT_fno_gnu_keywords))
4393 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004394
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004395 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004396 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004397 CmdArgs.push_back("-fgnu89-inline");
4398
Chad Rosier9c76d242012-03-15 22:31:42 +00004399 if (Args.hasArg(options::OPT_fno_inline))
4400 CmdArgs.push_back("-fno-inline");
4401
Chad Rosier64d6be92012-03-06 21:17:19 +00004402 if (Args.hasArg(options::OPT_fno_inline_functions))
4403 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004404
John McCall5fb5df92012-06-20 06:18:46 +00004405 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004406
John McCall5fb5df92012-06-20 06:18:46 +00004407 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004408 // legacy is the default. Except for deployment taget of 10.5,
4409 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4410 // gets ignored silently.
4411 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004412 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4413 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004414 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004415 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004416 if (getToolChain().UseObjCMixedDispatch())
4417 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4418 else
4419 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4420 }
4421 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004422
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004423 // When ObjectiveC legacy runtime is in effect on MacOSX,
4424 // turn on the option to do Array/Dictionary subscripting
4425 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004426 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004427 getToolChain().getTriple().isMacOSX() &&
4428 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4429 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004430 objcRuntime.isNeXTFamily())
4431 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004432
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004433 // -fencode-extended-block-signature=1 is default.
4434 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4435 CmdArgs.push_back("-fencode-extended-block-signature");
4436 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004437
John McCall24fc0de2011-07-06 00:26:06 +00004438 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4439 // NOTE: This logic is duplicated in ToolChains.cpp.
4440 bool ARC = isObjCAutoRefCount(Args);
4441 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004442 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004443
John McCall24fc0de2011-07-06 00:26:06 +00004444 CmdArgs.push_back("-fobjc-arc");
4445
Chandler Carruth491db322011-11-04 07:34:47 +00004446 // FIXME: It seems like this entire block, and several around it should be
4447 // wrapped in isObjC, but for now we just use it here as this is where it
4448 // was being used previously.
4449 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4450 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4451 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4452 else
4453 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4454 }
4455
John McCall24fc0de2011-07-06 00:26:06 +00004456 // Allow the user to enable full exceptions code emission.
4457 // We define off for Objective-CC, on for Objective-C++.
4458 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4459 options::OPT_fno_objc_arc_exceptions,
4460 /*default*/ types::isCXX(InputType)))
4461 CmdArgs.push_back("-fobjc-arc-exceptions");
4462 }
4463
4464 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4465 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004466 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004467 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004468
John McCall24fc0de2011-07-06 00:26:06 +00004469 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4470 // takes precedence.
4471 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4472 if (!GCArg)
4473 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4474 if (GCArg) {
4475 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004476 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004477 } else if (getToolChain().SupportsObjCGC()) {
4478 GCArg->render(Args, CmdArgs);
4479 } else {
4480 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004481 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004482 }
4483 }
4484
Bob Wilsonb111ec92015-03-02 19:01:14 +00004485 if (Args.hasFlag(options::OPT_fapplication_extension,
4486 options::OPT_fno_application_extension, false))
4487 CmdArgs.push_back("-fapplication-extension");
4488
Reid Klecknerc542d372014-06-27 17:02:02 +00004489 // Handle GCC-style exception args.
4490 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004491 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4492 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004493
4494 if (getToolChain().UseSjLjExceptions())
4495 CmdArgs.push_back("-fsjlj-exceptions");
4496
4497 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004498 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4499 options::OPT_fno_assume_sane_operator_new))
4500 CmdArgs.push_back("-fno-assume-sane-operator-new");
4501
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004502 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4503 // most platforms.
4504 if (Args.hasFlag(options::OPT_fsized_deallocation,
4505 options::OPT_fno_sized_deallocation, false))
4506 CmdArgs.push_back("-fsized-deallocation");
4507
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004508 // -fconstant-cfstrings is default, and may be subject to argument translation
4509 // on Darwin.
4510 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4511 options::OPT_fno_constant_cfstrings) ||
4512 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4513 options::OPT_mno_constant_cfstrings))
4514 CmdArgs.push_back("-fno-constant-cfstrings");
4515
John Thompsoned4e2952009-11-05 20:14:16 +00004516 // -fshort-wchar default varies depending on platform; only
4517 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004518 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4519 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004520 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004521
Hans Wennborg28c96312013-07-31 23:39:13 +00004522 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004523 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004524 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004525 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004526
Daniel Dunbar096ed292011-10-05 21:04:55 +00004527 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4528 // -fno-pack-struct doesn't apply to -fpack-struct=.
4529 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004530 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004531 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004532 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004533 } else if (Args.hasFlag(options::OPT_fpack_struct,
4534 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004535 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004536 }
4537
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004538 // Handle -fmax-type-align=N and -fno-type-align
4539 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4540 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4541 if (!SkipMaxTypeAlign) {
4542 std::string MaxTypeAlignStr = "-fmax-type-align=";
4543 MaxTypeAlignStr += A->getValue();
4544 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4545 }
4546 } else if (getToolChain().getTriple().isOSDarwin()) {
4547 if (!SkipMaxTypeAlign) {
4548 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4549 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4550 }
4551 }
4552
Robert Lytton0e076492013-08-13 09:43:10 +00004553 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004554 if (!Args.hasArg(options::OPT_fcommon))
4555 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004556 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004557 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004558
Daniel Dunbard18049a2009-04-07 21:16:11 +00004559 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004560 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004561 CmdArgs.push_back("-fno-common");
4562
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004563 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004564 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004565 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004566 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004567 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004568 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004569
Daniel Dunbar6358d682010-10-15 22:30:42 +00004570 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004571 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004572 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004573 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004574
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004575 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004576 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4577 StringRef value = inputCharset->getValue();
4578 if (value != "UTF-8")
4579 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4580 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004581 }
4582
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004583 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004584 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4585 StringRef value = execCharset->getValue();
4586 if (value != "UTF-8")
4587 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4588 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004589 }
4590
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004591 // -fcaret-diagnostics is default.
4592 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4593 options::OPT_fno_caret_diagnostics, true))
4594 CmdArgs.push_back("-fno-caret-diagnostics");
4595
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004596 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004597 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004598 options::OPT_fno_diagnostics_fixit_info))
4599 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004600
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004601 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004602 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004603 options::OPT_fno_diagnostics_show_option))
4604 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004605
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004606 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004607 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004608 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004609 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004610 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004612 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004613 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004614 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004615 }
4616
Chandler Carruthb6766f02011-03-27 01:50:55 +00004617 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004618 options::OPT_fdiagnostics_show_note_include_stack,
4619 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004620 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004621 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004622 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4623 else
4624 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4625 }
4626
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004627 // Color diagnostics are the default, unless the terminal doesn't support
4628 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004629 // Support both clang's -f[no-]color-diagnostics and gcc's
4630 // -f[no-]diagnostics-colors[=never|always|auto].
4631 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004632 for (const auto &Arg : Args) {
4633 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004634 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4635 !O.matches(options::OPT_fdiagnostics_color) &&
4636 !O.matches(options::OPT_fno_color_diagnostics) &&
4637 !O.matches(options::OPT_fno_diagnostics_color) &&
4638 !O.matches(options::OPT_fdiagnostics_color_EQ))
4639 continue;
4640
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004641 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004642 if (O.matches(options::OPT_fcolor_diagnostics) ||
4643 O.matches(options::OPT_fdiagnostics_color)) {
4644 ShowColors = Colors_On;
4645 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4646 O.matches(options::OPT_fno_diagnostics_color)) {
4647 ShowColors = Colors_Off;
4648 } else {
4649 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004650 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004651 if (value == "always")
4652 ShowColors = Colors_On;
4653 else if (value == "never")
4654 ShowColors = Colors_Off;
4655 else if (value == "auto")
4656 ShowColors = Colors_Auto;
4657 else
4658 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004659 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004660 }
4661 }
4662 if (ShowColors == Colors_On ||
4663 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004664 CmdArgs.push_back("-fcolor-diagnostics");
4665
Nico Rieck7857d462013-09-11 00:38:02 +00004666 if (Args.hasArg(options::OPT_fansi_escape_codes))
4667 CmdArgs.push_back("-fansi-escape-codes");
4668
Daniel Dunbardb097022009-06-08 21:13:54 +00004669 if (!Args.hasFlag(options::OPT_fshow_source_location,
4670 options::OPT_fno_show_source_location))
4671 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004672
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004673 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004674 true))
4675 CmdArgs.push_back("-fno-show-column");
4676
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004677 if (!Args.hasFlag(options::OPT_fspell_checking,
4678 options::OPT_fno_spell_checking))
4679 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004680
Chad Rosierc8e56e82012-12-05 21:08:21 +00004681 // -fno-asm-blocks is default.
4682 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4683 false))
4684 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004685
Steven Wucb0d13f2015-01-16 23:05:28 +00004686 // -fgnu-inline-asm is default.
4687 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4688 options::OPT_fno_gnu_inline_asm, true))
4689 CmdArgs.push_back("-fno-gnu-inline-asm");
4690
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004691 // Enable vectorization per default according to the optimization level
4692 // selected. For optimization levels that want vectorization we use the alias
4693 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004694 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004695 OptSpecifier VectorizeAliasOption =
4696 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004697 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004698 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004699 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004700
Chad Rosier136d67d2014-04-28 19:30:57 +00004701 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004702 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004703 OptSpecifier SLPVectAliasOption =
4704 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004705 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004706 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004707 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004708
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004709 // -fno-slp-vectorize-aggressive is default.
4710 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004711 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004712 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004713
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004714 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4715 A->render(Args, CmdArgs);
4716
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004717 // -fdollars-in-identifiers default varies depending on platform and
4718 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004719 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004720 options::OPT_fno_dollars_in_identifiers)) {
4721 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004722 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004723 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004724 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004725 }
4726
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004727 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4728 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004729 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004730 options::OPT_fno_unit_at_a_time)) {
4731 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004732 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004733 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004734
Eli Friedman055c9702011-11-02 01:53:16 +00004735 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4736 options::OPT_fno_apple_pragma_pack, false))
4737 CmdArgs.push_back("-fapple-pragma-pack");
4738
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004739 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004740 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4741 // by default.
4742 if (getToolChain().getArch() == llvm::Triple::le32) {
4743 CmdArgs.push_back("-fno-math-builtin");
4744 }
4745
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004746// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4747//
4748// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004749#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004750 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004751 (getToolChain().getArch() == llvm::Triple::arm ||
4752 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004753 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4754 CmdArgs.push_back("-fno-builtin-strcat");
4755 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4756 CmdArgs.push_back("-fno-builtin-strcpy");
4757 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004758#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004759
Justin Bognera88f0122014-06-20 22:59:50 +00004760 // Enable rewrite includes if the user's asked for it or if we're generating
4761 // diagnostics.
4762 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4763 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004764 if (Args.hasFlag(options::OPT_frewrite_includes,
4765 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004766 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004767 CmdArgs.push_back("-frewrite-includes");
4768
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004769 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004770 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004771 options::OPT_traditional_cpp)) {
4772 if (isa<PreprocessJobAction>(JA))
4773 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004774 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004775 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004776 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004777
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004778 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004779 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004780
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004781 // Handle serialized diagnostics.
4782 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4783 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004784 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004785 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004786
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004787 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4788 CmdArgs.push_back("-fretain-comments-from-system-headers");
4789
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004790 // Forward -fcomment-block-commands to -cc1.
4791 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004792 // Forward -fparse-all-comments to -cc1.
4793 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004794
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004795 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4796 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004797 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004798 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4799 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004800
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004801 // We translate this by hand to the -cc1 argument, since nightly test uses
4802 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004803 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004804 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004805 } else
Sean Silva14facf32015-06-09 01:57:17 +00004806 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004807 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004808
Bob Wilson23a55f12014-12-21 07:00:00 +00004809 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004810 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4811 // by the frontend.
4812 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4813 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004814
Daniel Dunbard67a3222009-03-30 06:36:42 +00004815 if (Output.getType() == types::TY_Dependencies) {
4816 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004817 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004818 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004819 CmdArgs.push_back(Output.getFilename());
4820 } else {
4821 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004822 }
4823
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004824 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004825
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004826 if (Input.isFilename())
4827 CmdArgs.push_back(Input.getFilename());
4828 else
4829 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004830
Chris Lattnere9d7d782009-11-03 19:50:27 +00004831 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4832
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004833 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004834
4835 // Optionally embed the -cc1 level arguments into the debug info, for build
4836 // analysis.
4837 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004838 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004839 for (const auto &Arg : Args)
4840 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004841
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004842 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004843 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004844 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004845 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004846 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004847 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004848 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004849 }
4850 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004851 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004852 }
4853
Eric Christopherd3804002013-02-22 20:12:52 +00004854 // Add the split debug info name to the command lines here so we
4855 // can propagate it to the backend.
4856 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 getToolChain().getTriple().isOSLinux() &&
4858 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4859 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004860 const char *SplitDwarfOut;
4861 if (SplitDwarf) {
4862 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004863 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004864 CmdArgs.push_back(SplitDwarfOut);
4865 }
4866
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004867 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
4868 // Include them with -fcuda-include-gpubinary.
4869 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00004870 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004871 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00004872 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004873 }
4874
Eric Christopherd3804002013-02-22 20:12:52 +00004875 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004876 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004877 Output.getType() == types::TY_Object &&
4878 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004879 auto CLCommand =
4880 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00004881 C.addCommand(llvm::make_unique<FallbackCommand>(
4882 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004883 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00004884 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004885 }
4886
Eric Christopherf1545832013-02-22 23:50:16 +00004887 // Handle the debug info splitting at object creation time if we're
4888 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004889 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004890 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004891 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004892
Roman Divacky178e01602011-02-10 16:52:03 +00004893 if (Arg *A = Args.getLastArg(options::OPT_pg))
4894 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004895 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
4896 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004897
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004898 // Claim some arguments which clang supports automatically.
4899
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004900 // -fpch-preprocess is used with gcc to add a special marker in the output to
4901 // include the PCH file. Clang's PTH solution is completely transparent, so we
4902 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004903 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004904
Daniel Dunbar17731772009-03-23 19:03:36 +00004905 // Claim some arguments which clang doesn't support, but we don't
4906 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004907 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4908 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004909
Rafael Espindolab0092d72013-09-04 19:37:35 +00004910 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004911 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004912}
4913
John McCall5fb5df92012-06-20 06:18:46 +00004914/// Add options related to the Objective-C runtime/ABI.
4915///
4916/// Returns true if the runtime is non-fragile.
4917ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4918 ArgStringList &cmdArgs,
4919 RewriteKind rewriteKind) const {
4920 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004921 Arg *runtimeArg =
4922 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
4923 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00004924
4925 // Just forward -fobjc-runtime= to the frontend. This supercedes
4926 // options about fragility.
4927 if (runtimeArg &&
4928 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4929 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004930 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004931 if (runtime.tryParse(value)) {
4932 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004933 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004934 }
4935
4936 runtimeArg->render(args, cmdArgs);
4937 return runtime;
4938 }
4939
4940 // Otherwise, we'll need the ABI "version". Version numbers are
4941 // slightly confusing for historical reasons:
4942 // 1 - Traditional "fragile" ABI
4943 // 2 - Non-fragile ABI, version 1
4944 // 3 - Non-fragile ABI, version 2
4945 unsigned objcABIVersion = 1;
4946 // If -fobjc-abi-version= is present, use that to set the version.
4947 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004948 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004949 if (value == "1")
4950 objcABIVersion = 1;
4951 else if (value == "2")
4952 objcABIVersion = 2;
4953 else if (value == "3")
4954 objcABIVersion = 3;
4955 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004956 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00004957 } else {
4958 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004959 bool nonFragileABIIsDefault =
4960 (rewriteKind == RK_NonFragile ||
4961 (rewriteKind == RK_None &&
4962 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00004963 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4964 options::OPT_fno_objc_nonfragile_abi,
4965 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004966// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00004967#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4968 unsigned nonFragileABIVersion = 1;
4969#else
4970 unsigned nonFragileABIVersion = 2;
4971#endif
4972
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004973 if (Arg *abiArg =
4974 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004975 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004976 if (value == "1")
4977 nonFragileABIVersion = 1;
4978 else if (value == "2")
4979 nonFragileABIVersion = 2;
4980 else
4981 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004982 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004983 }
4984
4985 objcABIVersion = 1 + nonFragileABIVersion;
4986 } else {
4987 objcABIVersion = 1;
4988 }
4989 }
4990
4991 // We don't actually care about the ABI version other than whether
4992 // it's non-fragile.
4993 bool isNonFragile = objcABIVersion != 1;
4994
4995 // If we have no runtime argument, ask the toolchain for its default runtime.
4996 // However, the rewriter only really supports the Mac runtime, so assume that.
4997 ObjCRuntime runtime;
4998 if (!runtimeArg) {
4999 switch (rewriteKind) {
5000 case RK_None:
5001 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5002 break;
5003 case RK_Fragile:
5004 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5005 break;
5006 case RK_NonFragile:
5007 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5008 break;
5009 }
5010
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005011 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005012 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5013 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005014 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005015 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5016
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005017 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005018 } else {
5019 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5020 }
5021
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005022 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005023 } else {
5024 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005025 // Legacy behaviour is to target the gnustep runtime if we are i
5026 // non-fragile mode or the GCC runtime in fragile mode.
5027 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005028 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005029 else
5030 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005031 }
5032
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005033 cmdArgs.push_back(
5034 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005035 return runtime;
5036}
5037
Reid Klecknerc542d372014-06-27 17:02:02 +00005038static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5039 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5040 I += HaveDash;
5041 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005042}
Reid Klecknerc542d372014-06-27 17:02:02 +00005043
5044struct EHFlags {
5045 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5046 bool Synch;
5047 bool Asynch;
5048 bool NoExceptC;
5049};
5050
5051/// /EH controls whether to run destructor cleanups when exceptions are
5052/// thrown. There are three modifiers:
5053/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5054/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5055/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5056/// - c: Assume that extern "C" functions are implicitly noexcept. This
5057/// modifier is an optimization, so we ignore it for now.
5058/// The default is /EHs-c-, meaning cleanups are disabled.
5059static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5060 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005061
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005062 std::vector<std::string> EHArgs =
5063 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005064 for (auto EHVal : EHArgs) {
5065 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5066 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005067 case 'a':
5068 EH.Asynch = maybeConsumeDash(EHVal, I);
5069 continue;
5070 case 'c':
5071 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5072 continue;
5073 case 's':
5074 EH.Synch = maybeConsumeDash(EHVal, I);
5075 continue;
5076 default:
5077 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005078 }
5079 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5080 break;
5081 }
5082 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005083
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005084 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5085 // can use -Xclang to manually enable C++ EH until then.
5086 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005087
Reid Klecknerc542d372014-06-27 17:02:02 +00005088 return EH;
5089}
5090
Hans Wennborg75958c42013-08-08 00:17:41 +00005091void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5092 unsigned RTOptionID = options::OPT__SLASH_MT;
5093
Hans Wennborgf1a74252013-09-10 20:18:04 +00005094 if (Args.hasArg(options::OPT__SLASH_LDd))
5095 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5096 // but defining _DEBUG is sticky.
5097 RTOptionID = options::OPT__SLASH_MTd;
5098
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005099 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005100 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005101
David Majnemere2afb472015-07-24 06:49:13 +00005102 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005103 switch (RTOptionID) {
5104 case options::OPT__SLASH_MD:
5105 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005106 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005107 CmdArgs.push_back("-D_MT");
5108 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005109 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005110 break;
5111 case options::OPT__SLASH_MDd:
5112 CmdArgs.push_back("-D_DEBUG");
5113 CmdArgs.push_back("-D_MT");
5114 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005115 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005116 break;
5117 case options::OPT__SLASH_MT:
5118 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005119 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005120 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005121 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005122 break;
5123 case options::OPT__SLASH_MTd:
5124 CmdArgs.push_back("-D_DEBUG");
5125 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005126 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005127 break;
5128 default:
5129 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005130 }
5131
David Majnemere2afb472015-07-24 06:49:13 +00005132 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5133 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5134 } else {
5135 CmdArgs.push_back(FlagForCRT.data());
5136
5137 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5138 // users want. The /Za flag to cl.exe turns this off, but it's not
5139 // implemented in clang.
5140 CmdArgs.push_back("--dependent-lib=oldnames");
5141 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005142
Hans Wennborg8858a032014-07-21 23:42:07 +00005143 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5144 // would produce interleaved output, so ignore /showIncludes in such cases.
5145 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5146 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5147 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005148
David Majnemerf6072342014-07-01 22:24:56 +00005149 // This controls whether or not we emit RTTI data for polymorphic types.
5150 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5151 /*default=*/false))
5152 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005153
Reid Klecknerc542d372014-06-27 17:02:02 +00005154 const Driver &D = getToolChain().getDriver();
5155 EHFlags EH = parseClangCLEHFlags(D, Args);
5156 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005157 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005158 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005159 CmdArgs.push_back("-fexceptions");
5160 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005161
Hans Wennborge50cec32014-06-13 20:59:54 +00005162 // /EP should expand to -E -P.
5163 if (Args.hasArg(options::OPT__SLASH_EP)) {
5164 CmdArgs.push_back("-E");
5165 CmdArgs.push_back("-P");
5166 }
5167
David Majnemera5b195a2015-02-14 01:35:12 +00005168 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005169 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5170 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005171 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5172 else
5173 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5174
5175 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5176 VolatileOptionID = A->getOption().getID();
5177
5178 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5179 CmdArgs.push_back("-fms-volatile");
5180
David Majnemer86c318f2014-02-11 21:05:00 +00005181 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5182 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5183 if (MostGeneralArg && BestCaseArg)
5184 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5185 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5186
5187 if (MostGeneralArg) {
5188 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5189 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5190 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5191
5192 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5193 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5194 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5195 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5196 << FirstConflict->getAsString(Args)
5197 << SecondConflict->getAsString(Args);
5198
5199 if (SingleArg)
5200 CmdArgs.push_back("-fms-memptr-rep=single");
5201 else if (MultipleArg)
5202 CmdArgs.push_back("-fms-memptr-rep=multiple");
5203 else
5204 CmdArgs.push_back("-fms-memptr-rep=virtual");
5205 }
5206
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005207 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5208 A->render(Args, CmdArgs);
5209
Hans Wennborg81f74482013-09-10 01:07:07 +00005210 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5211 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005212 if (Args.hasArg(options::OPT__SLASH_fallback))
5213 CmdArgs.push_back("msvc-fallback");
5214 else
5215 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005216 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005217}
5218
Douglas Katzman95354292015-06-23 20:42:09 +00005219visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005220 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005221 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005222 return CLFallback.get();
5223}
5224
Daniel Sanders7f933f42015-01-30 17:35:23 +00005225void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5226 ArgStringList &CmdArgs) const {
5227 StringRef CPUName;
5228 StringRef ABIName;
5229 const llvm::Triple &Triple = getToolChain().getTriple();
5230 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5231
5232 CmdArgs.push_back("-target-abi");
5233 CmdArgs.push_back(ABIName.data());
5234}
5235
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005236void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005237 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005238 const ArgList &Args,
5239 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005240 ArgStringList CmdArgs;
5241
5242 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5243 const InputInfo &Input = Inputs[0];
5244
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005245 // Don't warn about "clang -w -c foo.s"
5246 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005247 // and "clang -emit-llvm -c foo.s"
5248 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005249
Rafael Espindola577637a2015-01-03 00:06:04 +00005250 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005251
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005252 // Invoke ourselves in -cc1as mode.
5253 //
5254 // FIXME: Implement custom jobs for internal actions.
5255 CmdArgs.push_back("-cc1as");
5256
5257 // Add the "effective" target triple.
5258 CmdArgs.push_back("-triple");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005259 std::string TripleStr =
5260 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005261 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5262
5263 // Set the output mode, we currently only expect to be used as a real
5264 // assembler.
5265 CmdArgs.push_back("-filetype");
5266 CmdArgs.push_back("obj");
5267
Eric Christopher45f2e712012-12-18 00:31:10 +00005268 // Set the main file name, so that debug info works even with
5269 // -save-temps or preprocessed assembly.
5270 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005271 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005272
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005273 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005274 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005275 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005276 if (!CPU.empty()) {
5277 CmdArgs.push_back("-target-cpu");
5278 CmdArgs.push_back(Args.MakeArgString(CPU));
5279 }
5280
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005281 // Add the target features
5282 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005283 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005284
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005285 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005286 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005287
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005288 // Pass along any -I options so we get proper .include search paths.
5289 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5290
Eric Christopherfc3ee562012-01-10 00:38:01 +00005291 // Determine the original source input.
5292 const Action *SourceAction = &JA;
5293 while (SourceAction->getKind() != Action::InputClass) {
5294 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5295 SourceAction = SourceAction->getInputs()[0];
5296 }
5297
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005298 // Forward -g and handle debug info related flags, assuming we are dealing
5299 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005300 if (SourceAction->getType() == types::TY_Asm ||
5301 SourceAction->getType() == types::TY_PP_Asm) {
5302 Args.ClaimAllArgs(options::OPT_g_Group);
5303 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5304 if (!A->getOption().matches(options::OPT_g0))
5305 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005306
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005307 if (Args.hasArg(options::OPT_gdwarf_2))
5308 CmdArgs.push_back("-gdwarf-2");
5309 if (Args.hasArg(options::OPT_gdwarf_3))
5310 CmdArgs.push_back("-gdwarf-3");
5311 if (Args.hasArg(options::OPT_gdwarf_4))
5312 CmdArgs.push_back("-gdwarf-4");
5313
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005314 // Add the -fdebug-compilation-dir flag if needed.
5315 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005316
5317 // Set the AT_producer to the clang version when using the integrated
5318 // assembler on assembly source files.
5319 CmdArgs.push_back("-dwarf-debug-producer");
5320 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005321
5322 // And pass along -I options
5323 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005324 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005325
5326 // Optionally embed the -cc1as level arguments into the debug info, for build
5327 // analysis.
5328 if (getToolChain().UseDwarfDebugFlags()) {
5329 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005330 for (const auto &Arg : Args)
5331 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005332
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005333 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005334 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5335 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005336 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005337 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005338 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005339 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005340 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005341 }
5342 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005343 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005344 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005345
5346 // FIXME: Add -static support, once we have it.
5347
Daniel Sanders7f933f42015-01-30 17:35:23 +00005348 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005349 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005350 default:
5351 break;
5352
5353 case llvm::Triple::mips:
5354 case llvm::Triple::mipsel:
5355 case llvm::Triple::mips64:
5356 case llvm::Triple::mips64el:
5357 AddMIPSTargetArgs(Args, CmdArgs);
5358 break;
5359 }
5360
David Blaikie372d9502014-01-17 03:17:40 +00005361 // Consume all the warning flags. Usually this would be handled more
5362 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5363 // doesn't handle that so rather than warning about unused flags that are
5364 // actually used, we'll lie by omission instead.
5365 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005366 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5367 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005368
David Blaikie9260ed62013-07-25 21:19:01 +00005369 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5370 getToolChain().getDriver());
5371
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005372 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005373
5374 assert(Output.isFilename() && "Unexpected lipo output.");
5375 CmdArgs.push_back("-o");
5376 CmdArgs.push_back(Output.getFilename());
5377
Daniel Dunbarb440f562010-08-02 02:38:21 +00005378 assert(Input.isFilename() && "Invalid input.");
5379 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005380
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005381 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005382 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005383
5384 // Handle the debug info splitting at object creation time if we're
5385 // creating an object.
5386 // TODO: Currently only works on linux with newer objcopy.
5387 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005388 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005389 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005390 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005391}
5392
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005393void GnuTool::anchor() {}
5394
Daniel Dunbara3246a02009-03-18 08:07:30 +00005395void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005396 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005397 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005398 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005399 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005400 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005401
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005402 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005403 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005404 // Don't forward any -g arguments to assembly steps.
5405 if (isa<AssembleJobAction>(JA) &&
5406 A->getOption().matches(options::OPT_g_Group))
5407 continue;
5408
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005409 // Don't forward any -W arguments to assembly and link steps.
5410 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5411 A->getOption().matches(options::OPT_W_Group))
5412 continue;
5413
Daniel Dunbar2da02722009-03-19 07:55:12 +00005414 // It is unfortunate that we have to claim here, as this means
5415 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005416 // platforms using a generic gcc, even if we are just using gcc
5417 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005418 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005419 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005420 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005421 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005422
Daniel Dunbar4e295052010-01-25 22:35:08 +00005423 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005424
5425 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005426 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005427 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005428 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005430 }
5431
Daniel Dunbar5716d872009-05-02 21:41:52 +00005432 // Try to force gcc to match the tool chain we want, if we recognize
5433 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005434 //
5435 // FIXME: The triple class should directly provide the information we want
5436 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005437 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005438 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005439 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005440 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5441 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005442 CmdArgs.push_back("-m64");
5443
Daniel Dunbarb440f562010-08-02 02:38:21 +00005444 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005445 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005446 CmdArgs.push_back(Output.getFilename());
5447 } else {
5448 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005449 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005450 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005451
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005452 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005453
5454 // Only pass -x if gcc will understand it; otherwise hope gcc
5455 // understands the suffix correctly. The main use case this would go
5456 // wrong in is for linker inputs if they happened to have an odd
5457 // suffix; really the only way to get this to happen is a command
5458 // like '-x foobar a.c' which will treat a.c like a linker input.
5459 //
5460 // FIXME: For the linker case specifically, can we safely convert
5461 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005462 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005463 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005464 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5465 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005466 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005467 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005468 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005469 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005470 else if (II.getType() == types::TY_ModuleFile)
5471 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005472 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005473
Daniel Dunbara3246a02009-03-18 08:07:30 +00005474 if (types::canTypeBeUserSpecified(II.getType())) {
5475 CmdArgs.push_back("-x");
5476 CmdArgs.push_back(types::getTypeName(II.getType()));
5477 }
5478
Daniel Dunbarb440f562010-08-02 02:38:21 +00005479 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005480 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005481 else {
5482 const Arg &A = II.getInputArg();
5483
5484 // Reverse translate some rewritten options.
5485 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5486 CmdArgs.push_back("-lstdc++");
5487 continue;
5488 }
5489
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005490 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005491 A.render(Args, CmdArgs);
5492 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005493 }
5494
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005495 const std::string customGCCName = D.getCCCGenericGCCName();
5496 const char *GCCName;
5497 if (!customGCCName.empty())
5498 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005499 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005500 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005501 } else
5502 GCCName = "gcc";
5503
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005504 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005505 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005506}
5507
Douglas Katzman95354292015-06-23 20:42:09 +00005508void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5509 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005510 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005511}
5512
Douglas Katzman95354292015-06-23 20:42:09 +00005513void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5514 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005515 const Driver &D = getToolChain().getDriver();
5516
Eric Christophercc7ff502015-01-29 00:56:17 +00005517 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005518 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005519 case types::TY_LLVM_IR:
5520 case types::TY_LTO_IR:
5521 case types::TY_LLVM_BC:
5522 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005523 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005524 break;
5525 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005526 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005527 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005528 case types::TY_Nothing:
5529 CmdArgs.push_back("-fsyntax-only");
5530 break;
5531 default:
5532 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005533 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005534}
5535
Douglas Katzman95354292015-06-23 20:42:09 +00005536void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5537 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005538 // The types are (hopefully) good enough.
5539}
5540
Tony Linthicum76329bf2011-12-12 21:14:55 +00005541// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005542void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5543 ArgStringList &CmdArgs) const {}
5544void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5545 const InputInfo &Output,
5546 const InputInfoList &Inputs,
5547 const ArgList &Args,
5548 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005549 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005550
5551 const Driver &D = getToolChain().getDriver();
5552 ArgStringList CmdArgs;
5553
5554 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005555 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005556 CmdArgs.push_back(Args.MakeArgString(MarchString));
5557
5558 RenderExtraToolArgs(JA, CmdArgs);
5559
5560 if (Output.isFilename()) {
5561 CmdArgs.push_back("-o");
5562 CmdArgs.push_back(Output.getFilename());
5563 } else {
5564 assert(Output.isNothing() && "Unexpected output");
5565 CmdArgs.push_back("-fsyntax-only");
5566 }
5567
Douglas Katzman54366072015-07-27 16:53:08 +00005568 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005569 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005571 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005572
Tony Linthicum76329bf2011-12-12 21:14:55 +00005573 // Only pass -x if gcc will understand it; otherwise hope gcc
5574 // understands the suffix correctly. The main use case this would go
5575 // wrong in is for linker inputs if they happened to have an odd
5576 // suffix; really the only way to get this to happen is a command
5577 // like '-x foobar a.c' which will treat a.c like a linker input.
5578 //
5579 // FIXME: For the linker case specifically, can we safely convert
5580 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005581 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005582 // Don't try to pass LLVM or AST inputs to a generic gcc.
5583 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5584 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5585 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005586 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005587 else if (II.getType() == types::TY_AST)
5588 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005589 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005590 else if (II.getType() == types::TY_ModuleFile)
5591 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005592 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005593
5594 if (II.isFilename())
5595 CmdArgs.push_back(II.getFilename());
5596 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005597 // Don't render as input, we need gcc to do the translations.
5598 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005599 II.getInputArg().render(Args, CmdArgs);
5600 }
5601
5602 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005603 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005604 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005605}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005606
Douglas Katzman95354292015-06-23 20:42:09 +00005607void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5608 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005609 // The types are (hopefully) good enough.
5610}
5611
Douglas Katzman54366072015-07-27 16:53:08 +00005612static void
5613constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5614 const toolchains::HexagonToolChain &ToolChain,
5615 const InputInfo &Output, const InputInfoList &Inputs,
5616 const ArgList &Args, ArgStringList &CmdArgs,
5617 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005618
Matthew Curtise689b052012-12-06 15:46:07 +00005619 const Driver &D = ToolChain.getDriver();
5620
Matthew Curtise689b052012-12-06 15:46:07 +00005621 //----------------------------------------------------------------------------
5622 //
5623 //----------------------------------------------------------------------------
5624 bool hasStaticArg = Args.hasArg(options::OPT_static);
5625 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005626 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005627 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5628 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5629 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005630 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005631 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005632
Matthew Curtise689b052012-12-06 15:46:07 +00005633 //----------------------------------------------------------------------------
5634 // Silence warnings for various options
5635 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005636
Matthew Curtise689b052012-12-06 15:46:07 +00005637 Args.ClaimAllArgs(options::OPT_g_Group);
5638 Args.ClaimAllArgs(options::OPT_emit_llvm);
5639 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5640 // handled somewhere else.
5641 Args.ClaimAllArgs(options::OPT_static_libgcc);
5642
5643 //----------------------------------------------------------------------------
5644 //
5645 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005646 for (const auto &Opt : ToolChain.ExtraOpts)
5647 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005648
Douglas Katzman54366072015-07-27 16:53:08 +00005649 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005650 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005651
Matthew Curtise689b052012-12-06 15:46:07 +00005652 if (buildingLib) {
5653 CmdArgs.push_back("-shared");
5654 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5655 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005656 }
5657
Matthew Curtise689b052012-12-06 15:46:07 +00005658 if (hasStaticArg)
5659 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005660
Matthew Curtise8f80a12012-12-06 17:49:03 +00005661 if (buildPIE && !buildingLib)
5662 CmdArgs.push_back("-pie");
5663
Douglas Katzman54366072015-07-27 16:53:08 +00005664 if (const char *v =
5665 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005666 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005667 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005668 }
5669
Matthew Curtise689b052012-12-06 15:46:07 +00005670 //----------------------------------------------------------------------------
5671 //
5672 //----------------------------------------------------------------------------
5673 CmdArgs.push_back("-o");
5674 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005675
Matthew Curtise689b052012-12-06 15:46:07 +00005676 const std::string MarchSuffix = "/" + MarchString;
5677 const std::string G0Suffix = "/G0";
5678 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005679 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005680 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005681 const std::string StartFilesDir =
5682 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005683
5684 //----------------------------------------------------------------------------
5685 // moslib
5686 //----------------------------------------------------------------------------
5687 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005688 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005689
Sean Silva14facf32015-06-09 01:57:17 +00005690 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5691 A->claim();
5692 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005693 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005694 }
Matthew Curtise689b052012-12-06 15:46:07 +00005695 if (oslibs.empty()) {
5696 oslibs.push_back("standalone");
5697 hasStandalone = true;
5698 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005699
Matthew Curtise689b052012-12-06 15:46:07 +00005700 //----------------------------------------------------------------------------
5701 // Start Files
5702 //----------------------------------------------------------------------------
5703 if (incStdLib && incStartFiles) {
5704
5705 if (!buildingLib) {
5706 if (hasStandalone) {
5707 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005708 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005709 }
5710 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5711 }
5712 std::string initObj = useShared ? "/initS.o" : "/init.o";
5713 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5714 }
5715
5716 //----------------------------------------------------------------------------
5717 // Library Search Paths
5718 //----------------------------------------------------------------------------
5719 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005720 for (const auto &LibPath : LibPaths)
5721 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005722
5723 //----------------------------------------------------------------------------
5724 //
5725 //----------------------------------------------------------------------------
5726 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5727 Args.AddAllArgs(CmdArgs, options::OPT_e);
5728 Args.AddAllArgs(CmdArgs, options::OPT_s);
5729 Args.AddAllArgs(CmdArgs, options::OPT_t);
5730 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5731
5732 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5733
5734 //----------------------------------------------------------------------------
5735 // Libraries
5736 //----------------------------------------------------------------------------
5737 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005738 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005739 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5740 CmdArgs.push_back("-lm");
5741 }
5742
5743 CmdArgs.push_back("--start-group");
5744
5745 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005746 for (const std::string &Lib : oslibs)
5747 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005748 CmdArgs.push_back("-lc");
5749 }
5750 CmdArgs.push_back("-lgcc");
5751
5752 CmdArgs.push_back("--end-group");
5753 }
5754
5755 //----------------------------------------------------------------------------
5756 // End files
5757 //----------------------------------------------------------------------------
5758 if (incStdLib && incStartFiles) {
5759 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5760 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5761 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005762}
5763
Douglas Katzman95354292015-06-23 20:42:09 +00005764void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5765 const InputInfo &Output,
5766 const InputInfoList &Inputs,
5767 const ArgList &Args,
5768 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005769
Douglas Katzman54366072015-07-27 16:53:08 +00005770 const toolchains::HexagonToolChain &ToolChain =
5771 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005772
5773 ArgStringList CmdArgs;
5774 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5775 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005776
5777 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005778 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005779 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005780}
5781// Hexagon tools end.
5782
Tom Stellard8fa33092015-07-18 01:49:05 +00005783void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5784 const InputInfo &Output,
5785 const InputInfoList &Inputs,
5786 const ArgList &Args,
5787 const char *LinkingOutput) const {
5788
5789 std::string Linker = getToolChain().GetProgramPath(getShortName());
5790 ArgStringList CmdArgs;
5791 CmdArgs.push_back("-flavor");
5792 CmdArgs.push_back("gnu");
5793 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00005794 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00005795 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5796 CmdArgs.push_back("-o");
5797 CmdArgs.push_back(Output.getFilename());
5798 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5799 CmdArgs, Inputs));
5800}
5801// AMDGPU tools end.
5802
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005803const std::string arm::getARMArch(const ArgList &Args,
5804 const llvm::Triple &Triple) {
5805 std::string MArch;
Bernard Ogden31561762013-12-12 13:27:11 +00005806 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5807 // Otherwise, if we have -march= choose the base CPU for that arch.
5808 MArch = A->getValue();
5809 } else {
5810 // Otherwise, use the Arch from the triple.
5811 MArch = Triple.getArchName();
5812 }
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005813 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005814
5815 // Handle -march=native.
5816 if (MArch == "native") {
5817 std::string CPU = llvm::sys::getHostCPUName();
5818 if (CPU != "generic") {
5819 // Translate the native cpu into the architecture suffix for that CPU.
5820 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5821 // If there is no valid architecture suffix for this CPU we don't know how
5822 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005823 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005824 MArch = "";
5825 else
5826 MArch = std::string("arm") + Suffix;
5827 }
5828 }
5829
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005830 return MArch;
5831}
5832/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5833const char *arm::getARMCPUForMArch(const ArgList &Args,
5834 const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005835 std::string MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005836 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5837 // here means an -march=native that we can't handle, so instead return no CPU.
5838 if (MArch.empty())
5839 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005840
John Brawna95c1a82015-05-08 12:52:18 +00005841 // We need to return an empty string here on invalid MArch values as the
5842 // various places that call this function can't cope with a null result.
5843 const char *result = Triple.getARMCPUForArch(MArch);
5844 if (result)
5845 return result;
5846 else
5847 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005848}
5849
5850/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Gabor Ballabas208826c2015-06-04 17:56:32 +00005851std::string arm::getARMTargetCPU(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005852 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005853 // FIXME: Warn on inconsistent use of -mcpu and -march.
5854 // If we have -mcpu=, use that.
5855 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +00005856 std::string MCPU = StringRef(A->getValue()).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005857 // Handle -mcpu=native.
5858 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005859 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005860 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005861 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005862 }
5863
5864 return getARMCPUForMArch(Args, Triple);
5865}
5866
5867/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005868/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005869// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005870const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005871 if (CPU == "generic" &&
5872 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5873 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005874
Renato Golin3c007252015-05-28 15:05:53 +00005875 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5876 if (ArchKind == llvm::ARM::AK_INVALID)
5877 return "";
5878 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005879}
5880
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005881void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005882 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005883 if (Args.hasArg(options::OPT_r))
5884 return;
5885
John Brawn94fd9632015-05-21 12:19:49 +00005886 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5887 // to generate BE-8 executables.
5888 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5889 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005890}
5891
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005892mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5893 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5894 .Case("mips1", NanLegacy)
5895 .Case("mips2", NanLegacy)
5896 .Case("mips3", NanLegacy)
5897 .Case("mips4", NanLegacy)
5898 .Case("mips5", NanLegacy)
5899 .Case("mips32", NanLegacy)
5900 .Case("mips32r2", NanLegacy)
5901 .Case("mips32r3", NanLegacy | Nan2008)
5902 .Case("mips32r5", NanLegacy | Nan2008)
5903 .Case("mips32r6", Nan2008)
5904 .Case("mips64", NanLegacy)
5905 .Case("mips64r2", NanLegacy)
5906 .Case("mips64r3", NanLegacy | Nan2008)
5907 .Case("mips64r5", NanLegacy | Nan2008)
5908 .Case("mips64r6", Nan2008)
5909 .Default(NanLegacy);
5910}
5911
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005912bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5913 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5914 return A && (A->getValue() == StringRef(Value));
5915}
5916
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005917bool mips::isUCLibc(const ArgList &Args) {
5918 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005919 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005920}
5921
Daniel Sanders2bf13662014-07-10 14:40:57 +00005922bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005923 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5924 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005925 .Case("2008", true)
5926 .Case("legacy", false)
5927 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005928
5929 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005930 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005931 .Cases("mips32r6", "mips64r6", true)
5932 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005933
5934 return false;
5935}
5936
Daniel Sanders379d44b2014-07-16 11:52:23 +00005937bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00005938 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00005939 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005940 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005941 return false;
5942
5943 if (ABIName != "32")
5944 return false;
5945
Toma Tabacu94ea6862015-06-16 13:54:13 +00005946 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
5947 // present.
5948 if (FloatABI == "soft")
5949 return false;
5950
Daniel Sanders379d44b2014-07-16 11:52:23 +00005951 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005952 .Cases("mips2", "mips3", "mips4", "mips5", true)
5953 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5954 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
5955 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00005956}
5957
Toma Tabacu94ea6862015-06-16 13:54:13 +00005958bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
5959 StringRef CPUName, StringRef ABIName,
5960 StringRef FloatABI) {
5961 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
5962
5963 // FPXX shouldn't be used if -msingle-float is present.
5964 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
5965 options::OPT_mdouble_float))
5966 if (A->getOption().matches(options::OPT_msingle_float))
5967 UseFPXX = false;
5968
5969 return UseFPXX;
5970}
5971
Tim Northover157d9112014-01-16 08:48:16 +00005972llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005973 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5974 // archs which Darwin doesn't use.
5975
5976 // The matching this routine does is fairly pointless, since it is neither the
5977 // complete architecture list, nor a reasonable subset. The problem is that
5978 // historically the driver driver accepts this and also ties its -march=
5979 // handling to the architecture name, so we need to be careful before removing
5980 // support for it.
5981
5982 // This code must be kept in sync with Clang's Darwin specific argument
5983 // translation.
5984
5985 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005986 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5987 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5988 .Case("ppc64", llvm::Triple::ppc64)
5989 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5990 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5991 llvm::Triple::x86)
5992 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
5993 // This is derived from the driver driver.
5994 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
5995 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
5996 .Cases("armv7s", "xscale", llvm::Triple::arm)
5997 .Case("arm64", llvm::Triple::aarch64)
5998 .Case("r600", llvm::Triple::r600)
5999 .Case("amdgcn", llvm::Triple::amdgcn)
6000 .Case("nvptx", llvm::Triple::nvptx)
6001 .Case("nvptx64", llvm::Triple::nvptx64)
6002 .Case("amdil", llvm::Triple::amdil)
6003 .Case("spir", llvm::Triple::spir)
6004 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006005}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006006
Tim Northover157d9112014-01-16 08:48:16 +00006007void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006008 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006009 T.setArch(Arch);
6010
6011 if (Str == "x86_64h")
6012 T.setArchName(Str);
6013 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6014 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006015 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006016 }
6017}
6018
Bob Wilsondecc03e2012-11-23 06:14:39 +00006019const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006020 const InputInfo &Input) {
6021 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006022}
6023
Bob Wilsondecc03e2012-11-23 06:14:39 +00006024const char *Clang::getBaseInputStem(const ArgList &Args,
6025 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006026 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006027
Chris Lattner906bb902011-01-16 08:14:11 +00006028 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006029 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006030
6031 return Str;
6032}
6033
Bob Wilsondecc03e2012-11-23 06:14:39 +00006034const char *Clang::getDependencyFileName(const ArgList &Args,
6035 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006036 // FIXME: Think about this more.
6037 std::string Res;
6038
6039 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006040 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006041 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006042 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006043 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006044 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006045 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006046}
6047
Douglas Katzman95354292015-06-23 20:42:09 +00006048void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6049 const InputInfo &Output,
6050 const InputInfoList &Inputs,
6051 const ArgList &Args,
6052 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006053 const ToolChain &ToolChain = getToolChain();
6054 const Driver &D = ToolChain.getDriver();
6055 ArgStringList CmdArgs;
6056
6057 // Silence warning for "clang -g foo.o -o foo"
6058 Args.ClaimAllArgs(options::OPT_g_Group);
6059 // and "clang -emit-llvm foo.o -o foo"
6060 Args.ClaimAllArgs(options::OPT_emit_llvm);
6061 // and for "clang -w foo.o -o foo". Other warning options are already
6062 // handled somewhere else.
6063 Args.ClaimAllArgs(options::OPT_w);
6064
6065 if (!D.SysRoot.empty())
6066 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6067
6068 // CloudABI only supports static linkage.
6069 CmdArgs.push_back("-Bstatic");
6070 CmdArgs.push_back("--eh-frame-hdr");
6071 CmdArgs.push_back("--gc-sections");
6072
6073 if (Output.isFilename()) {
6074 CmdArgs.push_back("-o");
6075 CmdArgs.push_back(Output.getFilename());
6076 } else {
6077 assert(Output.isNothing() && "Invalid output.");
6078 }
6079
6080 if (!Args.hasArg(options::OPT_nostdlib) &&
6081 !Args.hasArg(options::OPT_nostartfiles)) {
6082 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6083 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6084 }
6085
6086 Args.AddAllArgs(CmdArgs, options::OPT_L);
6087 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6088 for (const auto &Path : Paths)
6089 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
6090 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6091 Args.AddAllArgs(CmdArgs, options::OPT_e);
6092 Args.AddAllArgs(CmdArgs, options::OPT_s);
6093 Args.AddAllArgs(CmdArgs, options::OPT_t);
6094 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6095 Args.AddAllArgs(CmdArgs, options::OPT_r);
6096
Alexey Samsonov907880e2015-06-19 19:57:46 +00006097 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006098 AddGoldPlugin(ToolChain, Args, CmdArgs);
6099
6100 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6101
6102 if (!Args.hasArg(options::OPT_nostdlib) &&
6103 !Args.hasArg(options::OPT_nodefaultlibs)) {
6104 if (D.CCCIsCXX())
6105 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6106 CmdArgs.push_back("-lc");
6107 CmdArgs.push_back("-lcompiler_rt");
6108 }
6109
6110 if (!Args.hasArg(options::OPT_nostdlib) &&
6111 !Args.hasArg(options::OPT_nostartfiles))
6112 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6113
6114 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006115 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006116}
6117
Douglas Katzman95354292015-06-23 20:42:09 +00006118void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6119 const InputInfo &Output,
6120 const InputInfoList &Inputs,
6121 const ArgList &Args,
6122 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006123 ArgStringList CmdArgs;
6124
6125 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6126 const InputInfo &Input = Inputs[0];
6127
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006128 // Determine the original source input.
6129 const Action *SourceAction = &JA;
6130 while (SourceAction->getKind() != Action::InputClass) {
6131 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6132 SourceAction = SourceAction->getInputs()[0];
6133 }
6134
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006135 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006136 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006137 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6138 // FIXME: at run-time detect assembler capabilities or rely on version
6139 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006140 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006141 const llvm::Triple &T(getToolChain().getTriple());
6142 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006143 CmdArgs.push_back("-Q");
6144 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006145
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006146 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006147 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006148 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006149 if (Args.hasArg(options::OPT_gstabs))
6150 CmdArgs.push_back("--gstabs");
6151 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006152 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006153 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006154
Daniel Dunbarbe220842009-03-20 16:06:39 +00006155 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006156 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006157
Daniel Dunbar6d484762010-07-22 01:47:22 +00006158 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006159 if (getToolChain().getArch() == llvm::Triple::x86 ||
6160 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006161 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6162 CmdArgs.push_back("-force_cpusubtype_ALL");
6163
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006164 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006165 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006166 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006167 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006168 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006169 CmdArgs.push_back("-static");
6170
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006171 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006172
6173 assert(Output.isFilename() && "Unexpected lipo output.");
6174 CmdArgs.push_back("-o");
6175 CmdArgs.push_back(Output.getFilename());
6176
Daniel Dunbarb440f562010-08-02 02:38:21 +00006177 assert(Input.isFilename() && "Invalid input.");
6178 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006179
6180 // asm_final spec is empty.
6181
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006182 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006183 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006184}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006185
Tim Northover157d9112014-01-16 08:48:16 +00006186void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006187
Tim Northover157d9112014-01-16 08:48:16 +00006188void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6189 ArgStringList &CmdArgs) const {
6190 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006191
Daniel Dunbarc1964212009-03-26 16:23:12 +00006192 // Derived from darwin_arch spec.
6193 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006194 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006195
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006196 // FIXME: Is this needed anymore?
6197 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006198 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006199}
6200
Douglas Katzman95354292015-06-23 20:42:09 +00006201bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006202 // We only need to generate a temp path for LTO if we aren't compiling object
6203 // files. When compiling source files, we run 'dsymutil' after linking. We
6204 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006205 for (const auto &Input : Inputs)
6206 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006207 return true;
6208
6209 return false;
6210}
6211
Douglas Katzman95354292015-06-23 20:42:09 +00006212void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6213 ArgStringList &CmdArgs,
6214 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006215 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006216 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006217
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006218 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006219 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6220 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006221 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6222 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006223 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006224 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006225 }
6226
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006227 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006228 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006229 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6230 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006231
Bob Wilson3d27dad2013-08-02 22:25:34 +00006232 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6233 CmdArgs.push_back("-export_dynamic");
6234
Bob Wilsonb111ec92015-03-02 19:01:14 +00006235 // If we are using App Extension restrictions, pass a flag to the linker
6236 // telling it that the compiled code has been audited.
6237 if (Args.hasFlag(options::OPT_fapplication_extension,
6238 options::OPT_fno_application_extension, false))
6239 CmdArgs.push_back("-application_extension");
6240
Bill Wendling313b6bf2012-11-16 23:03:00 +00006241 // If we are using LTO, then automatically create a temporary file path for
6242 // the linker to use, so that it's lifetime will extend past a possible
6243 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006244 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006245 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006246 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006247 C.addTempFile(TmpPath);
6248 CmdArgs.push_back("-object_path_lto");
6249 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006250 }
6251
Daniel Dunbarc1964212009-03-26 16:23:12 +00006252 // Derived from the "link" spec.
6253 Args.AddAllArgs(CmdArgs, options::OPT_static);
6254 if (!Args.hasArg(options::OPT_static))
6255 CmdArgs.push_back("-dynamic");
6256 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6257 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6258 // here. How do we wish to handle such things?
6259 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006260
Daniel Dunbarc1964212009-03-26 16:23:12 +00006261 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006262 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006263 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006264 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006265
6266 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6267 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6268 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6269
6270 Arg *A;
6271 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6272 (A = Args.getLastArg(options::OPT_current__version)) ||
6273 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006274 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6275 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006276
6277 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6278 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6279 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6280 } else {
6281 CmdArgs.push_back("-dylib");
6282
6283 Arg *A;
6284 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6285 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6286 (A = Args.getLastArg(options::OPT_client__name)) ||
6287 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6288 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6289 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006290 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6291 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006292
Daniel Dunbarc1964212009-03-26 16:23:12 +00006293 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6294 "-dylib_compatibility_version");
6295 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6296 "-dylib_current_version");
6297
Tim Northover157d9112014-01-16 08:48:16 +00006298 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006299
6300 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6301 "-dylib_install_name");
6302 }
6303
6304 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6305 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6306 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006307 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006308 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006309 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6310 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6311 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6312 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6313 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6314 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006315 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006316 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6317 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6318 Args.AddAllArgs(CmdArgs, options::OPT_init);
6319
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006320 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006321 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006322
Daniel Dunbarc1964212009-03-26 16:23:12 +00006323 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6324 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6325 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6326 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6327 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006328
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006329 if (const Arg *A =
6330 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6331 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006332 if (A->getOption().matches(options::OPT_fpie) ||
6333 A->getOption().matches(options::OPT_fPIE))
6334 CmdArgs.push_back("-pie");
6335 else
6336 CmdArgs.push_back("-no_pie");
6337 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006338
6339 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6340 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6341 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6342 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6343 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6344 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6345 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6346 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6347 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6348 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6349 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6350 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6351 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6352 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6353 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6354 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006355
Daniel Dunbar84384642011-05-02 21:03:47 +00006356 // Give --sysroot= preference, over the Apple specific behavior to also use
6357 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006358 StringRef sysroot = C.getSysRoot();
6359 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006360 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006361 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006362 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6363 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006364 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006365 }
6366
Daniel Dunbarc1964212009-03-26 16:23:12 +00006367 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6368 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6369 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6370 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6371 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006372 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006373 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6374 Args.AddAllArgs(CmdArgs, options::OPT_y);
6375 Args.AddLastArg(CmdArgs, options::OPT_w);
6376 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6377 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6378 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6379 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6380 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6381 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6382 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6383 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6384 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6385 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6386 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6387 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6388}
6389
Douglas Katzman95354292015-06-23 20:42:09 +00006390void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6391 const InputInfo &Output,
6392 const InputInfoList &Inputs,
6393 const ArgList &Args,
6394 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006395 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006396
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006397 // If the number of arguments surpasses the system limits, we will encode the
6398 // input files in a separate file, shortening the command line. To this end,
6399 // build a list of input file names that can be passed via a file with the
6400 // -filelist linker option.
6401 llvm::opt::ArgStringList InputFileList;
6402
Daniel Dunbarc1964212009-03-26 16:23:12 +00006403 // The logic here is derived from gcc's behavior; most of which
6404 // comes from specs (starting with link_command). Consult gcc for
6405 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006406 ArgStringList CmdArgs;
6407
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006408 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6409 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6410 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006411 for (const auto &Arg : Args)
6412 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006413 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006414 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006415 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006416 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006417 return;
6418 }
6419
Daniel Dunbarc1964212009-03-26 16:23:12 +00006420 // I'm not sure why this particular decomposition exists in gcc, but
6421 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006422 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006423
Daniel Dunbarc1964212009-03-26 16:23:12 +00006424 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6425 Args.AddAllArgs(CmdArgs, options::OPT_s);
6426 Args.AddAllArgs(CmdArgs, options::OPT_t);
6427 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6428 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006429 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006430 Args.AddAllArgs(CmdArgs, options::OPT_r);
6431
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006432 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6433 // members of static archive libraries which implement Objective-C classes or
6434 // categories.
6435 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6436 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006437
Daniel Dunbarc1964212009-03-26 16:23:12 +00006438 CmdArgs.push_back("-o");
6439 CmdArgs.push_back(Output.getFilename());
6440
Chad Rosier06fd3c62012-05-16 23:45:12 +00006441 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006442 !Args.hasArg(options::OPT_nostartfiles))
6443 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006444
Peter Collingbournec4122c12015-06-15 21:08:13 +00006445 // SafeStack requires its own runtime libraries
6446 // These libraries should be linked first, to make sure the
6447 // __safestack_init constructor executes before everything else
6448 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6449 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6450 "libclang_rt.safestack_osx.a",
6451 /*AlwaysLink=*/true);
6452 }
6453
Daniel Dunbarc1964212009-03-26 16:23:12 +00006454 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006455
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006456 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6457 options::OPT_fno_openmp, false)) {
6458 switch (getOpenMPRuntime(getToolChain(), Args)) {
6459 case OMPRT_OMP:
6460 CmdArgs.push_back("-lomp");
6461 break;
6462 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006463 CmdArgs.push_back("-lgomp");
6464 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006465 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006466 CmdArgs.push_back("-liomp5");
6467 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006468 case OMPRT_Unknown:
6469 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006470 break;
6471 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006472 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006473
Douglas Gregor9295df02012-05-15 21:00:27 +00006474 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006475 // Build the input file for -filelist (list of linker input files) in case we
6476 // need it later
6477 for (const auto &II : Inputs) {
6478 if (!II.isFilename()) {
6479 // This is a linker input argument.
6480 // We cannot mix input arguments and file names in a -filelist input, thus
6481 // we prematurely stop our list (remaining files shall be passed as
6482 // arguments).
6483 if (InputFileList.size() > 0)
6484 break;
6485
6486 continue;
6487 }
6488
6489 InputFileList.push_back(II.getFilename());
6490 }
6491
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006492 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006493 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006494 // We use arclite library for both ARC and subscripting support.
6495 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6496
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006497 CmdArgs.push_back("-framework");
6498 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006499 // Link libobj.
6500 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006501 }
John McCall31168b02011-06-15 23:02:42 +00006502
Daniel Dunbarc1964212009-03-26 16:23:12 +00006503 if (LinkingOutput) {
6504 CmdArgs.push_back("-arch_multiple");
6505 CmdArgs.push_back("-final_output");
6506 CmdArgs.push_back(LinkingOutput);
6507 }
6508
Daniel Dunbarc1964212009-03-26 16:23:12 +00006509 if (Args.hasArg(options::OPT_fnested_functions))
6510 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006511
Justin Bognerc7701242015-05-12 05:44:36 +00006512 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6513 // paths are different enough from other toolchains that this needs a fair
6514 // amount of refactoring done first.
6515 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6516
Daniel Dunbarc1964212009-03-26 16:23:12 +00006517 if (!Args.hasArg(options::OPT_nostdlib) &&
6518 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006519 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006520 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006521
Daniel Dunbarc1964212009-03-26 16:23:12 +00006522 // link_ssp spec is empty.
6523
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006524 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006525 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006526 }
6527
Chad Rosier06fd3c62012-05-16 23:45:12 +00006528 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006529 !Args.hasArg(options::OPT_nostartfiles)) {
6530 // endfile_spec is empty.
6531 }
6532
6533 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6534 Args.AddAllArgs(CmdArgs, options::OPT_F);
6535
Steven Wu3ffb61b2015-02-06 18:08:29 +00006536 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006537 for (const Arg *A : Args.filtered(options::OPT_iframework))
6538 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006539
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006540 if (!Args.hasArg(options::OPT_nostdlib) &&
6541 !Args.hasArg(options::OPT_nodefaultlibs)) {
6542 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6543 if (A->getValue() == StringRef("Accelerate")) {
6544 CmdArgs.push_back("-framework");
6545 CmdArgs.push_back("Accelerate");
6546 }
6547 }
6548 }
6549
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006550 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006551 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006552 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006553 Cmd->setInputFileList(std::move(InputFileList));
6554 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006555}
6556
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006557void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006558 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006559 const InputInfoList &Inputs,
6560 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006561 const char *LinkingOutput) const {
6562 ArgStringList CmdArgs;
6563
6564 CmdArgs.push_back("-create");
6565 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006566
6567 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006568 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006569
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006570 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006571 assert(II.isFilename() && "Unexpected lipo input.");
6572 CmdArgs.push_back(II.getFilename());
6573 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006574
6575 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006576 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006577}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006578
Daniel Dunbar88299622010-06-04 18:28:36 +00006579void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006580 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006581 const InputInfoList &Inputs,
6582 const ArgList &Args,
6583 const char *LinkingOutput) const {
6584 ArgStringList CmdArgs;
6585
Daniel Dunbareb86b042011-05-09 17:23:16 +00006586 CmdArgs.push_back("-o");
6587 CmdArgs.push_back(Output.getFilename());
6588
Daniel Dunbar88299622010-06-04 18:28:36 +00006589 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6590 const InputInfo &Input = Inputs[0];
6591 assert(Input.isFilename() && "Unexpected dsymutil input.");
6592 CmdArgs.push_back(Input.getFilename());
6593
Daniel Dunbar88299622010-06-04 18:28:36 +00006594 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006595 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006596 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006597}
6598
Eric Christopher551ef452011-08-23 17:56:55 +00006599void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006600 const InputInfo &Output,
6601 const InputInfoList &Inputs,
6602 const ArgList &Args,
6603 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006604 ArgStringList CmdArgs;
6605 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006606 CmdArgs.push_back("--debug-info");
6607 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006608 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006609
6610 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6611 const InputInfo &Input = Inputs[0];
6612 assert(Input.isFilename() && "Unexpected verify input");
6613
6614 // Grabbing the output of the earlier dsymutil run.
6615 CmdArgs.push_back(Input.getFilename());
6616
6617 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006618 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006619 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006620}
6621
Douglas Katzman95354292015-06-23 20:42:09 +00006622void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006623 const InputInfo &Output,
6624 const InputInfoList &Inputs,
6625 const ArgList &Args,
6626 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006627 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006628 ArgStringList CmdArgs;
6629
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006630 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006631
6632 CmdArgs.push_back("-o");
6633 CmdArgs.push_back(Output.getFilename());
6634
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006635 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006636 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006637
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006638 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006639 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006640}
6641
Douglas Katzman95354292015-06-23 20:42:09 +00006642void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6643 const InputInfo &Output,
6644 const InputInfoList &Inputs,
6645 const ArgList &Args,
6646 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006647 // FIXME: Find a real GCC, don't hard-code versions here
6648 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6649 const llvm::Triple &T = getToolChain().getTriple();
6650 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006651 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006652 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006653 case llvm::Triple::x86:
6654 GCCLibPath +=
6655 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6656 break;
6657 case llvm::Triple::x86_64:
6658 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6659 GCCLibPath += "/4.5.2/amd64/";
6660 LibPath += "amd64/";
6661 break;
6662 default:
6663 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006664 }
6665
6666 ArgStringList CmdArgs;
6667
David Chisnall272a0712012-02-29 15:06:12 +00006668 // Demangle C++ names in errors
6669 CmdArgs.push_back("-C");
6670
David Chisnallf571cde2012-02-15 13:39:01 +00006671 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6672 (!Args.hasArg(options::OPT_shared))) {
6673 CmdArgs.push_back("-e");
6674 CmdArgs.push_back("_start");
6675 }
6676
6677 if (Args.hasArg(options::OPT_static)) {
6678 CmdArgs.push_back("-Bstatic");
6679 CmdArgs.push_back("-dn");
6680 } else {
6681 CmdArgs.push_back("-Bdynamic");
6682 if (Args.hasArg(options::OPT_shared)) {
6683 CmdArgs.push_back("-shared");
6684 } else {
6685 CmdArgs.push_back("--dynamic-linker");
6686 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6687 }
6688 }
6689
6690 if (Output.isFilename()) {
6691 CmdArgs.push_back("-o");
6692 CmdArgs.push_back(Output.getFilename());
6693 } else {
6694 assert(Output.isNothing() && "Invalid output.");
6695 }
6696
6697 if (!Args.hasArg(options::OPT_nostdlib) &&
6698 !Args.hasArg(options::OPT_nostartfiles)) {
6699 if (!Args.hasArg(options::OPT_shared)) {
6700 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6701 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006702 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006703 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6704 } else {
6705 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006706 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6707 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006708 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006709 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006710 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006711 }
6712
6713 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6714
6715 Args.AddAllArgs(CmdArgs, options::OPT_L);
6716 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6717 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006718 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006719
6720 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6721
6722 if (!Args.hasArg(options::OPT_nostdlib) &&
6723 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006724 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006725 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006726 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006727 if (!Args.hasArg(options::OPT_shared)) {
6728 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006729 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006730 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006731 }
David Chisnallf571cde2012-02-15 13:39:01 +00006732 }
6733
6734 if (!Args.hasArg(options::OPT_nostdlib) &&
6735 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006736 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006737 }
David Chisnall96de9932012-02-16 16:00:47 +00006738 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006739
Alexey Samsonov7811d192014-02-20 13:57:37 +00006740 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006741
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006742 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006743 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006744}
6745
Douglas Katzman95354292015-06-23 20:42:09 +00006746void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6747 const InputInfo &Output,
6748 const InputInfoList &Inputs,
6749 const ArgList &Args,
6750 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006751 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006752 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006753 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006754
Rafael Espindolacc126272014-02-28 01:55:21 +00006755 switch (getToolChain().getArch()) {
6756 case llvm::Triple::x86:
6757 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6758 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006759 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006760 break;
6761
6762 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006763 CmdArgs.push_back("-mppc");
6764 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006765 break;
6766
6767 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006768 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006769 CmdArgs.push_back("-32");
6770 NeedsKPIC = true;
6771 break;
6772
6773 case llvm::Triple::sparcv9:
6774 CmdArgs.push_back("-64");
6775 CmdArgs.push_back("-Av9a");
6776 NeedsKPIC = true;
6777 break;
6778
6779 case llvm::Triple::mips64:
6780 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006781 StringRef CPUName;
6782 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006783 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006784
6785 CmdArgs.push_back("-mabi");
6786 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6787
6788 if (getToolChain().getArch() == llvm::Triple::mips64)
6789 CmdArgs.push_back("-EB");
6790 else
6791 CmdArgs.push_back("-EL");
6792
Rafael Espindolacc126272014-02-28 01:55:21 +00006793 NeedsKPIC = true;
6794 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006795 }
6796
Rafael Espindolacc126272014-02-28 01:55:21 +00006797 default:
6798 break;
6799 }
6800
6801 if (NeedsKPIC)
6802 addAssemblerKPIC(Args, CmdArgs);
6803
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006804 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006805
6806 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006807 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006808
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006809 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006810 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006811
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006812 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006813 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006814}
6815
Douglas Katzman95354292015-06-23 20:42:09 +00006816void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6817 const InputInfo &Output,
6818 const InputInfoList &Inputs,
6819 const ArgList &Args,
6820 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006821 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006822 ArgStringList CmdArgs;
6823
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006824 // Silence warning for "clang -g foo.o -o foo"
6825 Args.ClaimAllArgs(options::OPT_g_Group);
6826 // and "clang -emit-llvm foo.o -o foo"
6827 Args.ClaimAllArgs(options::OPT_emit_llvm);
6828 // and for "clang -w foo.o -o foo". Other warning options are already
6829 // handled somewhere else.
6830 Args.ClaimAllArgs(options::OPT_w);
6831
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006832 if (getToolChain().getArch() == llvm::Triple::mips64)
6833 CmdArgs.push_back("-EB");
6834 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6835 CmdArgs.push_back("-EL");
6836
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006837 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006838 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006839 CmdArgs.push_back("-e");
6840 CmdArgs.push_back("__start");
6841 }
6842
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006843 if (Args.hasArg(options::OPT_static)) {
6844 CmdArgs.push_back("-Bstatic");
6845 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006846 if (Args.hasArg(options::OPT_rdynamic))
6847 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006848 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006849 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006850 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006851 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006852 } else {
6853 CmdArgs.push_back("-dynamic-linker");
6854 CmdArgs.push_back("/usr/libexec/ld.so");
6855 }
6856 }
6857
Rafael Espindola044f7832013-06-05 04:28:55 +00006858 if (Args.hasArg(options::OPT_nopie))
6859 CmdArgs.push_back("-nopie");
6860
Daniel Dunbarb440f562010-08-02 02:38:21 +00006861 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006862 CmdArgs.push_back("-o");
6863 CmdArgs.push_back(Output.getFilename());
6864 } else {
6865 assert(Output.isNothing() && "Invalid output.");
6866 }
6867
6868 if (!Args.hasArg(options::OPT_nostdlib) &&
6869 !Args.hasArg(options::OPT_nostartfiles)) {
6870 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006871 if (Args.hasArg(options::OPT_pg))
6872 CmdArgs.push_back(
6873 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00006874 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006875 CmdArgs.push_back(
6876 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6877 CmdArgs.push_back(
6878 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006879 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006880 CmdArgs.push_back(
6881 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006882 }
6883 }
6884
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006885 std::string Triple = getToolChain().getTripleString();
6886 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006887 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006888 CmdArgs.push_back(
6889 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006890
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006891 Args.AddAllArgs(CmdArgs, options::OPT_L);
6892 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6893 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006894 Args.AddAllArgs(CmdArgs, options::OPT_s);
6895 Args.AddAllArgs(CmdArgs, options::OPT_t);
6896 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6897 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006898
Daniel Dunbar54423b22010-09-17 00:24:54 +00006899 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006900
6901 if (!Args.hasArg(options::OPT_nostdlib) &&
6902 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006903 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006904 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006905 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006906 CmdArgs.push_back("-lm_p");
6907 else
6908 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006909 }
6910
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006911 // FIXME: For some reason GCC passes -lgcc before adding
6912 // the default system libraries. Just mimic this for now.
6913 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006914
Eric Christopher17674ec2012-09-13 06:32:34 +00006915 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006916 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
6917 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00006918 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006919 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00006920 }
6921
Chandler Carruth45661652011-12-17 22:32:42 +00006922 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006923 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006924 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00006925 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006926 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006927 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006928
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006929 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006930 }
6931
6932 if (!Args.hasArg(options::OPT_nostdlib) &&
6933 !Args.hasArg(options::OPT_nostartfiles)) {
6934 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006935 CmdArgs.push_back(
6936 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006937 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006938 CmdArgs.push_back(
6939 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006940 }
6941
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006942 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006943 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006944}
Ed Schoutene33194b2009-04-02 19:13:12 +00006945
Douglas Katzman95354292015-06-23 20:42:09 +00006946void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6947 const InputInfo &Output,
6948 const InputInfoList &Inputs,
6949 const ArgList &Args,
6950 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006951 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006952 ArgStringList CmdArgs;
6953
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006954 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00006955
6956 CmdArgs.push_back("-o");
6957 CmdArgs.push_back(Output.getFilename());
6958
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006959 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006960 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006961
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006962 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006963 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006964}
6965
Douglas Katzman95354292015-06-23 20:42:09 +00006966void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6967 const InputInfo &Output,
6968 const InputInfoList &Inputs,
6969 const ArgList &Args,
6970 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00006971 const Driver &D = getToolChain().getDriver();
6972 ArgStringList CmdArgs;
6973
6974 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6975 (!Args.hasArg(options::OPT_shared))) {
6976 CmdArgs.push_back("-e");
6977 CmdArgs.push_back("__start");
6978 }
6979
6980 if (Args.hasArg(options::OPT_static)) {
6981 CmdArgs.push_back("-Bstatic");
6982 } else {
6983 if (Args.hasArg(options::OPT_rdynamic))
6984 CmdArgs.push_back("-export-dynamic");
6985 CmdArgs.push_back("--eh-frame-hdr");
6986 CmdArgs.push_back("-Bdynamic");
6987 if (Args.hasArg(options::OPT_shared)) {
6988 CmdArgs.push_back("-shared");
6989 } else {
6990 CmdArgs.push_back("-dynamic-linker");
6991 CmdArgs.push_back("/usr/libexec/ld.so");
6992 }
6993 }
6994
6995 if (Output.isFilename()) {
6996 CmdArgs.push_back("-o");
6997 CmdArgs.push_back(Output.getFilename());
6998 } else {
6999 assert(Output.isNothing() && "Invalid output.");
7000 }
7001
7002 if (!Args.hasArg(options::OPT_nostdlib) &&
7003 !Args.hasArg(options::OPT_nostartfiles)) {
7004 if (!Args.hasArg(options::OPT_shared)) {
7005 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007006 CmdArgs.push_back(
7007 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007008 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007009 CmdArgs.push_back(
7010 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7011 CmdArgs.push_back(
7012 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007013 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007014 CmdArgs.push_back(
7015 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007016 }
7017 }
7018
7019 Args.AddAllArgs(CmdArgs, options::OPT_L);
7020 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7021 Args.AddAllArgs(CmdArgs, options::OPT_e);
7022
7023 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7024
7025 if (!Args.hasArg(options::OPT_nostdlib) &&
7026 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007027 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007028 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7029 if (Args.hasArg(options::OPT_pg))
7030 CmdArgs.push_back("-lm_p");
7031 else
7032 CmdArgs.push_back("-lm");
7033 }
7034
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007035 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007036 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007037 CmdArgs.push_back("-lpthread_p");
7038 else
7039 CmdArgs.push_back("-lpthread");
7040 }
7041
Eli Friedman9fa28852012-08-08 23:57:20 +00007042 if (!Args.hasArg(options::OPT_shared)) {
7043 if (Args.hasArg(options::OPT_pg))
7044 CmdArgs.push_back("-lc_p");
7045 else
7046 CmdArgs.push_back("-lc");
7047 }
7048
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007049 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007050 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007051 case llvm::Triple::arm:
7052 MyArch = "arm";
7053 break;
7054 case llvm::Triple::x86:
7055 MyArch = "i386";
7056 break;
7057 case llvm::Triple::x86_64:
7058 MyArch = "amd64";
7059 break;
7060 default:
7061 llvm_unreachable("Unsupported architecture");
7062 }
7063 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007064 }
7065
7066 if (!Args.hasArg(options::OPT_nostdlib) &&
7067 !Args.hasArg(options::OPT_nostartfiles)) {
7068 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007069 CmdArgs.push_back(
7070 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007071 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007072 CmdArgs.push_back(
7073 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007074 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007076 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007077 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007078}
7079
Douglas Katzman95354292015-06-23 20:42:09 +00007080void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7081 const InputInfo &Output,
7082 const InputInfoList &Inputs,
7083 const ArgList &Args,
7084 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007085 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007086 ArgStringList CmdArgs;
7087
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007088 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7089 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007090 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007091 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007092 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007093 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007094 else if (getToolChain().getArch() == llvm::Triple::mips ||
7095 getToolChain().getArch() == llvm::Triple::mipsel ||
7096 getToolChain().getArch() == llvm::Triple::mips64 ||
7097 getToolChain().getArch() == llvm::Triple::mips64el) {
7098 StringRef CPUName;
7099 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007100 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007101
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007102 CmdArgs.push_back("-march");
7103 CmdArgs.push_back(CPUName.data());
7104
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007105 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007106 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007107
7108 if (getToolChain().getArch() == llvm::Triple::mips ||
7109 getToolChain().getArch() == llvm::Triple::mips64)
7110 CmdArgs.push_back("-EB");
7111 else
7112 CmdArgs.push_back("-EL");
7113
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007114 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007115 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007116 getToolChain().getArch() == llvm::Triple::armeb ||
7117 getToolChain().getArch() == llvm::Triple::thumb ||
7118 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007119 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007120 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007121 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7122
7123 if (FloatABI == "hard") {
7124 CmdArgs.push_back("-mfpu=vfp");
7125 } else {
7126 CmdArgs.push_back("-mfpu=softvfp");
7127 }
7128
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007129 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007130 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007131 case llvm::Triple::GNUEABI:
7132 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007133 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007134 break;
7135
7136 default:
7137 CmdArgs.push_back("-matpcs");
7138 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007139 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007140 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007141 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007142 if (getToolChain().getArch() == llvm::Triple::sparc)
7143 CmdArgs.push_back("-Av8plusa");
7144 else
7145 CmdArgs.push_back("-Av9a");
7146
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007147 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007148 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007149
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007150 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007151
7152 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007153 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007154
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007155 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007156 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007157
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007158 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007159 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007160}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007161
Douglas Katzman95354292015-06-23 20:42:09 +00007162void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7163 const InputInfo &Output,
7164 const InputInfoList &Inputs,
7165 const ArgList &Args,
7166 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007167 const toolchains::FreeBSD &ToolChain =
7168 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007169 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007170 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007171 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007172 !Args.hasArg(options::OPT_shared) &&
7173 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007174 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007175
7176 // Silence warning for "clang -g foo.o -o foo"
7177 Args.ClaimAllArgs(options::OPT_g_Group);
7178 // and "clang -emit-llvm foo.o -o foo"
7179 Args.ClaimAllArgs(options::OPT_emit_llvm);
7180 // and for "clang -w foo.o -o foo". Other warning options are already
7181 // handled somewhere else.
7182 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007183
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007184 if (!D.SysRoot.empty())
7185 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7186
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007187 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007188 CmdArgs.push_back("-pie");
7189
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007190 if (Args.hasArg(options::OPT_static)) {
7191 CmdArgs.push_back("-Bstatic");
7192 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007193 if (Args.hasArg(options::OPT_rdynamic))
7194 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007195 CmdArgs.push_back("--eh-frame-hdr");
7196 if (Args.hasArg(options::OPT_shared)) {
7197 CmdArgs.push_back("-Bshareable");
7198 } else {
7199 CmdArgs.push_back("-dynamic-linker");
7200 CmdArgs.push_back("/libexec/ld-elf.so.1");
7201 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007202 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007203 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7204 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7205 CmdArgs.push_back("--hash-style=both");
7206 }
7207 }
7208 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007209 }
7210
7211 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7212 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007213 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007214 CmdArgs.push_back("-m");
7215 CmdArgs.push_back("elf_i386_fbsd");
7216 }
7217
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007218 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007219 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007220 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007221 }
7222
Daniel Dunbarb440f562010-08-02 02:38:21 +00007223 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007224 CmdArgs.push_back("-o");
7225 CmdArgs.push_back(Output.getFilename());
7226 } else {
7227 assert(Output.isNothing() && "Invalid output.");
7228 }
7229
7230 if (!Args.hasArg(options::OPT_nostdlib) &&
7231 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007232 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007233 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007234 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007235 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007236 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007237 crt1 = "Scrt1.o";
7238 else
7239 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007240 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007241 if (crt1)
7242 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7243
7244 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7245
Craig Topper92fc2df2014-05-17 16:56:41 +00007246 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007247 if (Args.hasArg(options::OPT_static))
7248 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007249 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007250 crtbegin = "crtbeginS.o";
7251 else
7252 crtbegin = "crtbegin.o";
7253
7254 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007255 }
7256
7257 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007258 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007259 for (const auto &Path : Paths)
7260 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007261 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7262 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007263 Args.AddAllArgs(CmdArgs, options::OPT_s);
7264 Args.AddAllArgs(CmdArgs, options::OPT_t);
7265 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7266 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007267
Alexey Samsonov907880e2015-06-19 19:57:46 +00007268 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007269 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007270
Alexey Samsonov52550342014-09-15 19:58:40 +00007271 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007272 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007273
7274 if (!Args.hasArg(options::OPT_nostdlib) &&
7275 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007276 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007277 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007278 if (Args.hasArg(options::OPT_pg))
7279 CmdArgs.push_back("-lm_p");
7280 else
7281 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007282 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007283 if (NeedsSanitizerDeps)
7284 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007285 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7286 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007287 if (Args.hasArg(options::OPT_pg))
7288 CmdArgs.push_back("-lgcc_p");
7289 else
7290 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007291 if (Args.hasArg(options::OPT_static)) {
7292 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007293 } else if (Args.hasArg(options::OPT_pg)) {
7294 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007295 } else {
7296 CmdArgs.push_back("--as-needed");
7297 CmdArgs.push_back("-lgcc_s");
7298 CmdArgs.push_back("--no-as-needed");
7299 }
7300
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007301 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007302 if (Args.hasArg(options::OPT_pg))
7303 CmdArgs.push_back("-lpthread_p");
7304 else
7305 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007306 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007307
Roman Divacky66f22762011-02-10 16:59:40 +00007308 if (Args.hasArg(options::OPT_pg)) {
7309 if (Args.hasArg(options::OPT_shared))
7310 CmdArgs.push_back("-lc");
7311 else
7312 CmdArgs.push_back("-lc_p");
7313 CmdArgs.push_back("-lgcc_p");
7314 } else {
7315 CmdArgs.push_back("-lc");
7316 CmdArgs.push_back("-lgcc");
7317 }
7318
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007319 if (Args.hasArg(options::OPT_static)) {
7320 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007321 } else if (Args.hasArg(options::OPT_pg)) {
7322 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007323 } else {
7324 CmdArgs.push_back("--as-needed");
7325 CmdArgs.push_back("-lgcc_s");
7326 CmdArgs.push_back("--no-as-needed");
7327 }
7328 }
7329
7330 if (!Args.hasArg(options::OPT_nostdlib) &&
7331 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007332 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007333 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007334 else
7335 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007336 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007337 }
7338
Alexey Samsonov7811d192014-02-20 13:57:37 +00007339 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007340
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007341 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007342 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007343}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007344
Douglas Katzman95354292015-06-23 20:42:09 +00007345void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007346 const InputInfo &Output,
7347 const InputInfoList &Inputs,
7348 const ArgList &Args,
7349 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007350 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007351 ArgStringList CmdArgs;
7352
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007353 // GNU as needs different flags for creating the correct output format
7354 // on architectures with different ABIs or optional feature sets.
7355 switch (getToolChain().getArch()) {
7356 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007357 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007358 break;
7359 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007360 case llvm::Triple::armeb:
7361 case llvm::Triple::thumb:
7362 case llvm::Triple::thumbeb: {
Gabor Ballabas208826c2015-06-04 17:56:32 +00007363 std::string MArch = arm::getARMTargetCPU(Args, getToolChain().getTriple());
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007364 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007365 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007366 }
7367
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007368 case llvm::Triple::mips:
7369 case llvm::Triple::mipsel:
7370 case llvm::Triple::mips64:
7371 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007372 StringRef CPUName;
7373 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007374 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007375
7376 CmdArgs.push_back("-march");
7377 CmdArgs.push_back(CPUName.data());
7378
7379 CmdArgs.push_back("-mabi");
7380 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7381
7382 if (getToolChain().getArch() == llvm::Triple::mips ||
7383 getToolChain().getArch() == llvm::Triple::mips64)
7384 CmdArgs.push_back("-EB");
7385 else
7386 CmdArgs.push_back("-EL");
7387
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007388 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007389 break;
7390 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007391
7392 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007393 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007394 CmdArgs.push_back("-32");
7395 addAssemblerKPIC(Args, CmdArgs);
7396 break;
7397
7398 case llvm::Triple::sparcv9:
7399 CmdArgs.push_back("-64");
7400 CmdArgs.push_back("-Av9");
7401 addAssemblerKPIC(Args, CmdArgs);
7402 break;
7403
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007404 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007405 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007406 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007407
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007408 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007409
7410 CmdArgs.push_back("-o");
7411 CmdArgs.push_back(Output.getFilename());
7412
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007413 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007414 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007415
David Chisnallddbd68f2011-09-27 22:03:18 +00007416 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007417 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007418}
7419
Douglas Katzman95354292015-06-23 20:42:09 +00007420void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7421 const InputInfo &Output,
7422 const InputInfoList &Inputs,
7423 const ArgList &Args,
7424 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007425 const Driver &D = getToolChain().getDriver();
7426 ArgStringList CmdArgs;
7427
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007428 if (!D.SysRoot.empty())
7429 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7430
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007431 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007432 if (Args.hasArg(options::OPT_static)) {
7433 CmdArgs.push_back("-Bstatic");
7434 } else {
7435 if (Args.hasArg(options::OPT_rdynamic))
7436 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007437 if (Args.hasArg(options::OPT_shared)) {
7438 CmdArgs.push_back("-Bshareable");
7439 } else {
7440 CmdArgs.push_back("-dynamic-linker");
7441 CmdArgs.push_back("/libexec/ld.elf_so");
7442 }
7443 }
7444
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007445 // Many NetBSD architectures support more than one ABI.
7446 // Determine the correct emulation for ld.
7447 switch (getToolChain().getArch()) {
7448 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007449 CmdArgs.push_back("-m");
7450 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007451 break;
7452 case llvm::Triple::arm:
7453 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007454 CmdArgs.push_back("-m");
7455 switch (getToolChain().getTriple().getEnvironment()) {
7456 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007457 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007458 CmdArgs.push_back("armelf_nbsd_eabi");
7459 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007460 case llvm::Triple::EABIHF:
7461 case llvm::Triple::GNUEABIHF:
7462 CmdArgs.push_back("armelf_nbsd_eabihf");
7463 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007464 default:
7465 CmdArgs.push_back("armelf_nbsd");
7466 break;
7467 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007468 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007469 case llvm::Triple::armeb:
7470 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007471 arm::appendEBLinkFlags(
7472 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007473 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007474 CmdArgs.push_back("-m");
7475 switch (getToolChain().getTriple().getEnvironment()) {
7476 case llvm::Triple::EABI:
7477 case llvm::Triple::GNUEABI:
7478 CmdArgs.push_back("armelfb_nbsd_eabi");
7479 break;
7480 case llvm::Triple::EABIHF:
7481 case llvm::Triple::GNUEABIHF:
7482 CmdArgs.push_back("armelfb_nbsd_eabihf");
7483 break;
7484 default:
7485 CmdArgs.push_back("armelfb_nbsd");
7486 break;
7487 }
7488 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007489 case llvm::Triple::mips64:
7490 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007491 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007492 CmdArgs.push_back("-m");
7493 if (getToolChain().getArch() == llvm::Triple::mips64)
7494 CmdArgs.push_back("elf32btsmip");
7495 else
7496 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007497 } else if (mips::hasMipsAbiArg(Args, "64")) {
7498 CmdArgs.push_back("-m");
7499 if (getToolChain().getArch() == llvm::Triple::mips64)
7500 CmdArgs.push_back("elf64btsmip");
7501 else
7502 CmdArgs.push_back("elf64ltsmip");
7503 }
7504 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007505 case llvm::Triple::ppc:
7506 CmdArgs.push_back("-m");
7507 CmdArgs.push_back("elf32ppc_nbsd");
7508 break;
7509
7510 case llvm::Triple::ppc64:
7511 case llvm::Triple::ppc64le:
7512 CmdArgs.push_back("-m");
7513 CmdArgs.push_back("elf64ppc");
7514 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007515
7516 case llvm::Triple::sparc:
7517 CmdArgs.push_back("-m");
7518 CmdArgs.push_back("elf32_sparc");
7519 break;
7520
7521 case llvm::Triple::sparcv9:
7522 CmdArgs.push_back("-m");
7523 CmdArgs.push_back("elf64_sparc");
7524 break;
7525
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007526 default:
7527 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007528 }
7529
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007530 if (Output.isFilename()) {
7531 CmdArgs.push_back("-o");
7532 CmdArgs.push_back(Output.getFilename());
7533 } else {
7534 assert(Output.isNothing() && "Invalid output.");
7535 }
7536
7537 if (!Args.hasArg(options::OPT_nostdlib) &&
7538 !Args.hasArg(options::OPT_nostartfiles)) {
7539 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007540 CmdArgs.push_back(
7541 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7542 CmdArgs.push_back(
7543 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7544 CmdArgs.push_back(
7545 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007546 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007547 CmdArgs.push_back(
7548 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7549 CmdArgs.push_back(
7550 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007551 }
7552 }
7553
7554 Args.AddAllArgs(CmdArgs, options::OPT_L);
7555 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7556 Args.AddAllArgs(CmdArgs, options::OPT_e);
7557 Args.AddAllArgs(CmdArgs, options::OPT_s);
7558 Args.AddAllArgs(CmdArgs, options::OPT_t);
7559 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7560 Args.AddAllArgs(CmdArgs, options::OPT_r);
7561
7562 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7563
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007564 unsigned Major, Minor, Micro;
7565 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7566 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007567 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007568 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007569 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007570 case llvm::Triple::arm:
7571 case llvm::Triple::armeb:
7572 case llvm::Triple::thumb:
7573 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007574 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007575 case llvm::Triple::ppc64:
7576 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007577 case llvm::Triple::x86:
7578 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007579 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007580 break;
7581 default:
7582 break;
7583 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007584 }
7585
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007586 if (!Args.hasArg(options::OPT_nostdlib) &&
7587 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007588 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007589 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7590 CmdArgs.push_back("-lm");
7591 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007592 if (Args.hasArg(options::OPT_pthread))
7593 CmdArgs.push_back("-lpthread");
7594 CmdArgs.push_back("-lc");
7595
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007596 if (useLibgcc) {
7597 if (Args.hasArg(options::OPT_static)) {
7598 // libgcc_eh depends on libc, so resolve as much as possible,
7599 // pull in any new requirements from libc and then get the rest
7600 // of libgcc.
7601 CmdArgs.push_back("-lgcc_eh");
7602 CmdArgs.push_back("-lc");
7603 CmdArgs.push_back("-lgcc");
7604 } else {
7605 CmdArgs.push_back("-lgcc");
7606 CmdArgs.push_back("--as-needed");
7607 CmdArgs.push_back("-lgcc_s");
7608 CmdArgs.push_back("--no-as-needed");
7609 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007610 }
7611 }
7612
7613 if (!Args.hasArg(options::OPT_nostdlib) &&
7614 !Args.hasArg(options::OPT_nostartfiles)) {
7615 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007616 CmdArgs.push_back(
7617 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007618 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007619 CmdArgs.push_back(
7620 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7621 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007622 }
7623
Alexey Samsonov7811d192014-02-20 13:57:37 +00007624 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007625
Logan Chieneb9162f2014-06-26 14:23:45 +00007626 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007627 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007628}
7629
Douglas Katzman95354292015-06-23 20:42:09 +00007630void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7631 const InputInfo &Output,
7632 const InputInfoList &Inputs,
7633 const ArgList &Args,
7634 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007635 claimNoWarnArgs(Args);
7636
Rafael Espindola92b00932010-08-10 00:25:48 +00007637 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007638 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007639
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007640 switch (getToolChain().getArch()) {
7641 default:
7642 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007643 // Add --32/--64 to make sure we get the format we want.
7644 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007645 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007646 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007647 break;
7648 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007649 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7650 CmdArgs.push_back("--x32");
7651 else
7652 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007653 break;
7654 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007655 CmdArgs.push_back("-a32");
7656 CmdArgs.push_back("-mppc");
7657 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007658 break;
7659 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007660 CmdArgs.push_back("-a64");
7661 CmdArgs.push_back("-mppc64");
7662 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007663 break;
7664 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007665 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007666 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007667 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007668 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007669 break;
7670 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007671 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007672 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007673 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007674 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007675 break;
7676 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007677 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007678 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007679 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007680 break;
7681 case llvm::Triple::arm:
7682 case llvm::Triple::armeb:
7683 case llvm::Triple::thumb:
7684 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007685 const llvm::Triple &Triple = getToolChain().getTriple();
7686 switch (Triple.getSubArch()) {
7687 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007688 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007689 break;
7690 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007691 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007692 break;
7693 default:
7694 break;
7695 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007696
Tim Northover9c7e0352013-12-12 11:55:52 +00007697 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007698 getToolChain().getDriver(), Args,
7699 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007700 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007701
7702 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007703
7704 // FIXME: remove krait check when GNU tools support krait cpu
7705 // for now replace it with -march=armv7-a to avoid a lower
7706 // march from being picked in the absence of a cpu flag.
7707 Arg *A;
7708 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007709 StringRef(A->getValue()).lower() == "krait")
7710 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007711 else
7712 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007713 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007714 break;
7715 }
7716 case llvm::Triple::mips:
7717 case llvm::Triple::mipsel:
7718 case llvm::Triple::mips64:
7719 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007720 StringRef CPUName;
7721 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007722 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007723 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007724
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007725 CmdArgs.push_back("-march");
7726 CmdArgs.push_back(CPUName.data());
7727
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007728 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007729 CmdArgs.push_back(ABIName.data());
7730
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007731 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7732 // or -mshared (not implemented) is in effect.
7733 bool IsPicOrPie = false;
7734 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7735 options::OPT_fpic, options::OPT_fno_pic,
7736 options::OPT_fPIE, options::OPT_fno_PIE,
7737 options::OPT_fpie, options::OPT_fno_pie)) {
7738 if (A->getOption().matches(options::OPT_fPIC) ||
7739 A->getOption().matches(options::OPT_fpic) ||
7740 A->getOption().matches(options::OPT_fPIE) ||
7741 A->getOption().matches(options::OPT_fpie))
7742 IsPicOrPie = true;
7743 }
7744 if (!IsPicOrPie)
7745 CmdArgs.push_back("-mno-shared");
7746
Daniel Sanders379d44b2014-07-16 11:52:23 +00007747 // LLVM doesn't support -mplt yet and acts as if it is always given.
7748 // However, -mplt has no effect with the N64 ABI.
7749 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007750
7751 if (getToolChain().getArch() == llvm::Triple::mips ||
7752 getToolChain().getArch() == llvm::Triple::mips64)
7753 CmdArgs.push_back("-EB");
7754 else
7755 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007756
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007757 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7758 if (StringRef(A->getValue()) == "2008")
7759 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7760 }
7761
Daniel Sanders379d44b2014-07-16 11:52:23 +00007762 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007763 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007764 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7765 options::OPT_mfp64)) {
7766 A->claim();
7767 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007768 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7769 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007770 CmdArgs.push_back("-mfpxx");
7771
7772 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7773 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007774 if (Arg *A =
7775 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007776 if (A->getOption().matches(options::OPT_mips16)) {
7777 A->claim();
7778 A->render(Args, CmdArgs);
7779 } else {
7780 A->claim();
7781 CmdArgs.push_back("-no-mips16");
7782 }
7783 }
7784
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007785 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7786 options::OPT_mno_micromips);
7787 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7788 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7789
Simon Atanasyanbd986632013-11-26 11:58:04 +00007790 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7791 // Do not use AddLastArg because not all versions of MIPS assembler
7792 // support -mmsa / -mno-msa options.
7793 if (A->getOption().matches(options::OPT_mmsa))
7794 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7795 }
7796
Daniel Sanders379d44b2014-07-16 11:52:23 +00007797 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7798 options::OPT_msoft_float);
7799
Toma Tabacub36d6102015-06-11 12:13:18 +00007800 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7801 options::OPT_msingle_float);
7802
Daniel Sanders379d44b2014-07-16 11:52:23 +00007803 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7804 options::OPT_mno_odd_spreg);
7805
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007806 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007807 break;
7808 }
7809 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007810 // Always pass an -march option, since our default of z10 is later
7811 // than the GNU assembler's default.
7812 StringRef CPUName = getSystemZTargetCPU(Args);
7813 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007814 break;
7815 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007816 }
7817
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007818 if (NeedsKPIC)
7819 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007820
Renato Golina74bbc72015-07-22 15:32:36 +00007821 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007822 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007823
7824 CmdArgs.push_back("-o");
7825 CmdArgs.push_back(Output.getFilename());
7826
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007827 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007828 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007829
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007830 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007831 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007832
7833 // Handle the debug info splitting at object creation time if we're
7834 // creating an object.
7835 // TODO: Currently only works on linux with newer objcopy.
7836 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007837 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007838 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007839 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007840}
7841
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007842static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007843 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007844 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00007845 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007846 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7847 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007848 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007849 CmdArgs.push_back("-lgcc");
7850
Logan Chien3d3373c2012-11-19 12:04:11 +00007851 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007852 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007853 CmdArgs.push_back("-lgcc");
7854 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00007855 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007856 CmdArgs.push_back("--as-needed");
7857 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00007858 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007859 CmdArgs.push_back("--no-as-needed");
7860 }
7861
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007862 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007863 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007864 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007865 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007866
7867 // According to Android ABI, we have to link with libdl if we are
7868 // linking with non-static libgcc.
7869 //
7870 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7871 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7872 if (isAndroid && !StaticLibgcc)
7873 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007874}
7875
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007876static std::string getLinuxDynamicLinker(const ArgList &Args,
7877 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007878 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7879
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007880 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7881 if (ToolChain.getTriple().isArch64Bit())
7882 return "/system/bin/linker64";
7883 else
7884 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007885 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7886 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007887 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007888 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007889 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007890 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007891 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007892 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00007893 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
7894 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007895 return "/lib/ld-linux-armhf.so.3";
7896 else
7897 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007898 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7899 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00007900 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
7901 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007902 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007903 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007904 return "/lib/ld-linux.so.3";
7905 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7906 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007907 StringRef CPUName;
7908 StringRef ABIName;
7909 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7910 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7911
7912 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7913 .Case("o32", "/lib")
7914 .Case("n32", "/lib32")
7915 .Case("n64", "/lib64")
7916 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007917 StringRef LibName;
7918 if (mips::isUCLibc(Args))
7919 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7920 else
7921 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007922
7923 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007924 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007925 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007926 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007927 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7928 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007929 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007930 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007931 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7932 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007933 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007934 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00007935 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007936 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007937 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007938 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00007939 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7940 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007941 else
7942 return "/lib64/ld-linux-x86-64.so.2";
7943}
7944
Renato Golinc4b49242014-02-13 10:01:16 +00007945static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007946 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007947 // Make use of compiler-rt if --rtlib option is used
7948 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7949
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007950 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007951 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007952 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007953 default:
7954 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007955 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007956 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007957 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007958 break;
7959 }
Renato Golinc4b49242014-02-13 10:01:16 +00007960 break;
7961 case ToolChain::RLT_Libgcc:
7962 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7963 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007964 }
7965}
7966
Rafael Espindola1e085772014-08-15 17:14:35 +00007967static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7968 switch (T.getArch()) {
7969 case llvm::Triple::x86:
7970 return "elf_i386";
7971 case llvm::Triple::aarch64:
7972 return "aarch64linux";
7973 case llvm::Triple::aarch64_be:
7974 return "aarch64_be_linux";
7975 case llvm::Triple::arm:
7976 case llvm::Triple::thumb:
7977 return "armelf_linux_eabi";
7978 case llvm::Triple::armeb:
7979 case llvm::Triple::thumbeb:
7980 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7981 case llvm::Triple::ppc:
7982 return "elf32ppclinux";
7983 case llvm::Triple::ppc64:
7984 return "elf64ppc";
7985 case llvm::Triple::ppc64le:
7986 return "elf64lppc";
7987 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007988 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007989 return "elf32_sparc";
7990 case llvm::Triple::sparcv9:
7991 return "elf64_sparc";
7992 case llvm::Triple::mips:
7993 return "elf32btsmip";
7994 case llvm::Triple::mipsel:
7995 return "elf32ltsmip";
7996 case llvm::Triple::mips64:
7997 if (mips::hasMipsAbiArg(Args, "n32"))
7998 return "elf32btsmipn32";
7999 return "elf64btsmip";
8000 case llvm::Triple::mips64el:
8001 if (mips::hasMipsAbiArg(Args, "n32"))
8002 return "elf32ltsmipn32";
8003 return "elf64ltsmip";
8004 case llvm::Triple::systemz:
8005 return "elf64_s390";
8006 case llvm::Triple::x86_64:
8007 if (T.getEnvironment() == llvm::Triple::GNUX32)
8008 return "elf32_x86_64";
8009 return "elf_x86_64";
8010 default:
8011 llvm_unreachable("Unexpected arch");
8012 }
8013}
8014
Douglas Katzman95354292015-06-23 20:42:09 +00008015void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8016 const InputInfo &Output,
8017 const InputInfoList &Inputs,
8018 const ArgList &Args,
8019 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008020 const toolchains::Linux &ToolChain =
8021 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008022 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008023 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008024 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008025 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008026 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008027 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8028 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008029
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008030 ArgStringList CmdArgs;
8031
Rafael Espindolad1002f62010-11-15 18:28:16 +00008032 // Silence warning for "clang -g foo.o -o foo"
8033 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008034 // and "clang -emit-llvm foo.o -o foo"
8035 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008036 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008037 // handled somewhere else.
8038 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008039
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008040 if (!D.SysRoot.empty())
8041 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008042
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008043 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008044 CmdArgs.push_back("-pie");
8045
Rafael Espindola1c76c592010-11-07 22:57:16 +00008046 if (Args.hasArg(options::OPT_rdynamic))
8047 CmdArgs.push_back("-export-dynamic");
8048
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008049 if (Args.hasArg(options::OPT_s))
8050 CmdArgs.push_back("-s");
8051
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008052 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
8053 arm::appendEBLinkFlags(
8054 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008055 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008056
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008057 for (const auto &Opt : ToolChain.ExtraOpts)
8058 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008059
8060 if (!Args.hasArg(options::OPT_static)) {
8061 CmdArgs.push_back("--eh-frame-hdr");
8062 }
8063
8064 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008065 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008066
8067 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008068 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8069 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008070 CmdArgs.push_back("-Bstatic");
8071 else
8072 CmdArgs.push_back("-static");
8073 } else if (Args.hasArg(options::OPT_shared)) {
8074 CmdArgs.push_back("-shared");
8075 }
8076
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008077 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8078 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008079 (!Args.hasArg(options::OPT_static) &&
8080 !Args.hasArg(options::OPT_shared))) {
8081 CmdArgs.push_back("-dynamic-linker");
8082 CmdArgs.push_back(Args.MakeArgString(
8083 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8084 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008085
8086 CmdArgs.push_back("-o");
8087 CmdArgs.push_back(Output.getFilename());
8088
Rafael Espindola81937ec2010-12-01 01:52:43 +00008089 if (!Args.hasArg(options::OPT_nostdlib) &&
8090 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008091 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008092 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008093 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008094 if (Args.hasArg(options::OPT_pg))
8095 crt1 = "gcrt1.o";
8096 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008097 crt1 = "Scrt1.o";
8098 else
8099 crt1 = "crt1.o";
8100 }
8101 if (crt1)
8102 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008103
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008104 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8105 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008106
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008107 const char *crtbegin;
8108 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008109 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008110 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008111 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008112 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008113 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008114 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008115 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008116 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008117
8118 // Add crtfastmath.o if available and fast math is enabled.
8119 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008120 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008121
8122 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008123 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008124
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008125 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008126
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008127 for (const auto &Path : Paths)
8128 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008129
Alexey Samsonov907880e2015-06-19 19:57:46 +00008130 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008131 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008132
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008133 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8134 CmdArgs.push_back("--no-demangle");
8135
Alexey Samsonov52550342014-09-15 19:58:40 +00008136 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008137 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008138 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008139 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008141 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008142 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008143 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008144 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008145 if (OnlyLibstdcxxStatic)
8146 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008147 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008148 if (OnlyLibstdcxxStatic)
8149 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008150 CmdArgs.push_back("-lm");
8151 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008152 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8153 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008154
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008155 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008156 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8157 if (Args.hasArg(options::OPT_static))
8158 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008159
Alexey Samsonov52550342014-09-15 19:58:40 +00008160 if (NeedsSanitizerDeps)
8161 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8162
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008163 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8164 Args.hasArg(options::OPT_pthreads);
8165
8166 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8167 options::OPT_fno_openmp, false)) {
8168 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8169 // FIXME: Does this really make sense for all GNU toolchains?
8170 WantPthread = true;
8171
8172 // Also link the particular OpenMP runtimes.
8173 switch (getOpenMPRuntime(ToolChain, Args)) {
8174 case OMPRT_OMP:
8175 CmdArgs.push_back("-lomp");
8176 break;
8177 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008178 CmdArgs.push_back("-lgomp");
8179
8180 // FIXME: Exclude this for platforms with libgomp that don't require
8181 // librt. Most modern Linux platforms require it, but some may not.
8182 CmdArgs.push_back("-lrt");
8183 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008184 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008185 CmdArgs.push_back("-liomp5");
8186 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008187 case OMPRT_Unknown:
8188 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008189 break;
8190 }
Chandler Carruth01538002013-01-17 13:19:29 +00008191 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008192
Renato Golinc4b49242014-02-13 10:01:16 +00008193 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008194
Richard Smith31d1de22015-05-20 22:48:44 +00008195 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008196 CmdArgs.push_back("-lpthread");
8197
8198 CmdArgs.push_back("-lc");
8199
8200 if (Args.hasArg(options::OPT_static))
8201 CmdArgs.push_back("--end-group");
8202 else
Renato Golinc4b49242014-02-13 10:01:16 +00008203 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008204 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008205
Rafael Espindola81937ec2010-12-01 01:52:43 +00008206 if (!Args.hasArg(options::OPT_nostartfiles)) {
8207 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008208 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008209 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008210 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008211 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008212 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008213 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008214
Rafael Espindola81937ec2010-12-01 01:52:43 +00008215 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008216 if (!isAndroid)
8217 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008218 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008219 }
8220
Justin Bognerd3371d82015-07-17 03:35:54 +00008221 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8222 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008223}
8224
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008225// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8226// for the various SFI requirements like register masking. The assembly tool
8227// inserts the file containing the macros as an input into all the assembly
8228// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008229void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8230 const InputInfo &Output,
8231 const InputInfoList &Inputs,
8232 const ArgList &Args,
8233 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008234 const toolchains::NaClToolChain &ToolChain =
8235 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008236 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8237 "nacl-arm-macros.s");
8238 InputInfoList NewInputs;
8239 NewInputs.push_back(NaClMacros);
8240 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008241 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8242 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008243}
8244
Douglas Katzman750cfc52015-06-29 18:42:16 +00008245// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008246// we use static by default, do not yet support sanitizers or LTO, and a few
8247// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008248// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008249void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8250 const InputInfo &Output,
8251 const InputInfoList &Inputs,
8252 const ArgList &Args,
8253 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008254
Douglas Katzman54366072015-07-27 16:53:08 +00008255 const toolchains::NaClToolChain &ToolChain =
8256 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008257 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008258 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008259 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008260 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008261
8262 ArgStringList CmdArgs;
8263
8264 // Silence warning for "clang -g foo.o -o foo"
8265 Args.ClaimAllArgs(options::OPT_g_Group);
8266 // and "clang -emit-llvm foo.o -o foo"
8267 Args.ClaimAllArgs(options::OPT_emit_llvm);
8268 // and for "clang -w foo.o -o foo". Other warning options are already
8269 // handled somewhere else.
8270 Args.ClaimAllArgs(options::OPT_w);
8271
8272 if (!D.SysRoot.empty())
8273 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8274
8275 if (Args.hasArg(options::OPT_rdynamic))
8276 CmdArgs.push_back("-export-dynamic");
8277
8278 if (Args.hasArg(options::OPT_s))
8279 CmdArgs.push_back("-s");
8280
Douglas Katzman54366072015-07-27 16:53:08 +00008281 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8282 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008283 CmdArgs.push_back("--build-id");
8284
8285 if (!IsStatic)
8286 CmdArgs.push_back("--eh-frame-hdr");
8287
8288 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008289 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008290 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008291 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008292 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008293 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008294 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008295 else if (Arch == llvm::Triple::mipsel)
8296 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008297 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008298 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8299 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008300
8301 if (IsStatic)
8302 CmdArgs.push_back("-static");
8303 else if (Args.hasArg(options::OPT_shared))
8304 CmdArgs.push_back("-shared");
8305
8306 CmdArgs.push_back("-o");
8307 CmdArgs.push_back(Output.getFilename());
8308 if (!Args.hasArg(options::OPT_nostdlib) &&
8309 !Args.hasArg(options::OPT_nostartfiles)) {
8310 if (!Args.hasArg(options::OPT_shared))
8311 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8313
8314 const char *crtbegin;
8315 if (IsStatic)
8316 crtbegin = "crtbeginT.o";
8317 else if (Args.hasArg(options::OPT_shared))
8318 crtbegin = "crtbeginS.o";
8319 else
8320 crtbegin = "crtbegin.o";
8321 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8322 }
8323
8324 Args.AddAllArgs(CmdArgs, options::OPT_L);
8325 Args.AddAllArgs(CmdArgs, options::OPT_u);
8326
8327 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8328
8329 for (const auto &Path : Paths)
8330 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8331
8332 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8333 CmdArgs.push_back("--no-demangle");
8334
8335 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8336
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008337 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008338 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008339 bool OnlyLibstdcxxStatic =
8340 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008341 if (OnlyLibstdcxxStatic)
8342 CmdArgs.push_back("-Bstatic");
8343 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8344 if (OnlyLibstdcxxStatic)
8345 CmdArgs.push_back("-Bdynamic");
8346 CmdArgs.push_back("-lm");
8347 }
8348
8349 if (!Args.hasArg(options::OPT_nostdlib)) {
8350 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8351 // Always use groups, since it has no effect on dynamic libraries.
8352 CmdArgs.push_back("--start-group");
8353 CmdArgs.push_back("-lc");
8354 // NaCl's libc++ currently requires libpthread, so just always include it
8355 // in the group for C++.
8356 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008357 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008358 // Gold, used by Mips, handles nested groups differently than ld, and
8359 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8360 // which is not a desired behaviour here.
8361 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8362 if (getToolChain().getArch() == llvm::Triple::mipsel)
8363 CmdArgs.push_back("-lnacl");
8364
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008365 CmdArgs.push_back("-lpthread");
8366 }
8367
8368 CmdArgs.push_back("-lgcc");
8369 CmdArgs.push_back("--as-needed");
8370 if (IsStatic)
8371 CmdArgs.push_back("-lgcc_eh");
8372 else
8373 CmdArgs.push_back("-lgcc_s");
8374 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008375
8376 // Mips needs to create and use pnacl_legacy library that contains
8377 // definitions from bitcode/pnaclmm.c and definitions for
8378 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8379 if (getToolChain().getArch() == llvm::Triple::mipsel)
8380 CmdArgs.push_back("-lpnacl_legacy");
8381
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008382 CmdArgs.push_back("--end-group");
8383 }
8384
8385 if (!Args.hasArg(options::OPT_nostartfiles)) {
8386 const char *crtend;
8387 if (Args.hasArg(options::OPT_shared))
8388 crtend = "crtendS.o";
8389 else
8390 crtend = "crtend.o";
8391
8392 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8393 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8394 }
8395 }
8396
Justin Bognerd3371d82015-07-17 03:35:54 +00008397 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8398 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008399}
8400
Douglas Katzman95354292015-06-23 20:42:09 +00008401void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8402 const InputInfo &Output,
8403 const InputInfoList &Inputs,
8404 const ArgList &Args,
8405 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008406 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008407 ArgStringList CmdArgs;
8408
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008409 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008410
8411 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008412 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008413
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008414 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008415 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008416
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008417 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008418 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008419}
8420
Douglas Katzman95354292015-06-23 20:42:09 +00008421void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8422 const InputInfo &Output,
8423 const InputInfoList &Inputs,
8424 const ArgList &Args,
8425 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008426 const Driver &D = getToolChain().getDriver();
8427 ArgStringList CmdArgs;
8428
Daniel Dunbarb440f562010-08-02 02:38:21 +00008429 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008430 CmdArgs.push_back("-o");
8431 CmdArgs.push_back(Output.getFilename());
8432 } else {
8433 assert(Output.isNothing() && "Invalid output.");
8434 }
8435
8436 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008437 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008438 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8439 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8440 CmdArgs.push_back(
8441 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8442 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008443 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008444
8445 Args.AddAllArgs(CmdArgs, options::OPT_L);
8446 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8447 Args.AddAllArgs(CmdArgs, options::OPT_e);
8448
Daniel Dunbar54423b22010-09-17 00:24:54 +00008449 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008450
Alexey Samsonov7811d192014-02-20 13:57:37 +00008451 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008452
Chris Lattner3e2ee142010-07-07 16:01:42 +00008453 if (!Args.hasArg(options::OPT_nostdlib) &&
8454 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008455 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008456 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008457 CmdArgs.push_back("-lm");
8458 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008459 }
8460
8461 if (!Args.hasArg(options::OPT_nostdlib) &&
8462 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008463 if (Args.hasArg(options::OPT_pthread))
8464 CmdArgs.push_back("-lpthread");
8465 CmdArgs.push_back("-lc");
8466 CmdArgs.push_back("-lCompilerRT-Generic");
8467 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8468 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008469 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008470 }
8471
Logan Chieneb9162f2014-06-26 14:23:45 +00008472 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008473 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008474}
8475
Daniel Dunbarcc912342009-05-02 18:28:39 +00008476/// DragonFly Tools
8477
8478// For now, DragonFly Assemble does just about the same as for
8479// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008480void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8481 const InputInfo &Output,
8482 const InputInfoList &Inputs,
8483 const ArgList &Args,
8484 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008485 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008486 ArgStringList CmdArgs;
8487
8488 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8489 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008490 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008491 CmdArgs.push_back("--32");
8492
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008493 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008494
8495 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008496 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008497
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008498 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008499 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008500
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008501 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008502 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008503}
8504
Douglas Katzman95354292015-06-23 20:42:09 +00008505void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8506 const InputInfo &Output,
8507 const InputInfoList &Inputs,
8508 const ArgList &Args,
8509 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008510 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008511 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008512 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008513
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008514 if (!D.SysRoot.empty())
8515 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8516
John McCall65b8da02013-04-11 22:55:55 +00008517 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008518 if (Args.hasArg(options::OPT_static)) {
8519 CmdArgs.push_back("-Bstatic");
8520 } else {
John McCall65b8da02013-04-11 22:55:55 +00008521 if (Args.hasArg(options::OPT_rdynamic))
8522 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008523 if (Args.hasArg(options::OPT_shared))
8524 CmdArgs.push_back("-Bshareable");
8525 else {
8526 CmdArgs.push_back("-dynamic-linker");
8527 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8528 }
John McCall65b8da02013-04-11 22:55:55 +00008529 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008530 }
8531
8532 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8533 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008534 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008535 CmdArgs.push_back("-m");
8536 CmdArgs.push_back("elf_i386");
8537 }
8538
Daniel Dunbarb440f562010-08-02 02:38:21 +00008539 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008540 CmdArgs.push_back("-o");
8541 CmdArgs.push_back(Output.getFilename());
8542 } else {
8543 assert(Output.isNothing() && "Invalid output.");
8544 }
8545
8546 if (!Args.hasArg(options::OPT_nostdlib) &&
8547 !Args.hasArg(options::OPT_nostartfiles)) {
8548 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008549 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008550 CmdArgs.push_back(
8551 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008552 else {
8553 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008554 CmdArgs.push_back(
8555 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008556 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008557 CmdArgs.push_back(
8558 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008559 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008560 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008561 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008562 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008563 CmdArgs.push_back(
8564 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008565 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008566 CmdArgs.push_back(
8567 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008568 }
8569
8570 Args.AddAllArgs(CmdArgs, options::OPT_L);
8571 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8572 Args.AddAllArgs(CmdArgs, options::OPT_e);
8573
Daniel Dunbar54423b22010-09-17 00:24:54 +00008574 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008575
8576 if (!Args.hasArg(options::OPT_nostdlib) &&
8577 !Args.hasArg(options::OPT_nodefaultlibs)) {
8578 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8579 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008580 if (UseGCC47)
8581 CmdArgs.push_back("-L/usr/lib/gcc47");
8582 else
8583 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008584
8585 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008586 if (UseGCC47) {
8587 CmdArgs.push_back("-rpath");
8588 CmdArgs.push_back("/usr/lib/gcc47");
8589 } else {
8590 CmdArgs.push_back("-rpath");
8591 CmdArgs.push_back("/usr/lib/gcc44");
8592 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008593 }
8594
Hans Wennborg70850d82013-07-18 20:29:38 +00008595 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008596 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008597 CmdArgs.push_back("-lm");
8598 }
8599
Daniel Dunbarcc912342009-05-02 18:28:39 +00008600 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008601 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008602
8603 if (!Args.hasArg(options::OPT_nolibc)) {
8604 CmdArgs.push_back("-lc");
8605 }
8606
John McCall65b8da02013-04-11 22:55:55 +00008607 if (UseGCC47) {
8608 if (Args.hasArg(options::OPT_static) ||
8609 Args.hasArg(options::OPT_static_libgcc)) {
8610 CmdArgs.push_back("-lgcc");
8611 CmdArgs.push_back("-lgcc_eh");
8612 } else {
8613 if (Args.hasArg(options::OPT_shared_libgcc)) {
8614 CmdArgs.push_back("-lgcc_pic");
8615 if (!Args.hasArg(options::OPT_shared))
8616 CmdArgs.push_back("-lgcc");
8617 } else {
8618 CmdArgs.push_back("-lgcc");
8619 CmdArgs.push_back("--as-needed");
8620 CmdArgs.push_back("-lgcc_pic");
8621 CmdArgs.push_back("--no-as-needed");
8622 }
8623 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008624 } else {
John McCall65b8da02013-04-11 22:55:55 +00008625 if (Args.hasArg(options::OPT_shared)) {
8626 CmdArgs.push_back("-lgcc_pic");
8627 } else {
8628 CmdArgs.push_back("-lgcc");
8629 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008630 }
8631 }
8632
8633 if (!Args.hasArg(options::OPT_nostdlib) &&
8634 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008635 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008636 CmdArgs.push_back(
8637 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008638 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008639 CmdArgs.push_back(
8640 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8641 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008642 }
8643
Alexey Samsonov7811d192014-02-20 13:57:37 +00008644 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008645
Logan Chieneb9162f2014-06-26 14:23:45 +00008646 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008648}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008649
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008650// Try to find Exe from a Visual Studio distribution. This first tries to find
8651// an installed copy of Visual Studio and, failing that, looks in the PATH,
8652// making sure that whatever executable that's found is not a same-named exe
8653// from clang itself to prevent clang from falling back to itself.
8654static std::string FindVisualStudioExecutable(const ToolChain &TC,
8655 const char *Exe,
8656 const char *ClangProgramPath) {
8657 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8658 std::string visualStudioBinDir;
8659 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8660 visualStudioBinDir)) {
8661 SmallString<128> FilePath(visualStudioBinDir);
8662 llvm::sys::path::append(FilePath, Exe);
8663 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8664 return FilePath.str();
8665 }
8666
8667 return Exe;
8668}
8669
Douglas Katzman95354292015-06-23 20:42:09 +00008670void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8671 const InputInfo &Output,
8672 const InputInfoList &Inputs,
8673 const ArgList &Args,
8674 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008675 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008676 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008677
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008678 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8679 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008680 CmdArgs.push_back(
8681 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008682
8683 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008684 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008685 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008686
Zachary Turner10d75b22014-10-22 20:40:43 +00008687 if (!llvm::sys::Process::GetEnv("LIB")) {
8688 // If the VC environment hasn't been configured (perhaps because the user
8689 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008690 // the environment variable is set however, assume the user knows what
8691 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008692 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008693 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008694 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8695 SmallString<128> LibDir(VisualStudioDir);
8696 llvm::sys::path::append(LibDir, "VC", "lib");
8697 switch (MSVC.getArch()) {
8698 case llvm::Triple::x86:
8699 // x86 just puts the libraries directly in lib
8700 break;
8701 case llvm::Triple::x86_64:
8702 llvm::sys::path::append(LibDir, "amd64");
8703 break;
8704 case llvm::Triple::arm:
8705 llvm::sys::path::append(LibDir, "arm");
8706 break;
8707 default:
8708 break;
8709 }
8710 CmdArgs.push_back(
8711 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8712 }
8713
8714 std::string WindowsSdkLibPath;
8715 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8716 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8717 WindowsSdkLibPath.c_str()));
8718 }
8719
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008720 CmdArgs.push_back("-nologo");
8721
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008722 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008723 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008724
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008725 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008726 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008727 if (DLL) {
8728 CmdArgs.push_back(Args.MakeArgString("-dll"));
8729
8730 SmallString<128> ImplibName(Output.getFilename());
8731 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008732 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008733 }
8734
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008735 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008736 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008737 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008738 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008739 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008740 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008741 };
8742 for (const auto &Component : CompilerRTComponents)
8743 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008744 // Make sure the dynamic runtime thunk is not optimized out at link time
8745 // to ensure proper SEH handling.
8746 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008747 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008748 CmdArgs.push_back(
8749 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008750 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008751 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008752 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008753 };
8754 for (const auto &Component : CompilerRTComponents)
8755 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008756 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008757 }
8758
Hans Wennborg2e274592013-08-13 23:38:57 +00008759 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008760
Reid Kleckner337188f2014-09-16 19:22:00 +00008761 // Add filenames, libraries, and other linker inputs.
8762 for (const auto &Input : Inputs) {
8763 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008764 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008765 continue;
8766 }
8767
8768 const Arg &A = Input.getInputArg();
8769
8770 // Render -l options differently for the MSVC linker.
8771 if (A.getOption().matches(options::OPT_l)) {
8772 StringRef Lib = A.getValue();
8773 const char *LinkLibArg;
8774 if (Lib.endswith(".lib"))
8775 LinkLibArg = Args.MakeArgString(Lib);
8776 else
8777 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8778 CmdArgs.push_back(LinkLibArg);
8779 continue;
8780 }
8781
8782 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8783 // or -L. Render it, even if MSVC doesn't understand it.
8784 A.renderAsInput(Args, CmdArgs);
8785 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008786
Zachary Turner719f58c2014-12-01 23:06:47 +00008787 // We need to special case some linker paths. In the case of lld, we need to
8788 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8789 // linker, we need to use a special search algorithm.
8790 llvm::SmallString<128> linkPath;
8791 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8792 if (Linker.equals_lower("lld"))
8793 Linker = "lld-link";
8794
8795 if (Linker.equals_lower("link")) {
8796 // If we're using the MSVC linker, it's not sufficient to just use link
8797 // from the program PATH, because other environments like GnuWin32 install
8798 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008799 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008800 C.getDriver().getClangProgramPath());
8801 } else {
8802 linkPath = Linker;
8803 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008804 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008805 }
8806
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008807 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00008808 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008809}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008810
Douglas Katzman95354292015-06-23 20:42:09 +00008811void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8812 const InputInfo &Output,
8813 const InputInfoList &Inputs,
8814 const ArgList &Args,
8815 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008816 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8817}
8818
Douglas Katzman95354292015-06-23 20:42:09 +00008819std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008820 Compilation &C, const JobAction &JA, const InputInfo &Output,
8821 const InputInfoList &Inputs, const ArgList &Args,
8822 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008823 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008824 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008825 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008826 CmdArgs.push_back("/W0"); // No warnings.
8827
8828 // The goal is to be able to invoke this tool correctly based on
8829 // any flag accepted by clang-cl.
8830
8831 // These are spelled the same way in clang and cl.exe,.
8832 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8833 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008834
8835 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00008836 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
8837 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
8838 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008839 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8840 if (A->getOption().getID() == options::OPT_O0) {
8841 CmdArgs.push_back("/Od");
8842 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00008843 CmdArgs.push_back("/Og");
8844
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008845 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00008846 if (OptLevel == "s" || OptLevel == "z")
8847 CmdArgs.push_back("/Os");
8848 else
8849 CmdArgs.push_back("/Ot");
8850
8851 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008852 }
8853 }
David Majnemer015ce0f2015-07-27 07:32:11 +00008854 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
8855 options::OPT_fno_omit_frame_pointer))
8856 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
8857 ? "/Oy"
8858 : "/Oy-");
8859 if (!Args.hasArg(options::OPT_fwritable_strings))
8860 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008861
Nico Weber3f8dafb2015-03-12 19:37:10 +00008862 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008863 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8864
David Majnemerf6072342014-07-01 22:24:56 +00008865 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8866 /*default=*/false))
8867 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008868 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8869 options::OPT_fno_function_sections))
8870 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8871 ? "/Gy"
8872 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008873 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8874 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008875 CmdArgs.push_back(
8876 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008877 if (Args.hasArg(options::OPT_fsyntax_only))
8878 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008879 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8880 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008881
Nico Weber3f8dafb2015-03-12 19:37:10 +00008882 std::vector<std::string> Includes =
8883 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008884 for (const auto &Include : Includes)
8885 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008886
Hans Wennborg87cfa712013-09-19 20:32:16 +00008887 // Flags that can simply be passed through.
8888 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8889 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008890 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00008891 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008892
8893 // The order of these flags is relevant, so pick the last one.
8894 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8895 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8896 A->render(Args, CmdArgs);
8897
Hans Wennborg87cfa712013-09-19 20:32:16 +00008898 // Input filename.
8899 assert(Inputs.size() == 1);
8900 const InputInfo &II = Inputs[0];
8901 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8902 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8903 if (II.isFilename())
8904 CmdArgs.push_back(II.getFilename());
8905 else
8906 II.getInputArg().renderAsInput(Args, CmdArgs);
8907
8908 // Output filename.
8909 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008910 const char *Fo =
8911 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00008912 CmdArgs.push_back(Fo);
8913
Hans Wennborg188382e2013-09-20 18:16:35 +00008914 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008915 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8916 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008917 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00008918 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008919}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008920
Yaron Keren1c0070c2015-07-02 04:45:27 +00008921/// MinGW Tools
8922void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8923 const InputInfo &Output,
8924 const InputInfoList &Inputs,
8925 const ArgList &Args,
8926 const char *LinkingOutput) const {
8927 claimNoWarnArgs(Args);
8928 ArgStringList CmdArgs;
8929
8930 if (getToolChain().getArch() == llvm::Triple::x86) {
8931 CmdArgs.push_back("--32");
8932 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
8933 CmdArgs.push_back("--64");
8934 }
8935
8936 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8937
8938 CmdArgs.push_back("-o");
8939 CmdArgs.push_back(Output.getFilename());
8940
8941 for (const auto &II : Inputs)
8942 CmdArgs.push_back(II.getFilename());
8943
8944 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008945 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00008946
8947 if (Args.hasArg(options::OPT_gsplit_dwarf))
8948 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
8949 SplitDebugName(Args, Inputs[0]));
8950}
8951
8952void MinGW::Linker::AddLibGCC(const ArgList &Args,
8953 ArgStringList &CmdArgs) const {
8954 if (Args.hasArg(options::OPT_mthreads))
8955 CmdArgs.push_back("-lmingwthrd");
8956 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00008957
8958 // Add libgcc or compiler-rt.
8959 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
8960
Yaron Keren1c0070c2015-07-02 04:45:27 +00008961 CmdArgs.push_back("-lmoldname");
8962 CmdArgs.push_back("-lmingwex");
8963 CmdArgs.push_back("-lmsvcrt");
8964}
8965
8966void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8967 const InputInfo &Output,
8968 const InputInfoList &Inputs,
8969 const ArgList &Args,
8970 const char *LinkingOutput) const {
8971 const ToolChain &TC = getToolChain();
8972 const Driver &D = TC.getDriver();
8973 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
8974
8975 ArgStringList CmdArgs;
8976
8977 // Silence warning for "clang -g foo.o -o foo"
8978 Args.ClaimAllArgs(options::OPT_g_Group);
8979 // and "clang -emit-llvm foo.o -o foo"
8980 Args.ClaimAllArgs(options::OPT_emit_llvm);
8981 // and for "clang -w foo.o -o foo". Other warning options are already
8982 // handled somewhere else.
8983 Args.ClaimAllArgs(options::OPT_w);
8984
Yaron Keren2ffb36e2015-07-14 05:23:34 +00008985 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
8986 if (LinkerName.equals_lower("lld")) {
8987 CmdArgs.push_back("-flavor");
8988 CmdArgs.push_back("gnu");
8989 }
8990
Yaron Keren1c0070c2015-07-02 04:45:27 +00008991 if (!D.SysRoot.empty())
8992 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8993
8994 if (Args.hasArg(options::OPT_s))
8995 CmdArgs.push_back("-s");
8996
8997 CmdArgs.push_back("-m");
8998 if (TC.getArch() == llvm::Triple::x86)
8999 CmdArgs.push_back("i386pe");
9000 if (TC.getArch() == llvm::Triple::x86_64)
9001 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009002 if (TC.getArch() == llvm::Triple::arm)
9003 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009004
9005 if (Args.hasArg(options::OPT_mwindows)) {
9006 CmdArgs.push_back("--subsystem");
9007 CmdArgs.push_back("windows");
9008 } else if (Args.hasArg(options::OPT_mconsole)) {
9009 CmdArgs.push_back("--subsystem");
9010 CmdArgs.push_back("console");
9011 }
9012
9013 if (Args.hasArg(options::OPT_static))
9014 CmdArgs.push_back("-Bstatic");
9015 else {
9016 if (Args.hasArg(options::OPT_mdll))
9017 CmdArgs.push_back("--dll");
9018 else if (Args.hasArg(options::OPT_shared))
9019 CmdArgs.push_back("--shared");
9020 CmdArgs.push_back("-Bdynamic");
9021 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9022 CmdArgs.push_back("-e");
9023 if (TC.getArch() == llvm::Triple::x86)
9024 CmdArgs.push_back("_DllMainCRTStartup@12");
9025 else
9026 CmdArgs.push_back("DllMainCRTStartup");
9027 CmdArgs.push_back("--enable-auto-image-base");
9028 }
9029 }
9030
9031 CmdArgs.push_back("-o");
9032 CmdArgs.push_back(Output.getFilename());
9033
9034 Args.AddAllArgs(CmdArgs, options::OPT_e);
9035 // FIXME: add -N, -n flags
9036 Args.AddLastArg(CmdArgs, options::OPT_r);
9037 Args.AddLastArg(CmdArgs, options::OPT_s);
9038 Args.AddLastArg(CmdArgs, options::OPT_t);
9039 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9040 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9041
9042 if (!Args.hasArg(options::OPT_nostdlib) &&
9043 !Args.hasArg(options::OPT_nostartfiles)) {
9044 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9045 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9046 } else {
9047 if (Args.hasArg(options::OPT_municode))
9048 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9049 else
9050 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9051 }
9052 if (Args.hasArg(options::OPT_pg))
9053 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9054 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9055 }
9056
9057 Args.AddAllArgs(CmdArgs, options::OPT_L);
9058 const ToolChain::path_list Paths = TC.getFilePaths();
9059 for (const auto &Path : Paths)
9060 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9061
9062 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9063
9064 // TODO: Add ASan stuff here
9065
9066 // TODO: Add profile stuff here
9067
9068 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9069 !Args.hasArg(options::OPT_nodefaultlibs)) {
9070 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9071 !Args.hasArg(options::OPT_static);
9072 if (OnlyLibstdcxxStatic)
9073 CmdArgs.push_back("-Bstatic");
9074 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9075 if (OnlyLibstdcxxStatic)
9076 CmdArgs.push_back("-Bdynamic");
9077 }
9078
9079 if (!Args.hasArg(options::OPT_nostdlib)) {
9080 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9081 if (Args.hasArg(options::OPT_static))
9082 CmdArgs.push_back("--start-group");
9083
9084 if (Args.hasArg(options::OPT_fstack_protector) ||
9085 Args.hasArg(options::OPT_fstack_protector_strong) ||
9086 Args.hasArg(options::OPT_fstack_protector_all)) {
9087 CmdArgs.push_back("-lssp_nonshared");
9088 CmdArgs.push_back("-lssp");
9089 }
9090 if (Args.hasArg(options::OPT_fopenmp))
9091 CmdArgs.push_back("-lgomp");
9092
9093 AddLibGCC(Args, CmdArgs);
9094
9095 if (Args.hasArg(options::OPT_pg))
9096 CmdArgs.push_back("-lgmon");
9097
Yaron Kerenadce68e2015-07-06 18:52:19 +00009098 if (Args.hasArg(options::OPT_pthread))
9099 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009100
9101 // add system libraries
9102 if (Args.hasArg(options::OPT_mwindows)) {
9103 CmdArgs.push_back("-lgdi32");
9104 CmdArgs.push_back("-lcomdlg32");
9105 }
9106 CmdArgs.push_back("-ladvapi32");
9107 CmdArgs.push_back("-lshell32");
9108 CmdArgs.push_back("-luser32");
9109 CmdArgs.push_back("-lkernel32");
9110
9111 if (Args.hasArg(options::OPT_static))
9112 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009113 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009114 AddLibGCC(Args, CmdArgs);
9115 }
9116
9117 if (!Args.hasArg(options::OPT_nostartfiles)) {
9118 // Add crtfastmath.o if available and fast math is enabled.
9119 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9120
9121 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9122 }
9123 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009124 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009125 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009126}
9127
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009128/// XCore Tools
9129// We pass assemble and link construction to the xcc tool.
9130
Douglas Katzman95354292015-06-23 20:42:09 +00009131void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9132 const InputInfo &Output,
9133 const InputInfoList &Inputs,
9134 const ArgList &Args,
9135 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009136 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009137 ArgStringList CmdArgs;
9138
9139 CmdArgs.push_back("-o");
9140 CmdArgs.push_back(Output.getFilename());
9141
9142 CmdArgs.push_back("-c");
9143
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009144 if (Args.hasArg(options::OPT_v))
9145 CmdArgs.push_back("-v");
9146
Robert Lytton894d25c2014-05-02 09:33:25 +00009147 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9148 if (!A->getOption().matches(options::OPT_g0))
9149 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009150
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009151 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9152 false))
9153 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009155 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009156
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009157 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009158 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009159
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009160 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009161 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009162}
9163
Douglas Katzman95354292015-06-23 20:42:09 +00009164void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9165 const InputInfo &Output,
9166 const InputInfoList &Inputs,
9167 const ArgList &Args,
9168 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009169 ArgStringList CmdArgs;
9170
9171 if (Output.isFilename()) {
9172 CmdArgs.push_back("-o");
9173 CmdArgs.push_back(Output.getFilename());
9174 } else {
9175 assert(Output.isNothing() && "Invalid output.");
9176 }
9177
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009178 if (Args.hasArg(options::OPT_v))
9179 CmdArgs.push_back("-v");
9180
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009181 // Pass -fexceptions through to the linker if it was present.
9182 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9183 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009184 CmdArgs.push_back("-fexceptions");
9185
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009186 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9187
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009188 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009189 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009190}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009191
Douglas Katzman95354292015-06-23 20:42:09 +00009192void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9193 const InputInfo &Output,
9194 const InputInfoList &Inputs,
9195 const ArgList &Args,
9196 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009197 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009198 const auto &TC =
9199 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9200 ArgStringList CmdArgs;
9201 const char *Exec;
9202
9203 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009204 default:
9205 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009206 case llvm::Triple::arm:
9207 case llvm::Triple::thumb:
9208 break;
9209 case llvm::Triple::x86:
9210 CmdArgs.push_back("--32");
9211 break;
9212 case llvm::Triple::x86_64:
9213 CmdArgs.push_back("--64");
9214 break;
9215 }
9216
9217 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9218
9219 CmdArgs.push_back("-o");
9220 CmdArgs.push_back(Output.getFilename());
9221
9222 for (const auto &Input : Inputs)
9223 CmdArgs.push_back(Input.getFilename());
9224
9225 const std::string Assembler = TC.GetProgramPath("as");
9226 Exec = Args.MakeArgString(Assembler);
9227
Justin Bognerd3371d82015-07-17 03:35:54 +00009228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009229}
9230
Douglas Katzman95354292015-06-23 20:42:09 +00009231void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9232 const InputInfo &Output,
9233 const InputInfoList &Inputs,
9234 const ArgList &Args,
9235 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009236 const auto &TC =
9237 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9238 const llvm::Triple &T = TC.getTriple();
9239 const Driver &D = TC.getDriver();
9240 SmallString<128> EntryPoint;
9241 ArgStringList CmdArgs;
9242 const char *Exec;
9243
9244 // Silence warning for "clang -g foo.o -o foo"
9245 Args.ClaimAllArgs(options::OPT_g_Group);
9246 // and "clang -emit-llvm foo.o -o foo"
9247 Args.ClaimAllArgs(options::OPT_emit_llvm);
9248 // and for "clang -w foo.o -o foo"
9249 Args.ClaimAllArgs(options::OPT_w);
9250 // Other warning options are already handled somewhere else.
9251
9252 if (!D.SysRoot.empty())
9253 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9254
9255 if (Args.hasArg(options::OPT_pie))
9256 CmdArgs.push_back("-pie");
9257 if (Args.hasArg(options::OPT_rdynamic))
9258 CmdArgs.push_back("-export-dynamic");
9259 if (Args.hasArg(options::OPT_s))
9260 CmdArgs.push_back("--strip-all");
9261
9262 CmdArgs.push_back("-m");
9263 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009264 default:
9265 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009266 case llvm::Triple::arm:
9267 case llvm::Triple::thumb:
9268 // FIXME: this is incorrect for WinCE
9269 CmdArgs.push_back("thumb2pe");
9270 break;
9271 case llvm::Triple::x86:
9272 CmdArgs.push_back("i386pe");
9273 EntryPoint.append("_");
9274 break;
9275 case llvm::Triple::x86_64:
9276 CmdArgs.push_back("i386pep");
9277 break;
9278 }
9279
9280 if (Args.hasArg(options::OPT_shared)) {
9281 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009282 default:
9283 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009284 case llvm::Triple::arm:
9285 case llvm::Triple::thumb:
9286 case llvm::Triple::x86_64:
9287 EntryPoint.append("_DllMainCRTStartup");
9288 break;
9289 case llvm::Triple::x86:
9290 EntryPoint.append("_DllMainCRTStartup@12");
9291 break;
9292 }
9293
9294 CmdArgs.push_back("-shared");
9295 CmdArgs.push_back("-Bdynamic");
9296
9297 CmdArgs.push_back("--enable-auto-image-base");
9298
9299 CmdArgs.push_back("--entry");
9300 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9301 } else {
9302 EntryPoint.append("mainCRTStartup");
9303
9304 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9305 : "-Bdynamic");
9306
9307 if (!Args.hasArg(options::OPT_nostdlib) &&
9308 !Args.hasArg(options::OPT_nostartfiles)) {
9309 CmdArgs.push_back("--entry");
9310 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9311 }
9312
9313 // FIXME: handle subsystem
9314 }
9315
9316 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009317 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009318
9319 CmdArgs.push_back("-o");
9320 CmdArgs.push_back(Output.getFilename());
9321
9322 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9323 SmallString<261> ImpLib(Output.getFilename());
9324 llvm::sys::path::replace_extension(ImpLib, ".lib");
9325
9326 CmdArgs.push_back("--out-implib");
9327 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9328 }
9329
9330 if (!Args.hasArg(options::OPT_nostdlib) &&
9331 !Args.hasArg(options::OPT_nostartfiles)) {
9332 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9333 const char *CRTBegin;
9334
9335 CRTBegin =
9336 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9337 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9338 }
9339
9340 Args.AddAllArgs(CmdArgs, options::OPT_L);
9341
9342 const auto &Paths = TC.getFilePaths();
9343 for (const auto &Path : Paths)
9344 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9345
9346 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9347
9348 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9349 !Args.hasArg(options::OPT_nodefaultlibs)) {
9350 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9351 !Args.hasArg(options::OPT_static);
9352 if (StaticCXX)
9353 CmdArgs.push_back("-Bstatic");
9354 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9355 if (StaticCXX)
9356 CmdArgs.push_back("-Bdynamic");
9357 }
9358
9359 if (!Args.hasArg(options::OPT_nostdlib)) {
9360 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9361 // TODO handle /MT[d] /MD[d]
9362 CmdArgs.push_back("-lmsvcrt");
9363 AddRunTimeLibs(TC, D, CmdArgs, Args);
9364 }
9365 }
9366
9367 const std::string Linker = TC.GetProgramPath("ld");
9368 Exec = Args.MakeArgString(Linker);
9369
Justin Bognerd3371d82015-07-17 03:35:54 +00009370 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009371}
Douglas Katzman84a75642015-06-19 14:55:19 +00009372
Douglas Katzman95354292015-06-23 20:42:09 +00009373void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9374 const InputInfo &Output,
9375 const InputInfoList &Inputs,
9376 const ArgList &Args,
9377 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009378
9379 ArgStringList CmdArgs;
9380
9381 assert(Inputs.size() == 1);
9382 const InputInfo &II = Inputs[0];
9383 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9384 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9385
9386 // Append all -I, -iquote, -isystem paths.
9387 Args.AddAllArgs(CmdArgs, options::OPT_clang_i_Group);
9388 // These are spelled the same way in clang and moviCompile.
9389 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
9390
9391 CmdArgs.push_back("-DMYRIAD2");
9392 CmdArgs.push_back("-mcpu=myriad2");
9393 CmdArgs.push_back("-S");
9394
9395 // Any -O option passes through without translation. What about -Ofast ?
9396 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9397 A->render(Args, CmdArgs);
9398
9399 if (Args.hasFlag(options::OPT_ffunction_sections,
9400 options::OPT_fno_function_sections)) {
9401 CmdArgs.push_back("-ffunction-sections");
9402 }
9403 if (Args.hasArg(options::OPT_fno_inline_functions))
9404 CmdArgs.push_back("-fno-inline-functions");
9405
9406 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9407
9408 CmdArgs.push_back(II.getFilename());
9409 CmdArgs.push_back("-o");
9410 CmdArgs.push_back(Output.getFilename());
9411
9412 std::string Exec =
9413 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009414 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9415 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009416}
9417
Douglas Katzman95354292015-06-23 20:42:09 +00009418void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9419 const InputInfo &Output,
9420 const InputInfoList &Inputs,
9421 const ArgList &Args,
9422 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009423 ArgStringList CmdArgs;
9424
9425 assert(Inputs.size() == 1);
9426 const InputInfo &II = Inputs[0];
9427 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9428 assert(Output.getType() == types::TY_Object);
9429
9430 CmdArgs.push_back("-no6thSlotCompression");
9431 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9432 CmdArgs.push_back("-noSPrefixing");
9433 CmdArgs.push_back("-a"); // Mystery option.
9434 for (auto Arg : Args.filtered(options::OPT_I)) {
9435 Arg->claim();
9436 CmdArgs.push_back(
9437 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9438 }
9439 CmdArgs.push_back("-elf"); // Output format.
9440 CmdArgs.push_back(II.getFilename());
9441 CmdArgs.push_back(
9442 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9443
9444 std::string Exec =
9445 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009446 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9447 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009448}