blob: 1b990cfdb25399e51cb88f1d4609815c44a61ef4 [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) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000641 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
642 if (!ForAS) {
643 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
644 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
645 // stripped out by the ARM target. We should probably pass this a new
646 // -target-option, which is handled by the -cc1/-cc1as invocation.
647 //
648 // FIXME2: For consistency, it would be ideal if we set up the target
649 // machine state the same when using the frontend or the assembler. We don't
650 // currently do that for the assembler, we pass the options directly to the
651 // backend and never even instantiate the frontend TargetInfo. If we did,
652 // and used its handleTargetFeatures hook, then we could ensure the
653 // assembler and the frontend behave the same.
654
655 // Use software floating point operations?
656 if (FloatABI == "soft")
657 Features.push_back("+soft-float");
658
659 // Use software floating point argument passing?
660 if (FloatABI != "hard")
661 Features.push_back("+soft-float-abi");
662 }
663
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000664 // Honor -mfpu=.
665 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000666 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000667 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
668 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000669
John Brawna8f82342015-05-29 13:10:44 +0000670 // Check if -march is valid by checking if it can be canonicalised and parsed.
671 // getARMArch is used here instead of just checking the -march value in order
672 // to handle -march=native correctly.
John Brawn94fd9632015-05-21 12:19:49 +0000673 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000674 std::string Arch = arm::getARMArch(Args, Triple);
John Brawna8f82342015-05-29 13:10:44 +0000675 if (llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_INVALID)
John Brawna95c1a82015-05-08 12:52:18 +0000676 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000677 }
678
679 // We do a similar thing with -mcpu, but here things are complicated because
680 // the only function we have to check if a cpu is valid is
681 // getLLVMArchSuffixForARM which also needs an architecture.
682 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000683 std::string CPU = arm::getARMTargetCPU(Args, Triple);
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000684 std::string Arch = arm::getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000685 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
686 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
687 }
John Brawna95c1a82015-05-08 12:52:18 +0000688
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000689 // Setting -msoft-float effectively disables NEON because of the GCC
690 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000691 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000692 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000693 // Also need to explicitly disable features which imply NEON.
694 Features.push_back("-crypto");
695 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000696
Eric Christopher269c2a22015-04-04 03:34:43 +0000697 // En/disable crc code generation.
698 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000699 if (A->getOption().matches(options::OPT_mcrc))
700 Features.push_back("+crc");
701 else
702 Features.push_back("-crc");
703 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000704
705 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
706 Features.insert(Features.begin(), "+v8.1a");
707 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000708}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000709
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000710void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000711 bool KernelOrKext) const {
712 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000713 // Get the effective triple, which takes into account the deployment target.
714 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
715 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000716
717 // Select the ABI to use.
718 //
719 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000720 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000721 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000722 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000723 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000724 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000725 // The backend is hardwired to assume AAPCS for M-class processors, ensure
726 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000727 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000728 Triple.getOS() == llvm::Triple::UnknownOS || isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000729 ABIName = "aapcs";
730 } else {
731 ABIName = "apcs-gnu";
732 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000733 } else if (Triple.isOSWindows()) {
734 // FIXME: this is invalid for WindowsCE
735 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000736 } else {
737 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000738 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000739 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000740 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000741 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000742 ABIName = "aapcs-linux";
743 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000744 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000745 case llvm::Triple::EABI:
746 ABIName = "aapcs";
747 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000748 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000749 if (Triple.getOS() == llvm::Triple::NetBSD)
750 ABIName = "apcs-gnu";
751 else
752 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000753 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000754 }
755 }
756 CmdArgs.push_back("-target-abi");
757 CmdArgs.push_back(ABIName);
758
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000759 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000760 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 if (FloatABI == "soft") {
762 // Floating point operations and argument passing are soft.
763 //
764 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000765 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000766 CmdArgs.push_back("-mfloat-abi");
767 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000768 } else if (FloatABI == "softfp") {
769 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000770 CmdArgs.push_back("-mfloat-abi");
771 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000772 } else {
773 // Floating point operations and argument passing are hard.
774 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000775 CmdArgs.push_back("-mfloat-abi");
776 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000777 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000778
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000779 // Kernel code has more strict alignment requirements.
780 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000781 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000782 CmdArgs.push_back("-backend-option");
783 CmdArgs.push_back("-arm-long-calls");
784 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000785
Daniel Dunbar12100e22011-03-22 16:48:17 +0000786 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000787 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000788
789 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000790 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000791 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000792 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000793
Bob Wilson0874e532014-07-29 00:23:18 +0000794 // -mkernel implies -mstrict-align; don't add the redundant option.
795 if (!KernelOrKext) {
796 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
797 options::OPT_munaligned_access)) {
798 CmdArgs.push_back("-backend-option");
799 if (A->getOption().matches(options::OPT_mno_unaligned_access))
800 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000801 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000802 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000803 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000804 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000805 }
Bob Wilson0874e532014-07-29 00:23:18 +0000806 }
807 }
808
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000809 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000810 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
811 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000812 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000813 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000814 CmdArgs.push_back("-arm-global-merge=false");
815 else
816 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000817 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000818
Bob Wilson9c8af452013-04-11 18:53:25 +0000819 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000820 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000821 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000822
Logan Chien749763e2014-04-03 13:12:44 +0000823 // llvm does not support reserving registers in general. There is support
824 // for reserving r9 on ARM though (defined as a platform-specific register
825 // in ARM EABI).
826 if (Args.hasArg(options::OPT_ffixed_r9)) {
827 CmdArgs.push_back("-backend-option");
828 CmdArgs.push_back("-arm-reserve-r9");
829 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000830}
831
Tim Northover573cbee2014-05-24 12:52:07 +0000832/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
833/// targeting.
834static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000835 Arg *A;
836 std::string CPU;
837 // If we have -mtune or -mcpu, use that.
838 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
839 CPU = A->getValue();
840 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000841 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000842 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000843 }
844
Kevin Qin110db6f2014-07-18 07:03:22 +0000845 // Handle CPU name is 'native'.
846 if (CPU == "native")
847 return llvm::sys::getHostCPUName();
848 else if (CPU.size())
849 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000850
James Molloy9b1586b2014-04-17 12:51:17 +0000851 // Make sure we pick "cyclone" if -arch is used.
852 // FIXME: Should this be picked by checking the target triple instead?
853 if (Args.getLastArg(options::OPT_arch))
854 return "cyclone";
855
856 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000857}
858
Tim Northover573cbee2014-05-24 12:52:07 +0000859void Clang::AddAArch64TargetArgs(const ArgList &Args,
860 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000861 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
862 llvm::Triple Triple(TripleStr);
863
864 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
865 Args.hasArg(options::OPT_mkernel) ||
866 Args.hasArg(options::OPT_fapple_kext))
867 CmdArgs.push_back("-disable-red-zone");
868
869 if (!Args.hasFlag(options::OPT_mimplicit_float,
870 options::OPT_mno_implicit_float, true))
871 CmdArgs.push_back("-no-implicit-float");
872
Craig Topper92fc2df2014-05-17 16:56:41 +0000873 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000874 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
875 ABIName = A->getValue();
876 else if (Triple.isOSDarwin())
877 ABIName = "darwinpcs";
878 else
879 ABIName = "aapcs";
880
881 CmdArgs.push_back("-target-abi");
882 CmdArgs.push_back(ABIName);
883
Bob Wilson0874e532014-07-29 00:23:18 +0000884 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
885 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000886 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000887 if (A->getOption().matches(options::OPT_mno_unaligned_access))
888 CmdArgs.push_back("-aarch64-strict-align");
889 else
890 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000891 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000892
Bradley Smith9ff64332014-10-13 10:16:06 +0000893 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
894 options::OPT_mno_fix_cortex_a53_835769)) {
895 CmdArgs.push_back("-backend-option");
896 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
897 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
898 else
899 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000900 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
901 // Enabled A53 errata (835769) workaround by default on android
902 CmdArgs.push_back("-backend-option");
903 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000904 }
905
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000906 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000907 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
908 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000909 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000910 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000911 CmdArgs.push_back("-aarch64-global-merge=false");
912 else
913 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000914 }
Renato Golinb625f482015-01-25 23:17:48 +0000915
916 if (Args.hasArg(options::OPT_ffixed_x18)) {
917 CmdArgs.push_back("-backend-option");
918 CmdArgs.push_back("-aarch64-reserve-x18");
919 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000920}
921
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000922// Get CPU and ABI names. They are not independent
923// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000924void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
925 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000926 const char *DefMips32CPU = "mips32r2";
927 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000928
Daniel Sanders2bf13662014-07-10 14:40:57 +0000929 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
930 // default for mips64(el)?-img-linux-gnu.
931 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
932 Triple.getEnvironment() == llvm::Triple::GNU) {
933 DefMips32CPU = "mips32r6";
934 DefMips64CPU = "mips64r6";
935 }
936
Brad Smithba26f582015-01-06 02:53:17 +0000937 // MIPS3 is the default for mips64*-unknown-openbsd.
938 if (Triple.getOS() == llvm::Triple::OpenBSD)
939 DefMips64CPU = "mips3";
940
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000941 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000942 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000943
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000944 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000945 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000946 // Convert a GNU style Mips ABI name to the name
947 // accepted by LLVM Mips backend.
948 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000949 .Case("32", "o32")
950 .Case("64", "n64")
951 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000952 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000953
954 // Setup default CPU and ABI names.
955 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000956 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000957 default:
958 llvm_unreachable("Unexpected triple arch name");
959 case llvm::Triple::mips:
960 case llvm::Triple::mipsel:
961 CPUName = DefMips32CPU;
962 break;
963 case llvm::Triple::mips64:
964 case llvm::Triple::mips64el:
965 CPUName = DefMips64CPU;
966 break;
967 }
968 }
969
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000970 if (ABIName.empty()) {
971 // Deduce ABI name from the target triple.
972 if (Triple.getArch() == llvm::Triple::mips ||
973 Triple.getArch() == llvm::Triple::mipsel)
974 ABIName = "o32";
975 else
976 ABIName = "n64";
977 }
978
979 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000980 // Deduce CPU name from ABI name.
981 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000982 .Cases("o32", "eabi", DefMips32CPU)
983 .Cases("n32", "n64", DefMips64CPU)
984 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000985 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +0000986
987 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000988}
989
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000990// Convert ABI name to the GNU tools acceptable variant.
991static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
992 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000993 .Case("o32", "32")
994 .Case("n64", "64")
995 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000996}
997
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000998// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
999// and -mfloat-abi=.
1000static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001001 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001002 if (Arg *A =
1003 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1004 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001005 if (A->getOption().matches(options::OPT_msoft_float))
1006 FloatABI = "soft";
1007 else if (A->getOption().matches(options::OPT_mhard_float))
1008 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001009 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001010 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001011 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001012 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001013 FloatABI = "hard";
1014 }
1015 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001016 }
1017
1018 // If unspecified, choose the default based on the platform.
1019 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001020 // Assume "hard", because it's a default value used by gcc.
1021 // When we start to recognize specific target MIPS processors,
1022 // we will be able to select the default more correctly.
1023 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001024 }
1025
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001026 return FloatABI;
1027}
1028
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001029static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001030 std::vector<const char *> &Features,
1031 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001032 StringRef FeatureName) {
1033 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001034 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001035 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001036 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001037 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001038 }
1039}
1040
Daniel Sanders379d44b2014-07-16 11:52:23 +00001041static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1042 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001043 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001044 StringRef CPUName;
1045 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001046 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001047 ABIName = getGnuCompatibleMipsABIName(ABIName);
1048
Daniel Sandersfeb61302014-08-08 15:47:17 +00001049 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1050 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001051
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001052 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001053 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001054 // FIXME: Note, this is a hack. We need to pass the selected float
1055 // mode to the MipsTargetInfoBase to define appropriate macros there.
1056 // Now it is the only method.
1057 Features.push_back("+soft-float");
1058 }
1059
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001060 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001061 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001062 if (Val == "2008") {
1063 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1064 Features.push_back("+nan2008");
1065 else {
1066 Features.push_back("-nan2008");
1067 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1068 }
1069 } else if (Val == "legacy") {
1070 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1071 Features.push_back("-nan2008");
1072 else {
1073 Features.push_back("+nan2008");
1074 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1075 }
1076 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001077 D.Diag(diag::err_drv_unsupported_option_argument)
1078 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001079 }
1080
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001081 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1082 options::OPT_mdouble_float, "single-float");
1083 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1084 "mips16");
1085 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1086 options::OPT_mno_micromips, "micromips");
1087 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1088 "dsp");
1089 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1090 "dspr2");
1091 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1092 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001093
1094 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1095 // pass -mfpxx
1096 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1097 options::OPT_mfp64)) {
1098 if (A->getOption().matches(options::OPT_mfp32))
1099 Features.push_back(Args.MakeArgString("-fp64"));
1100 else if (A->getOption().matches(options::OPT_mfpxx)) {
1101 Features.push_back(Args.MakeArgString("+fpxx"));
1102 Features.push_back(Args.MakeArgString("+nooddspreg"));
1103 } else
1104 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001105 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001106 Features.push_back(Args.MakeArgString("+fpxx"));
1107 Features.push_back(Args.MakeArgString("+nooddspreg"));
1108 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001109
Daniel Sanders28e5d392014-07-10 10:39:51 +00001110 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1111 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001112}
1113
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001114void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001115 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001116 const Driver &D = getToolChain().getDriver();
1117 StringRef CPUName;
1118 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001119 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001120 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001121
1122 CmdArgs.push_back("-target-abi");
1123 CmdArgs.push_back(ABIName.data());
1124
1125 StringRef FloatABI = getMipsFloatABI(D, Args);
1126
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001127 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001128 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001129 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001130 CmdArgs.push_back("-mfloat-abi");
1131 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001132 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001133 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001134 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001135 CmdArgs.push_back("-mfloat-abi");
1136 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001137 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001138
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001139 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1140 if (A->getOption().matches(options::OPT_mxgot)) {
1141 CmdArgs.push_back("-mllvm");
1142 CmdArgs.push_back("-mxgot");
1143 }
1144 }
1145
Simon Atanasyanc580b322013-05-11 06:33:44 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1147 options::OPT_mno_ldc1_sdc1)) {
1148 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1149 CmdArgs.push_back("-mllvm");
1150 CmdArgs.push_back("-mno-ldc1-sdc1");
1151 }
1152 }
1153
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001154 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1155 options::OPT_mno_check_zero_division)) {
1156 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1157 CmdArgs.push_back("-mllvm");
1158 CmdArgs.push_back("-mno-check-zero-division");
1159 }
1160 }
1161
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001162 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001163 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001164 CmdArgs.push_back("-mllvm");
1165 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1166 A->claim();
1167 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001168}
1169
Hal Finkel8eb59282012-06-11 22:35:19 +00001170/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1171static std::string getPPCTargetCPU(const ArgList &Args) {
1172 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001173 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001174
1175 if (CPUName == "native") {
1176 std::string CPU = llvm::sys::getHostCPUName();
1177 if (!CPU.empty() && CPU != "generic")
1178 return CPU;
1179 else
1180 return "";
1181 }
1182
1183 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("common", "generic")
1185 .Case("440", "440")
1186 .Case("440fp", "440")
1187 .Case("450", "450")
1188 .Case("601", "601")
1189 .Case("602", "602")
1190 .Case("603", "603")
1191 .Case("603e", "603e")
1192 .Case("603ev", "603ev")
1193 .Case("604", "604")
1194 .Case("604e", "604e")
1195 .Case("620", "620")
1196 .Case("630", "pwr3")
1197 .Case("G3", "g3")
1198 .Case("7400", "7400")
1199 .Case("G4", "g4")
1200 .Case("7450", "7450")
1201 .Case("G4+", "g4+")
1202 .Case("750", "750")
1203 .Case("970", "970")
1204 .Case("G5", "g5")
1205 .Case("a2", "a2")
1206 .Case("a2q", "a2q")
1207 .Case("e500mc", "e500mc")
1208 .Case("e5500", "e5500")
1209 .Case("power3", "pwr3")
1210 .Case("power4", "pwr4")
1211 .Case("power5", "pwr5")
1212 .Case("power5x", "pwr5x")
1213 .Case("power6", "pwr6")
1214 .Case("power6x", "pwr6x")
1215 .Case("power7", "pwr7")
1216 .Case("power8", "pwr8")
1217 .Case("pwr3", "pwr3")
1218 .Case("pwr4", "pwr4")
1219 .Case("pwr5", "pwr5")
1220 .Case("pwr5x", "pwr5x")
1221 .Case("pwr6", "pwr6")
1222 .Case("pwr6x", "pwr6x")
1223 .Case("pwr7", "pwr7")
1224 .Case("pwr8", "pwr8")
1225 .Case("powerpc", "ppc")
1226 .Case("powerpc64", "ppc64")
1227 .Case("powerpc64le", "ppc64le")
1228 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001229 }
1230
1231 return "";
1232}
1233
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001234static void getPPCTargetFeatures(const ArgList &Args,
1235 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001236 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1237 StringRef Name = A->getOption().getName();
1238 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001239
1240 // Skip over "-m".
1241 assert(Name.startswith("m") && "Invalid feature name.");
1242 Name = Name.substr(1);
1243
1244 bool IsNegative = Name.startswith("no-");
1245 if (IsNegative)
1246 Name = Name.substr(3);
1247
1248 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1249 // pass the correct option to the backend while calling the frontend
1250 // option the same.
1251 // TODO: Change the LLVM backend option maybe?
1252 if (Name == "mfcrf")
1253 Name = "mfocrf";
1254
1255 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1256 }
1257
1258 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001259 AddTargetFeature(Args, Features, options::OPT_faltivec,
1260 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001261}
1262
Ulrich Weigand8afad612014-07-28 13:17:52 +00001263void Clang::AddPPCTargetArgs(const ArgList &Args,
1264 ArgStringList &CmdArgs) const {
1265 // Select the ABI to use.
1266 const char *ABIName = nullptr;
1267 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1268 ABIName = A->getValue();
1269 } else if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001270 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001271 case llvm::Triple::ppc64: {
1272 // When targeting a processor that supports QPX, or if QPX is
1273 // specifically enabled, default to using the ABI that supports QPX (so
1274 // long as it is not specifically disabled).
1275 bool HasQPX = false;
1276 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1277 HasQPX = A->getValue() == StringRef("a2q");
1278 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1279 if (HasQPX) {
1280 ABIName = "elfv1-qpx";
1281 break;
1282 }
1283
Ulrich Weigand8afad612014-07-28 13:17:52 +00001284 ABIName = "elfv1";
1285 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001286 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001287 case llvm::Triple::ppc64le:
1288 ABIName = "elfv2";
1289 break;
1290 default:
1291 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001292 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001293
1294 if (ABIName) {
1295 CmdArgs.push_back("-target-abi");
1296 CmdArgs.push_back(ABIName);
1297 }
1298}
1299
1300bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1301 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1302 return A && (A->getValue() == StringRef(Value));
1303}
1304
Tom Stellard6674c702013-04-01 20:56:53 +00001305/// Get the (LLVM) name of the R600 gpu we are targeting.
1306static std::string getR600TargetGPU(const ArgList &Args) {
1307 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001308 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001309 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001310 .Cases("rv630", "rv635", "r600")
1311 .Cases("rv610", "rv620", "rs780", "rs880")
1312 .Case("rv740", "rv770")
1313 .Case("palm", "cedar")
1314 .Cases("sumo", "sumo2", "sumo")
1315 .Case("hemlock", "cypress")
1316 .Case("aruba", "cayman")
1317 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001318 }
1319 return "";
1320}
1321
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001322void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001323 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001324 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001325 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001326
James Y Knightb2406522015-06-15 20:51:24 +00001327 bool SoftFloatABI = false;
1328 if (Arg *A =
1329 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001330 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001331 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001332 }
1333
James Y Knightb2406522015-06-15 20:51:24 +00001334 // Only the hard-float ABI on Sparc is standardized, and it is the
1335 // default. GCC also supports a nonstandard soft-float ABI mode, and
1336 // perhaps LLVM should implement that, too. However, since llvm
1337 // currently does not support Sparc soft-float, at all, display an
1338 // error if it's requested.
1339 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001340 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1341 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001342 }
1343}
1344
Richard Sandiford4652d892013-07-19 16:51:51 +00001345static const char *getSystemZTargetCPU(const ArgList &Args) {
1346 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1347 return A->getValue();
1348 return "z10";
1349}
1350
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001351static void getSystemZTargetFeatures(const ArgList &Args,
1352 std::vector<const char *> &Features) {
1353 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001354 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001355 if (A->getOption().matches(options::OPT_mhtm))
1356 Features.push_back("+transactional-execution");
1357 else
1358 Features.push_back("-transactional-execution");
1359 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001360 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001361 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001362 if (A->getOption().matches(options::OPT_mvx))
1363 Features.push_back("+vector");
1364 else
1365 Features.push_back("-vector");
1366 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001367}
1368
Chandler Carruth953fb082013-01-13 11:46:33 +00001369static const char *getX86TargetCPU(const ArgList &Args,
1370 const llvm::Triple &Triple) {
1371 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001372 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001373 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001374 return "core-avx2";
1375
Chandler Carruth953fb082013-01-13 11:46:33 +00001376 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001377 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001378
1379 // FIXME: Reject attempts to use -march=native unless the target matches
1380 // the host.
1381 //
1382 // FIXME: We should also incorporate the detected target features for use
1383 // with -native.
1384 std::string CPU = llvm::sys::getHostCPUName();
1385 if (!CPU.empty() && CPU != "generic")
1386 return Args.MakeArgString(CPU);
1387 }
1388
1389 // Select the default CPU if none was given (or detection failed).
1390
1391 if (Triple.getArch() != llvm::Triple::x86_64 &&
1392 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001393 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001394
1395 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1396
1397 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001398 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001399 if (Triple.getArchName() == "x86_64h")
1400 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001401 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001402 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001403
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001404 // Set up default CPU name for PS4 compilers.
1405 if (Triple.isPS4CPU())
1406 return "btver2";
1407
Alexey Bataev286d1b92014-01-31 04:07:13 +00001408 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001409 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001410 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001411
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001412 // Everything else goes to x86-64 in 64-bit mode.
1413 if (Is64Bit)
1414 return "x86-64";
1415
1416 switch (Triple.getOS()) {
1417 case llvm::Triple::FreeBSD:
1418 case llvm::Triple::NetBSD:
1419 case llvm::Triple::OpenBSD:
1420 return "i486";
1421 case llvm::Triple::Haiku:
1422 return "i586";
1423 case llvm::Triple::Bitrig:
1424 return "i686";
1425 default:
1426 // Fallback to p4.
1427 return "pentium4";
1428 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001429}
1430
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001431static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001432 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001433 default:
1434 return "";
1435
Amara Emerson703da2e2013-10-31 09:32:33 +00001436 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001437 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001438 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001439
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001440 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001441 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001442 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001443 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001444 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001445
1446 case llvm::Triple::mips:
1447 case llvm::Triple::mipsel:
1448 case llvm::Triple::mips64:
1449 case llvm::Triple::mips64el: {
1450 StringRef CPUName;
1451 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001452 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001453 return CPUName;
1454 }
1455
1456 case llvm::Triple::ppc:
1457 case llvm::Triple::ppc64:
1458 case llvm::Triple::ppc64le: {
1459 std::string TargetCPUName = getPPCTargetCPU(Args);
1460 // LLVM may default to generating code for the native CPU,
1461 // but, like gcc, we default to a more generic option for
1462 // each architecture. (except on Darwin)
1463 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1464 if (T.getArch() == llvm::Triple::ppc64)
1465 TargetCPUName = "ppc64";
1466 else if (T.getArch() == llvm::Triple::ppc64le)
1467 TargetCPUName = "ppc64le";
1468 else
1469 TargetCPUName = "ppc";
1470 }
1471 return TargetCPUName;
1472 }
1473
1474 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001475 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001476 case llvm::Triple::sparcv9:
1477 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001478 return A->getValue();
1479 return "";
1480
1481 case llvm::Triple::x86:
1482 case llvm::Triple::x86_64:
1483 return getX86TargetCPU(Args, T);
1484
1485 case llvm::Triple::hexagon:
1486 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1487
1488 case llvm::Triple::systemz:
1489 return getSystemZTargetCPU(Args);
1490
1491 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001492 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001493 return getR600TargetGPU(Args);
1494 }
1495}
1496
Alp Tokerce365ca2013-12-02 12:43:03 +00001497static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1498 ArgStringList &CmdArgs) {
1499 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1500 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1501 // forward.
1502 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001503 std::string Plugin =
1504 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001505 CmdArgs.push_back(Args.MakeArgString(Plugin));
1506
1507 // Try to pass driver level flags relevant to LTO code generation down to
1508 // the plugin.
1509
1510 // Handle flags for selecting CPU variants.
1511 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1512 if (!CPU.empty())
1513 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1514}
1515
Sanjay Patel2987c292015-06-11 14:53:41 +00001516/// This is a helper function for validating the optional refinement step
1517/// parameter in reciprocal argument strings. Return false if there is an error
1518/// parsing the refinement step. Otherwise, return true and set the Position
1519/// of the refinement step in the input string.
1520static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001521 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001522 const char RefinementStepToken = ':';
1523 Position = In.find(RefinementStepToken);
1524 if (Position != StringRef::npos) {
1525 StringRef Option = A.getOption().getName();
1526 StringRef RefStep = In.substr(Position + 1);
1527 // Allow exactly one numeric character for the additional refinement
1528 // step parameter. This is reasonable for all currently-supported
1529 // operations and architectures because we would expect that a larger value
1530 // of refinement steps would cause the estimate "optimization" to
1531 // under-perform the native operation. Also, if the estimate does not
1532 // converge quickly, it probably will not ever converge, so further
1533 // refinement steps will not produce a better answer.
1534 if (RefStep.size() != 1) {
1535 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1536 return false;
1537 }
1538 char RefStepChar = RefStep[0];
1539 if (RefStepChar < '0' || RefStepChar > '9') {
1540 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1541 return false;
1542 }
1543 }
1544 return true;
1545}
1546
1547/// The -mrecip flag requires processing of many optional parameters.
1548static void ParseMRecip(const Driver &D, const ArgList &Args,
1549 ArgStringList &OutStrings) {
1550 StringRef DisabledPrefixIn = "!";
1551 StringRef DisabledPrefixOut = "!";
1552 StringRef EnabledPrefixOut = "";
1553 StringRef Out = "-mrecip=";
1554
1555 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1556 if (!A)
1557 return;
1558
1559 unsigned NumOptions = A->getNumValues();
1560 if (NumOptions == 0) {
1561 // No option is the same as "all".
1562 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1563 return;
1564 }
1565
1566 // Pass through "all", "none", or "default" with an optional refinement step.
1567 if (NumOptions == 1) {
1568 StringRef Val = A->getValue(0);
1569 size_t RefStepLoc;
1570 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1571 return;
1572 StringRef ValBase = Val.slice(0, RefStepLoc);
1573 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1574 OutStrings.push_back(Args.MakeArgString(Out + Val));
1575 return;
1576 }
1577 }
1578
1579 // Each reciprocal type may be enabled or disabled individually.
1580 // Check each input value for validity, concatenate them all back together,
1581 // and pass through.
1582
1583 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001584 OptionStrings.insert(std::make_pair("divd", false));
1585 OptionStrings.insert(std::make_pair("divf", false));
1586 OptionStrings.insert(std::make_pair("vec-divd", false));
1587 OptionStrings.insert(std::make_pair("vec-divf", false));
1588 OptionStrings.insert(std::make_pair("sqrtd", false));
1589 OptionStrings.insert(std::make_pair("sqrtf", false));
1590 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1591 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001592
1593 for (unsigned i = 0; i != NumOptions; ++i) {
1594 StringRef Val = A->getValue(i);
1595
1596 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1597 // Ignore the disablement token for string matching.
1598 if (IsDisabled)
1599 Val = Val.substr(1);
1600
1601 size_t RefStep;
1602 if (!getRefinementStep(Val, D, *A, RefStep))
1603 return;
1604
1605 StringRef ValBase = Val.slice(0, RefStep);
1606 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1607 if (OptionIter == OptionStrings.end()) {
1608 // Try again specifying float suffix.
1609 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1610 if (OptionIter == OptionStrings.end()) {
1611 // The input name did not match any known option string.
1612 D.Diag(diag::err_drv_unknown_argument) << Val;
1613 return;
1614 }
1615 // The option was specified without a float or double suffix.
1616 // Make sure that the double entry was not already specified.
1617 // The float entry will be checked below.
1618 if (OptionStrings[ValBase.str() + 'd']) {
1619 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1620 return;
1621 }
1622 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001623
Sanjay Patel2987c292015-06-11 14:53:41 +00001624 if (OptionIter->second == true) {
1625 // Duplicate option specified.
1626 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1627 return;
1628 }
1629
1630 // Mark the matched option as found. Do not allow duplicate specifiers.
1631 OptionIter->second = true;
1632
1633 // If the precision was not specified, also mark the double entry as found.
1634 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1635 OptionStrings[ValBase.str() + 'd'] = true;
1636
1637 // Build the output string.
1638 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1639 Out = Args.MakeArgString(Out + Prefix + Val);
1640 if (i != NumOptions - 1)
1641 Out = Args.MakeArgString(Out + ",");
1642 }
1643
1644 OutStrings.push_back(Args.MakeArgString(Out));
1645}
1646
Eric Christopherc54920a2015-03-23 19:26:05 +00001647static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001648 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001649 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001650 // If -march=native, autodetect the feature list.
1651 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1652 if (StringRef(A->getValue()) == "native") {
1653 llvm::StringMap<bool> HostFeatures;
1654 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1655 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001656 Features.push_back(
1657 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001658 }
1659 }
1660
Jim Grosbach82eee262013-11-16 00:53:35 +00001661 if (Triple.getArchName() == "x86_64h") {
1662 // x86_64h implies quite a few of the more modern subtarget features
1663 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1664 Features.push_back("-rdrnd");
1665 Features.push_back("-aes");
1666 Features.push_back("-pclmul");
1667 Features.push_back("-rtm");
1668 Features.push_back("-hle");
1669 Features.push_back("-fsgsbase");
1670 }
1671
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001672 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001673 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001674 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001675 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001676 Features.push_back("+sse4.2");
1677 Features.push_back("+popcnt");
1678 } else
1679 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001680 }
1681
Eric Christopherc54920a2015-03-23 19:26:05 +00001682 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001683 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1684 StringRef Arch = A->getValue();
1685 bool ArchUsed = false;
1686 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001687 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001688 if (Arch == "AVX" || Arch == "AVX2") {
1689 ArchUsed = true;
1690 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1691 }
1692 }
1693 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001694 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001695 if (Arch == "IA32") {
1696 ArchUsed = true;
1697 } else if (Arch == "SSE" || Arch == "SSE2") {
1698 ArchUsed = true;
1699 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1700 }
1701 }
1702 if (!ArchUsed)
1703 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1704 }
1705
Jim Grosbach82eee262013-11-16 00:53:35 +00001706 // Now add any that the user explicitly requested on the command line,
1707 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001708 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1709 StringRef Name = A->getOption().getName();
1710 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001711
1712 // Skip over "-m".
1713 assert(Name.startswith("m") && "Invalid feature name.");
1714 Name = Name.substr(1);
1715
1716 bool IsNegative = Name.startswith("no-");
1717 if (IsNegative)
1718 Name = Name.substr(3);
1719
1720 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1721 }
1722}
1723
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001724void Clang::AddX86TargetArgs(const ArgList &Args,
1725 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001726 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001727 Args.hasArg(options::OPT_mkernel) ||
1728 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001729 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001730
Bob Wilson2616e2e2013-02-10 16:01:41 +00001731 // Default to avoid implicit floating-point for kernel/kext code, but allow
1732 // that to be overridden with -mno-soft-float.
1733 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1734 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001735 if (Arg *A = Args.getLastArg(
1736 options::OPT_msoft_float, options::OPT_mno_soft_float,
1737 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001738 const Option &O = A->getOption();
1739 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1740 O.matches(options::OPT_msoft_float));
1741 }
1742 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001743 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001744
1745 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1746 StringRef Value = A->getValue();
1747 if (Value == "intel" || Value == "att") {
1748 CmdArgs.push_back("-mllvm");
1749 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1750 } else {
1751 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1752 << A->getOption().getName() << Value;
1753 }
1754 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001755}
1756
Tony Linthicum76329bf2011-12-12 21:14:55 +00001757void Clang::AddHexagonTargetArgs(const ArgList &Args,
1758 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001759 CmdArgs.push_back("-mqdsp6-compat");
1760 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001761
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001762 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1763 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001764 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001765 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001766 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001767 }
1768
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001769 if (!Args.hasArg(options::OPT_fno_short_enums))
1770 CmdArgs.push_back("-fshort-enums");
1771 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001772 CmdArgs.push_back("-mllvm");
1773 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001774 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001775 CmdArgs.push_back("-mllvm");
1776 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001777}
1778
Kevin Qin110db6f2014-07-18 07:03:22 +00001779// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001780static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001781 std::vector<const char *> &Features) {
1782 SmallVector<StringRef, 8> Split;
1783 text.split(Split, StringRef("+"), -1, false);
1784
1785 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1786 const char *result = llvm::StringSwitch<const char *>(Split[I])
1787 .Case("fp", "+fp-armv8")
1788 .Case("simd", "+neon")
1789 .Case("crc", "+crc")
1790 .Case("crypto", "+crypto")
1791 .Case("nofp", "-fp-armv8")
1792 .Case("nosimd", "-neon")
1793 .Case("nocrc", "-crc")
1794 .Case("nocrypto", "-crypto")
1795 .Default(nullptr);
1796 if (result)
1797 Features.push_back(result);
1798 else if (Split[I] == "neon" || Split[I] == "noneon")
1799 D.Diag(diag::err_drv_no_neon_modifier);
1800 else
1801 return false;
1802 }
1803 return true;
1804}
1805
1806// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1807// decode CPU and feature.
1808static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1809 std::vector<const char *> &Features) {
1810 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1811 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001812 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1813 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001814 Features.push_back("+neon");
1815 Features.push_back("+crc");
1816 Features.push_back("+crypto");
1817 } else if (CPU == "generic") {
1818 Features.push_back("+neon");
1819 } else {
1820 return false;
1821 }
1822
1823 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1824 return false;
1825
1826 return true;
1827}
1828
1829static bool
1830getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1831 const ArgList &Args,
1832 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001833 std::string MarchLowerCase = March.lower();
1834 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001836 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001837 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001838 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001839 Features.push_back("+v8.1a");
1840 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001841 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001842 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001843
1844 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1845 return false;
1846
1847 return true;
1848}
1849
1850static bool
1851getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1852 const ArgList &Args,
1853 std::vector<const char *> &Features) {
1854 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001855 std::string McpuLowerCase = Mcpu.lower();
1856 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001857 return false;
1858
1859 return true;
1860}
1861
1862static bool
1863getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1864 const ArgList &Args,
1865 std::vector<const char *> &Features) {
1866 // Handle CPU name is 'native'.
1867 if (Mtune == "native")
1868 Mtune = llvm::sys::getHostCPUName();
1869 if (Mtune == "cyclone") {
1870 Features.push_back("+zcm");
1871 Features.push_back("+zcz");
1872 }
1873 return true;
1874}
1875
1876static bool
1877getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1878 const ArgList &Args,
1879 std::vector<const char *> &Features) {
1880 StringRef CPU;
1881 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001882 std::string McpuLowerCase = Mcpu.lower();
1883 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00001884 return false;
1885
1886 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1887}
1888
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001889static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1890 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001891 Arg *A;
1892 bool success = true;
1893 // Enable NEON by default.
1894 Features.push_back("+neon");
1895 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1896 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1897 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1898 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001899 else if (Args.hasArg(options::OPT_arch))
1900 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1901 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001902
1903 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1904 success =
1905 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1906 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1907 success =
1908 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001909 else if (Args.hasArg(options::OPT_arch))
1910 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1911 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001912
1913 if (!success)
1914 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001915
1916 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1917 Features.push_back("-fp-armv8");
1918 Features.push_back("-crypto");
1919 Features.push_back("-neon");
1920 }
Bradley Smith418c5932014-05-02 15:17:51 +00001921
1922 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001923 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00001924 if (A->getOption().matches(options::OPT_mcrc))
1925 Features.push_back("+crc");
1926 else
1927 Features.push_back("-crc");
1928 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001929}
1930
1931static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001932 const ArgList &Args, ArgStringList &CmdArgs,
1933 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001934 std::vector<const char *> Features;
1935 switch (Triple.getArch()) {
1936 default:
1937 break;
1938 case llvm::Triple::mips:
1939 case llvm::Triple::mipsel:
1940 case llvm::Triple::mips64:
1941 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001942 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001943 break;
1944
1945 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001946 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001947 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001948 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001949 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001950 break;
1951
1952 case llvm::Triple::ppc:
1953 case llvm::Triple::ppc64:
1954 case llvm::Triple::ppc64le:
1955 getPPCTargetFeatures(Args, Features);
1956 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001957 case llvm::Triple::systemz:
1958 getSystemZTargetFeatures(Args, Features);
1959 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001960 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001961 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001962 getAArch64TargetFeatures(D, Args, Features);
1963 break;
1964 case llvm::Triple::x86:
1965 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001966 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001967 break;
1968 }
Rafael Espindola43964802013-08-21 17:34:32 +00001969
1970 // Find the last of each feature.
1971 llvm::StringMap<unsigned> LastOpt;
1972 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1973 const char *Name = Features[I];
1974 assert(Name[0] == '-' || Name[0] == '+');
1975 LastOpt[Name + 1] = I;
1976 }
1977
1978 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1979 // If this feature was overridden, ignore it.
1980 const char *Name = Features[I];
1981 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1982 assert(LastI != LastOpt.end());
1983 unsigned Last = LastI->second;
1984 if (Last != I)
1985 continue;
1986
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001987 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001988 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001989 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001990}
1991
David Majnemerae394812014-12-09 00:12:30 +00001992static bool
1993shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1994 const llvm::Triple &Triple) {
1995 // We use the zero-cost exception tables for Objective-C if the non-fragile
1996 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1997 // later.
1998 if (runtime.isNonFragile())
1999 return true;
2000
2001 if (!Triple.isMacOSX())
2002 return false;
2003
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002004 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002005 (Triple.getArch() == llvm::Triple::x86_64 ||
2006 Triple.getArch() == llvm::Triple::arm));
2007}
2008
Nico Webere8e53112014-05-11 01:04:02 +00002009// exceptionSettings() exists to share the logic between -cc1 and linker
2010// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002011static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002012 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002013 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002014 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002015 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002016
David Majnemer8de68642014-12-05 08:11:58 +00002017 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002018}
2019
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002020/// Adds exception related arguments to the driver command arguments. There's a
2021/// master flag, -fexceptions and also language specific flags to enable/disable
2022/// C++ and Objective-C exceptions. This makes it possible to for example
2023/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002024static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002025 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002026 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002027 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002028 const Driver &D = TC.getDriver();
2029 const llvm::Triple &Triple = TC.getTriple();
2030
Chad Rosier4fab82c2012-03-26 22:04:46 +00002031 if (KernelOrKext) {
2032 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2033 // arguments now to avoid warnings about unused arguments.
2034 Args.ClaimAllArgs(options::OPT_fexceptions);
2035 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2036 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2037 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2038 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2039 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002040 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002041 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002042
David Majnemer8de68642014-12-05 08:11:58 +00002043 // Gather the exception settings from the command line arguments.
2044 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002045
David Majnemerae394812014-12-09 00:12:30 +00002046 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2047 // is not necessarily sensible, but follows GCC.
2048 if (types::isObjC(InputType) &&
2049 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002050 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002051 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002052
David Majnemerae394812014-12-09 00:12:30 +00002053 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002054 }
2055
2056 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002057 bool CXXExceptionsEnabled =
2058 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002059 Arg *ExceptionArg = Args.getLastArg(
2060 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2061 options::OPT_fexceptions, options::OPT_fno_exceptions);
2062 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002063 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002064 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2065 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002066
2067 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002068 if (Triple.isPS4CPU()) {
2069 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2070 assert(ExceptionArg &&
2071 "On the PS4 exceptions should only be enabled if passing "
2072 "an argument");
2073 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2074 const Arg *RTTIArg = TC.getRTTIArg();
2075 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2076 D.Diag(diag::err_drv_argument_not_allowed_with)
2077 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2078 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2079 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2080 } else
2081 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2082
Anders Carlssone96ab552011-02-28 02:27:16 +00002083 CmdArgs.push_back("-fcxx-exceptions");
2084
David Majnemer8de68642014-12-05 08:11:58 +00002085 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002086 }
2087 }
2088
David Majnemer8de68642014-12-05 08:11:58 +00002089 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002090 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002091}
2092
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002093static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002094 bool Default = true;
2095 if (TC.getTriple().isOSDarwin()) {
2096 // The native darwin assembler doesn't support the linker_option directives,
2097 // so we disable them if we think the .s file will be passed to it.
2098 Default = TC.useIntegratedAs();
2099 }
2100 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2101 Default);
2102}
2103
Ted Kremenek62093662013-03-12 17:02:12 +00002104static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2105 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002106 bool UseDwarfDirectory =
2107 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2108 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002109 return !UseDwarfDirectory;
2110}
2111
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002112/// \brief Check whether the given input tree contains any compilation actions.
2113static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002114 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002115 return true;
2116
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002117 for (const auto &Act : *A)
2118 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002119 return true;
2120
2121 return false;
2122}
2123
2124/// \brief Check if -relax-all should be passed to the internal assembler.
2125/// This is done by default when compiling non-assembler source with -O0.
2126static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2127 bool RelaxDefault = true;
2128
2129 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2130 RelaxDefault = A->getOption().matches(options::OPT_O0);
2131
2132 if (RelaxDefault) {
2133 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002134 for (const auto &Act : C.getActions()) {
2135 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002136 RelaxDefault = true;
2137 break;
2138 }
2139 }
2140 }
2141
2142 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002143 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002144}
2145
David Blaikie9260ed62013-07-25 21:19:01 +00002146static void CollectArgsForIntegratedAssembler(Compilation &C,
2147 const ArgList &Args,
2148 ArgStringList &CmdArgs,
2149 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002150 if (UseRelaxAll(C, Args))
2151 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002152
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002153 // When passing -I arguments to the assembler we sometimes need to
2154 // unconditionally take the next argument. For example, when parsing
2155 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2156 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2157 // arg after parsing the '-I' arg.
2158 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002159
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002160 // When using an integrated assembler, translate -Wa, and -Xassembler
2161 // options.
2162 bool CompressDebugSections = false;
2163 for (const Arg *A :
2164 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2165 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002166
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002167 for (const StringRef Value : A->getValues()) {
David Peixottodfb66142013-11-14 22:52:58 +00002168 if (TakeNextArg) {
2169 CmdArgs.push_back(Value.data());
2170 TakeNextArg = false;
2171 continue;
2172 }
David Blaikie9260ed62013-07-25 21:19:01 +00002173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002174 if (Value == "-force_cpusubtype_ALL") {
2175 // Do nothing, this is the default and we don't support anything else.
2176 } else if (Value == "-L") {
2177 CmdArgs.push_back("-msave-temp-labels");
2178 } else if (Value == "--fatal-warnings") {
2179 CmdArgs.push_back("-massembler-fatal-warnings");
2180 } else if (Value == "--noexecstack") {
2181 CmdArgs.push_back("-mnoexecstack");
2182 } else if (Value == "-compress-debug-sections" ||
2183 Value == "--compress-debug-sections") {
2184 CompressDebugSections = true;
2185 } else if (Value == "-nocompress-debug-sections" ||
2186 Value == "--nocompress-debug-sections") {
2187 CompressDebugSections = false;
2188 } else if (Value.startswith("-I")) {
2189 CmdArgs.push_back(Value.data());
2190 // We need to consume the next argument if the current arg is a plain
2191 // -I. The next arg will be the include directory.
2192 if (Value == "-I")
2193 TakeNextArg = true;
2194 } else if (Value.startswith("-gdwarf-")) {
2195 CmdArgs.push_back(Value.data());
2196 } else {
2197 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002198 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002199 }
2200 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002201 }
2202 if (CompressDebugSections) {
2203 if (llvm::zlib::isAvailable())
2204 CmdArgs.push_back("-compress-debug-sections");
2205 else
2206 D.Diag(diag::warn_debug_compression_unavailable);
2207 }
David Blaikie9260ed62013-07-25 21:19:01 +00002208}
2209
Renato Goline807c122014-01-31 11:47:28 +00002210// Until ARM libraries are build separately, we have them all in one library
2211static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002212 // FIXME: handle 64-bit
2213 if (TC.getTriple().isOSWindows() &&
2214 !TC.getTriple().isWindowsItaniumEnvironment())
2215 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002216 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002217 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002218 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002219}
2220
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002221static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2222 // The runtimes are located in the OS-specific resource directory.
2223 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002224 const llvm::Triple &Triple = TC.getTriple();
2225 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002226 StringRef OSLibName =
2227 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002228 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002229 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002230}
2231
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002232static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002233 bool Shared = false) {
2234 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2235 ? "-android"
2236 : "";
2237
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002238 bool IsOSWindows = TC.getTriple().isOSWindows();
2239 StringRef Arch = getArchNameForCompilerRTLib(TC);
2240 const char *Prefix = IsOSWindows ? "" : "lib";
2241 const char *Suffix =
2242 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2243
2244 SmallString<128> Path = getCompilerRTLibDir(TC);
2245 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2246 Arch + Env + Suffix);
2247
2248 return Path;
2249}
2250
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002251// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002252// FIXME: Make sure we can also emit shared objects if they're requested
2253// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002254static void addClangRT(const ToolChain &TC, const ArgList &Args,
2255 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002256 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002257
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002258 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002259 // FIXME: why do we link against gcc when we are using compiler-rt?
2260 CmdArgs.push_back("-lgcc_s");
2261 if (TC.getDriver().CCCIsCXX())
2262 CmdArgs.push_back("-lgcc_eh");
2263 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002264}
2265
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002266static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2267 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002268 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2269 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002270 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002271 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002272 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002273 Args.hasArg(options::OPT_fcreate_profile) ||
2274 Args.hasArg(options::OPT_coverage)))
2275 return;
2276
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002277 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002278}
2279
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002280namespace {
2281enum OpenMPRuntimeKind {
2282 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2283 /// without knowing what runtime to target.
2284 OMPRT_Unknown,
2285
2286 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2287 /// the default for Clang.
2288 OMPRT_OMP,
2289
2290 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2291 /// this runtime but can swallow the pragmas, and find and link against the
2292 /// runtime library itself.
2293 OMPRT_GOMP,
2294
Chandler Carruthc6625c62015-05-28 21:10:31 +00002295 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002296 /// OpenMP runtime. We support this mode for users with existing dependencies
2297 /// on this runtime library name.
2298 OMPRT_IOMP5
2299};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002300}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002301
2302/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002303static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2304 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002305 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2306
2307 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2308 if (A)
2309 RuntimeName = A->getValue();
2310
2311 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002312 .Case("libomp", OMPRT_OMP)
2313 .Case("libgomp", OMPRT_GOMP)
2314 .Case("libiomp5", OMPRT_IOMP5)
2315 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002316
2317 if (RT == OMPRT_Unknown) {
2318 if (A)
2319 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002320 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002321 else
2322 // FIXME: We could use a nicer diagnostic here.
2323 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2324 }
2325
2326 return RT;
2327}
2328
Alexey Samsonov52550342014-09-15 19:58:40 +00002329static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2330 ArgStringList &CmdArgs, StringRef Sanitizer,
2331 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002332 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002333 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002334 if (!IsShared)
2335 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002336 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002337 if (!IsShared)
2338 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002339}
2340
Alexey Samsonov52550342014-09-15 19:58:40 +00002341// Tries to use a file with the list of dynamic symbols that need to be exported
2342// from the runtime library. Returns true if the file was found.
2343static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2344 ArgStringList &CmdArgs,
2345 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002346 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2347 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2348 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002349 return true;
2350 }
2351 return false;
2352}
2353
2354static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2355 ArgStringList &CmdArgs) {
2356 // Force linking against the system libraries sanitizers depends on
2357 // (see PR15823 why this is necessary).
2358 CmdArgs.push_back("--no-as-needed");
2359 CmdArgs.push_back("-lpthread");
2360 CmdArgs.push_back("-lrt");
2361 CmdArgs.push_back("-lm");
2362 // There's no libdl on FreeBSD.
2363 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2364 CmdArgs.push_back("-ldl");
2365}
2366
2367static void
2368collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2369 SmallVectorImpl<StringRef> &SharedRuntimes,
2370 SmallVectorImpl<StringRef> &StaticRuntimes,
2371 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2372 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2373 // Collect shared runtimes.
2374 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2375 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002376 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002377
Alexey Samsonov52550342014-09-15 19:58:40 +00002378 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002379 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002380 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2381 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002382 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002383 }
2384 if (SanArgs.needsAsanRt()) {
2385 if (SanArgs.needsSharedAsanRt()) {
2386 HelperStaticRuntimes.push_back("asan-preinit");
2387 } else {
2388 StaticRuntimes.push_back("asan");
2389 if (SanArgs.linkCXXRuntimes())
2390 StaticRuntimes.push_back("asan_cxx");
2391 }
2392 }
2393 if (SanArgs.needsDfsanRt())
2394 StaticRuntimes.push_back("dfsan");
2395 if (SanArgs.needsLsanRt())
2396 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002397 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002398 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002399 if (SanArgs.linkCXXRuntimes())
2400 StaticRuntimes.push_back("msan_cxx");
2401 }
2402 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002403 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002404 if (SanArgs.linkCXXRuntimes())
2405 StaticRuntimes.push_back("tsan_cxx");
2406 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002407 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002408 StaticRuntimes.push_back("ubsan_standalone");
2409 if (SanArgs.linkCXXRuntimes())
2410 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002411 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002412 if (SanArgs.needsSafeStackRt())
2413 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002414}
2415
Alexey Samsonov52550342014-09-15 19:58:40 +00002416// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2417// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2418static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002419 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002420 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2421 HelperStaticRuntimes;
2422 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2423 HelperStaticRuntimes);
2424 for (auto RT : SharedRuntimes)
2425 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2426 for (auto RT : HelperStaticRuntimes)
2427 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2428 bool AddExportDynamic = false;
2429 for (auto RT : StaticRuntimes) {
2430 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2431 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2432 }
2433 // If there is a static runtime with no dynamic list, force all the symbols
2434 // to be dynamic to be sure we export sanitizer interface functions.
2435 if (AddExportDynamic)
2436 CmdArgs.push_back("-export-dynamic");
2437 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002438}
2439
Reid Kleckner86ea7702015-02-04 23:45:07 +00002440static bool areOptimizationsEnabled(const ArgList &Args) {
2441 // Find the last -O arg and see if it is non-zero.
2442 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2443 return !A->getOption().matches(options::OPT_O0);
2444 // Defaults to -O0.
2445 return false;
2446}
2447
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002448static bool shouldUseFramePointerForTarget(const ArgList &Args,
2449 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002450 // XCore never wants frame pointers, regardless of OS.
2451 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002452 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002453 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002454
2455 if (Triple.isOSLinux()) {
2456 switch (Triple.getArch()) {
2457 // Don't use a frame pointer on linux if optimizing for certain targets.
2458 case llvm::Triple::mips64:
2459 case llvm::Triple::mips64el:
2460 case llvm::Triple::mips:
2461 case llvm::Triple::mipsel:
2462 case llvm::Triple::systemz:
2463 case llvm::Triple::x86:
2464 case llvm::Triple::x86_64:
2465 return !areOptimizationsEnabled(Args);
2466 default:
2467 return true;
2468 }
2469 }
2470
2471 if (Triple.isOSWindows()) {
2472 switch (Triple.getArch()) {
2473 case llvm::Triple::x86:
2474 return !areOptimizationsEnabled(Args);
2475 default:
2476 // All other supported Windows ISAs use xdata unwind information, so frame
2477 // pointers are not generally useful.
2478 return false;
2479 }
2480 }
2481
2482 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002483}
2484
Rafael Espindola224dd632011-12-14 21:02:23 +00002485static bool shouldUseFramePointer(const ArgList &Args,
2486 const llvm::Triple &Triple) {
2487 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2488 options::OPT_fomit_frame_pointer))
2489 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2490
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002491 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002492}
2493
Eric Christopherb7d97e92013-04-03 01:58:53 +00002494static bool shouldUseLeafFramePointer(const ArgList &Args,
2495 const llvm::Triple &Triple) {
2496 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2497 options::OPT_momit_leaf_frame_pointer))
2498 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2499
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002500 if (Triple.isPS4CPU())
2501 return false;
2502
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002503 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002504}
2505
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002506/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002507static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002508 SmallString<128> cwd;
2509 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002510 CmdArgs.push_back("-fdebug-compilation-dir");
2511 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002512 }
2513}
2514
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002515static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002516 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2517 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2518 SmallString<128> T(FinalOutput->getValue());
2519 llvm::sys::path::replace_extension(T, "dwo");
2520 return Args.MakeArgString(T);
2521 } else {
2522 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002523 SmallString<128> T(
2524 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002525 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002526 llvm::sys::path::replace_extension(F, "dwo");
2527 T += F;
2528 return Args.MakeArgString(F);
2529 }
2530}
2531
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002532static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2533 const JobAction &JA, const ArgList &Args,
2534 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002535 ArgStringList ExtractArgs;
2536 ExtractArgs.push_back("--extract-dwo");
2537
2538 ArgStringList StripArgs;
2539 StripArgs.push_back("--strip-dwo");
2540
2541 // Grabbing the output of the earlier compile step.
2542 StripArgs.push_back(Output.getFilename());
2543 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002544 ExtractArgs.push_back(OutFile);
2545
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002546 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002547
2548 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002549 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002550
2551 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002552 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002553}
2554
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002555/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002556/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2557static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002558 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002559 if (A->getOption().matches(options::OPT_O4) ||
2560 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002561 return true;
2562
2563 if (A->getOption().matches(options::OPT_O0))
2564 return false;
2565
2566 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2567
Rafael Espindola91780de2013-08-26 14:05:41 +00002568 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002569 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002570 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002571 return true;
2572
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002573 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002574 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002575 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002576
2577 unsigned OptLevel = 0;
2578 if (S.getAsInteger(10, OptLevel))
2579 return false;
2580
2581 return OptLevel > 1;
2582 }
2583
2584 return false;
2585}
2586
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002587/// Add -x lang to \p CmdArgs for \p Input.
2588static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2589 ArgStringList &CmdArgs) {
2590 // When using -verify-pch, we don't want to provide the type
2591 // 'precompiled-header' if it was inferred from the file extension
2592 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2593 return;
2594
2595 CmdArgs.push_back("-x");
2596 if (Args.hasArg(options::OPT_rewrite_objc))
2597 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2598 else
2599 CmdArgs.push_back(types::getTypeName(Input.getType()));
2600}
2601
David Majnemerc371ff02015-03-22 08:39:22 +00002602static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002603 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002604 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002605
2606 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002607 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002608
2609 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002610 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002611 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002612 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002613}
2614
Rafael Espindola577637a2015-01-03 00:06:04 +00002615// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002616// options that build systems might add but are unused when assembling or only
2617// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002618static void claimNoWarnArgs(const ArgList &Args) {
2619 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002620 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002621 Args.ClaimAllArgs(options::OPT_flto);
2622 Args.ClaimAllArgs(options::OPT_fno_lto);
2623}
2624
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002625static void appendUserToPath(SmallVectorImpl<char> &Result) {
2626#ifdef LLVM_ON_UNIX
2627 const char *Username = getenv("LOGNAME");
2628#else
2629 const char *Username = getenv("USERNAME");
2630#endif
2631 if (Username) {
2632 // Validate that LoginName can be used in a path, and get its length.
2633 size_t Len = 0;
2634 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002635 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002636 Username = nullptr;
2637 break;
2638 }
2639 }
2640
2641 if (Username && Len > 0) {
2642 Result.append(Username, Username + Len);
2643 return;
2644 }
2645 }
2646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002647// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002648#ifdef LLVM_ON_UNIX
2649 std::string UID = llvm::utostr(getuid());
2650#else
2651 // FIXME: Windows seems to have an 'SID' that might work.
2652 std::string UID = "9999";
2653#endif
2654 Result.append(UID.begin(), UID.end());
2655}
2656
David Majnemere11d3732015-06-08 00:22:46 +00002657VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2658 const llvm::Triple &Triple,
2659 const llvm::opt::ArgList &Args,
2660 bool IsWindowsMSVC) {
2661 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2662 IsWindowsMSVC) ||
2663 Args.hasArg(options::OPT_fmsc_version) ||
2664 Args.hasArg(options::OPT_fms_compatibility_version)) {
2665 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2666 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002667 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002668
2669 if (MSCVersion && MSCompatibilityVersion) {
2670 if (D)
2671 D->Diag(diag::err_drv_argument_not_allowed_with)
2672 << MSCVersion->getAsString(Args)
2673 << MSCompatibilityVersion->getAsString(Args);
2674 return VersionTuple();
2675 }
2676
2677 if (MSCompatibilityVersion) {
2678 VersionTuple MSVT;
2679 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2680 D->Diag(diag::err_drv_invalid_value)
2681 << MSCompatibilityVersion->getAsString(Args)
2682 << MSCompatibilityVersion->getValue();
2683 return MSVT;
2684 }
2685
2686 if (MSCVersion) {
2687 unsigned Version = 0;
2688 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2689 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2690 << MSCVersion->getValue();
2691 return getMSCompatibilityVersion(Version);
2692 }
2693
2694 unsigned Major, Minor, Micro;
2695 Triple.getEnvironmentVersion(Major, Minor, Micro);
2696 if (Major || Minor || Micro)
2697 return VersionTuple(Major, Minor, Micro);
2698
2699 return VersionTuple(18);
2700 }
2701 return VersionTuple();
2702}
2703
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002704void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002705 const InputInfo &Output, const InputInfoList &Inputs,
2706 const ArgList &Args, const char *LinkingOutput) const {
2707 bool KernelOrKext =
2708 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002709 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002710 ArgStringList CmdArgs;
2711
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002712 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002713 bool IsWindowsCygnus =
2714 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002715 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2716
Daniel Dunbare521a892009-03-31 20:53:55 +00002717 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002718 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002719
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002720 // Invoke ourselves in -cc1 mode.
2721 //
2722 // FIXME: Implement custom jobs for internal actions.
2723 CmdArgs.push_back("-cc1");
2724
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002725 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002726 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002727 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002728 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002729
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002730 const llvm::Triple TT(TripleStr);
2731 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2732 TT.getArch() == llvm::Triple::thumb)) {
2733 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2734 unsigned Version;
2735 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2736 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002737 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2738 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002739 }
2740
Tim Northover336f1892014-03-29 13:16:12 +00002741 // Push all default warning arguments that are specific to
2742 // the given target. These come before user provided warning options
2743 // are provided.
2744 getToolChain().addClangWarningOptions(CmdArgs);
2745
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002746 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002747 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002748
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002749 if (isa<AnalyzeJobAction>(JA)) {
2750 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2751 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002752 } else if (isa<MigrateJobAction>(JA)) {
2753 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002754 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002755 if (Output.getType() == types::TY_Dependencies)
2756 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002757 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002758 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002759 if (Args.hasArg(options::OPT_rewrite_objc) &&
2760 !Args.hasArg(options::OPT_g_Group))
2761 CmdArgs.push_back("-P");
2762 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002763 } else if (isa<AssembleJobAction>(JA)) {
2764 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002765
David Blaikie9260ed62013-07-25 21:19:01 +00002766 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002767
2768 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002769 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002770 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002771 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002772 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002773
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002774 if (JA.getType() == types::TY_Nothing)
2775 CmdArgs.push_back("-fsyntax-only");
2776 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002777 CmdArgs.push_back("-emit-pch");
2778 else
2779 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002780 } else if (isa<VerifyPCHJobAction>(JA)) {
2781 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002782 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002783 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2784 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002785
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002786 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002787 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002788 } else if (JA.getType() == types::TY_LLVM_IR ||
2789 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002790 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002791 } else if (JA.getType() == types::TY_LLVM_BC ||
2792 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002793 CmdArgs.push_back("-emit-llvm-bc");
2794 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002795 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002796 } else if (JA.getType() == types::TY_AST) {
2797 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002798 } else if (JA.getType() == types::TY_ModuleFile) {
2799 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002800 } else if (JA.getType() == types::TY_RewrittenObjC) {
2801 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002802 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002803 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2804 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002805 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002806 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002807 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002808 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002809
2810 // Preserve use-list order by default when emitting bitcode, so that
2811 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2812 // same result as running passes here. For LTO, we don't need to preserve
2813 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002814 if (JA.getType() == types::TY_LLVM_BC)
2815 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002816 }
2817
Justin Bognera88f0122014-06-20 22:59:50 +00002818 // We normally speed up the clang process a bit by skipping destructors at
2819 // exit, but when we're generating diagnostics we can rely on some of the
2820 // cleanup.
2821 if (!C.isForDiagnostics())
2822 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002823
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002824// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00002825#ifdef NDEBUG
2826 CmdArgs.push_back("-disable-llvm-verifier");
2827#endif
2828
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002829 // Set the main file name, so that debug info works even with
2830 // -save-temps.
2831 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002832 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002833
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002834 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002835 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002836 if (Args.hasArg(options::OPT_static))
2837 CmdArgs.push_back("-static-define");
2838
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002839 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002840 // Enable region store model by default.
2841 CmdArgs.push_back("-analyzer-store=region");
2842
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002843 // Treat blocks as analysis entry points.
2844 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2845
Ted Kremenek49c79792011-03-24 00:28:47 +00002846 CmdArgs.push_back("-analyzer-eagerly-assume");
2847
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002848 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002849 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002850 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002851
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002852 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002853 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002854
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002855 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002856 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002857
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002858 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002859
Artem Belevichba558952015-05-06 18:20:23 +00002860 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002861 CmdArgs.push_back("-analyzer-checker=cplusplus");
2862
Nico Webere8e53112014-05-11 01:04:02 +00002863 // Enable the following experimental checkers for testing.
2864 CmdArgs.push_back(
2865 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002866 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2867 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002868 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00002869 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2870 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002871 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002872
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002873 // Set the output format. The default is plist, for (lame) historical
2874 // reasons.
2875 CmdArgs.push_back("-analyzer-output");
2876 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002877 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002878 else
2879 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002880
Ted Kremenekfe449a22010-03-22 22:32:05 +00002881 // Disable the presentation of standard compiler warnings when
2882 // using --analyze. We only want to show static analyzer diagnostics
2883 // or frontend errors.
2884 CmdArgs.push_back("-w");
2885
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002886 // Add -Xanalyzer arguments when running as analyzer.
2887 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002888 }
2889
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002890 CheckCodeGenerationOptions(D, Args);
2891
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002892 bool PIE = getToolChain().isPIEDefault();
2893 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002894 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002895
Alexey Bataev40e75222014-01-28 06:30:35 +00002896 // Android-specific defaults for PIC/PIE
2897 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002898 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00002899 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002900 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002901 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002902 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002903 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002904 case llvm::Triple::mips:
2905 case llvm::Triple::mipsel:
2906 case llvm::Triple::mips64:
2907 case llvm::Triple::mips64el:
2908 PIC = true; // "-fpic"
2909 break;
2910
2911 case llvm::Triple::x86:
2912 case llvm::Triple::x86_64:
2913 PIC = true; // "-fPIC"
2914 IsPICLevelTwo = true;
2915 break;
2916
2917 default:
2918 break;
2919 }
2920 }
2921
Brad Smith5b05db82014-06-24 19:51:29 +00002922 // OpenBSD-specific defaults for PIE
2923 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002924 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00002925 case llvm::Triple::mips64:
2926 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002927 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002928 case llvm::Triple::x86:
2929 case llvm::Triple::x86_64:
2930 IsPICLevelTwo = false; // "-fpie"
2931 break;
2932
2933 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00002934 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00002935 case llvm::Triple::sparcv9:
2936 IsPICLevelTwo = true; // "-fPIE"
2937 break;
2938
2939 default:
2940 break;
2941 }
2942 }
2943
Alexey Samsonov090301e2013-04-09 12:28:19 +00002944 // For the PIC and PIE flag options, this logic is different from the
2945 // legacy logic in very old versions of GCC, as that logic was just
2946 // a bug no one had ever fixed. This logic is both more rational and
2947 // consistent with GCC's new logic now that the bugs are fixed. The last
2948 // argument relating to either PIC or PIE wins, and no other argument is
2949 // used. If the last argument is any flavor of the '-fno-...' arguments,
2950 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2951 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002952 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2953 options::OPT_fpic, options::OPT_fno_pic,
2954 options::OPT_fPIE, options::OPT_fno_PIE,
2955 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002956 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2957 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002958 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002959 if (LastPICArg) {
2960 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002961 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2962 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2963 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002964 PIC =
2965 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2966 IsPICLevelTwo =
2967 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002968 } else {
2969 PIE = PIC = false;
2970 }
2971 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002972 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002973
Nick Lewycky609dd662013-10-11 03:33:53 +00002974 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002975 // specified while enabling PIC enabled level 1 PIC, just force it back to
2976 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2977 // informal testing).
2978 if (PIC && getToolChain().getTriple().isOSDarwin())
2979 IsPICLevelTwo |= getToolChain().isPICDefault();
2980
Chandler Carruthc0c04552012-04-08 16:40:35 +00002981 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2982 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002983 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002984 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002985 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002986 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002987 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002988
Chandler Carruth76a943b2012-11-19 03:52:03 +00002989 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2990 // This is a very special mode. It trumps the other modes, almost no one
2991 // uses it, and it isn't even valid on any OS but Darwin.
2992 if (!getToolChain().getTriple().isOSDarwin())
2993 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002994 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002995
2996 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2997
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002998 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002999 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003000
Chandler Carruth76a943b2012-11-19 03:52:03 +00003001 // Only a forced PIC mode can cause the actual compile to have PIC defines
3002 // etc., no flags are sufficient. This behavior was selected to closely
3003 // match that of llvm-gcc and Apple GCC before that.
3004 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3005 CmdArgs.push_back("-pic-level");
3006 CmdArgs.push_back("2");
3007 }
3008 } else {
3009 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3010 // handled in Clang's IRGen by the -pie-level flag.
3011 CmdArgs.push_back("-mrelocation-model");
3012 CmdArgs.push_back(PIC ? "pic" : "static");
3013
3014 if (PIC) {
3015 CmdArgs.push_back("-pic-level");
3016 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3017 if (PIE) {
3018 CmdArgs.push_back("-pie-level");
3019 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3020 }
3021 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003022 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003023
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003024 CmdArgs.push_back("-mthread-model");
3025 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3026 CmdArgs.push_back(A->getValue());
3027 else
3028 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3029
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003030 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3031
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003032 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3033 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003034 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003035
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003036 // LLVM Code Generator Options.
3037
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003038 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3039 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003040 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3041 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003042 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003043 CmdArgs.push_back(A->getValue());
3044 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003045 }
3046 }
3047
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003048 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3049 StringRef v = A->getValue();
3050 CmdArgs.push_back("-mllvm");
3051 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3052 A->claim();
3053 }
3054
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003055 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3056 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003057 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003058 }
3059
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003060 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3061 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003062 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003063 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003064 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003065 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3066 CmdArgs.push_back("-fpcc-struct-return");
3067 } else {
3068 assert(A->getOption().matches(options::OPT_freg_struct_return));
3069 CmdArgs.push_back("-freg-struct-return");
3070 }
3071 }
3072
Roman Divacky65b88cd2011-03-01 17:40:53 +00003073 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3074 CmdArgs.push_back("-mrtd");
3075
Rafael Espindola224dd632011-12-14 21:02:23 +00003076 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003077 CmdArgs.push_back("-mdisable-fp-elim");
3078 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3079 options::OPT_fno_zero_initialized_in_bss))
3080 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003081
3082 bool OFastEnabled = isOptimizationLevelFast(Args);
3083 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3084 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003085 OptSpecifier StrictAliasingAliasOption =
3086 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003087 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3088 // doesn't do any TBAA.
3089 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003090 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003091 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003092 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003093 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3094 options::OPT_fno_struct_path_tbaa))
3095 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003096 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3097 false))
3098 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003099 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3100 options::OPT_fno_optimize_sibling_calls))
3101 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003102
Eric Christopher006208c2013-04-04 06:29:47 +00003103 // Handle segmented stacks.
3104 if (Args.hasArg(options::OPT_fsplit_stack))
3105 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003106
3107 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3108 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003109 OptSpecifier FastMathAliasOption =
3110 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3111
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003112 // Handle various floating point optimization flags, mapping them to the
3113 // appropriate LLVM code generation flags. The pattern for all of these is to
3114 // default off the codegen optimizations, and if any flag enables them and no
3115 // flag disables them after the flag enabling them, enable the codegen
3116 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003117 if (Arg *A = Args.getLastArg(
3118 options::OPT_ffast_math, FastMathAliasOption,
3119 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3120 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3121 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003122 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3123 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003124 A->getOption().getID() != options::OPT_fhonor_infinities)
3125 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003126 if (Arg *A = Args.getLastArg(
3127 options::OPT_ffast_math, FastMathAliasOption,
3128 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3129 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3130 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003131 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3132 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003133 A->getOption().getID() != options::OPT_fhonor_nans)
3134 CmdArgs.push_back("-menable-no-nans");
3135
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003136 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3137 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003138 if (Arg *A =
3139 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3140 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3141 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003142 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3143 // However, turning *off* -ffast_math merely restores the toolchain default
3144 // (which may be false).
3145 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3146 A->getOption().getID() == options::OPT_ffast_math ||
3147 A->getOption().getID() == options::OPT_Ofast)
3148 MathErrno = false;
3149 else if (A->getOption().getID() == options::OPT_fmath_errno)
3150 MathErrno = true;
3151 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003152 if (MathErrno)
3153 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003154
3155 // There are several flags which require disabling very specific
3156 // optimizations. Any of these being disabled forces us to turn off the
3157 // entire set of LLVM optimizations, so collect them through all the flag
3158 // madness.
3159 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003160 if (Arg *A = Args.getLastArg(
3161 options::OPT_ffast_math, FastMathAliasOption,
3162 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3163 options::OPT_fno_unsafe_math_optimizations,
3164 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003165 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3166 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003167 A->getOption().getID() != options::OPT_fno_associative_math)
3168 AssociativeMath = true;
3169 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003170 if (Arg *A = Args.getLastArg(
3171 options::OPT_ffast_math, FastMathAliasOption,
3172 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3173 options::OPT_fno_unsafe_math_optimizations,
3174 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003175 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3176 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003177 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3178 ReciprocalMath = true;
3179 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003180 if (Arg *A = Args.getLastArg(
3181 options::OPT_ffast_math, FastMathAliasOption,
3182 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3183 options::OPT_fno_unsafe_math_optimizations,
3184 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003185 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3186 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003187 A->getOption().getID() != options::OPT_fsigned_zeros)
3188 SignedZeros = false;
3189 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003190 if (Arg *A = Args.getLastArg(
3191 options::OPT_ffast_math, FastMathAliasOption,
3192 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3193 options::OPT_fno_unsafe_math_optimizations,
3194 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003195 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3196 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003197 A->getOption().getID() != options::OPT_ftrapping_math)
3198 TrappingMath = false;
3199 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3200 !TrappingMath)
3201 CmdArgs.push_back("-menable-unsafe-fp-math");
3202
Sanjay Patel76c9e092015-01-23 16:40:50 +00003203 if (!SignedZeros)
3204 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003205
Sanjay Patel359b1052015-04-09 15:03:23 +00003206 if (ReciprocalMath)
3207 CmdArgs.push_back("-freciprocal-math");
3208
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003209 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003210 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003211 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003212 options::OPT_ffp_contract)) {
3213 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003214 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003215 if (Val == "fast" || Val == "on" || Val == "off") {
3216 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3217 } else {
3218 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003219 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003220 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003221 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3222 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003223 // If fast-math is set then set the fp-contract mode to fast.
3224 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3225 }
3226 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003227
Sanjay Patel2987c292015-06-11 14:53:41 +00003228 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003229
Bob Wilson6a039162012-07-19 03:52:53 +00003230 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3231 // and if we find them, tell the frontend to provide the appropriate
3232 // preprocessor macros. This is distinct from enabling any optimizations as
3233 // these options induce language changes which must survive serialization
3234 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003235 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3236 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003237 if (!A->getOption().matches(options::OPT_fno_fast_math))
3238 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003239 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3240 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003241 if (A->getOption().matches(options::OPT_ffinite_math_only))
3242 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003243
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003244 // Decide whether to use verbose asm. Verbose assembly is the default on
3245 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003246 bool IsIntegratedAssemblerDefault =
3247 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003248 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003249 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003250 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003251 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003252
Rafael Espindolab8a12932015-05-22 20:44:03 +00003253 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3254 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003255 CmdArgs.push_back("-no-integrated-as");
3256
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003257 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3258 CmdArgs.push_back("-mdebug-pass");
3259 CmdArgs.push_back("Structure");
3260 }
3261 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3262 CmdArgs.push_back("-mdebug-pass");
3263 CmdArgs.push_back("Arguments");
3264 }
3265
John McCall8517abc2010-02-19 02:45:38 +00003266 // Enable -mconstructor-aliases except on darwin, where we have to
3267 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003268 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003269 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003270
John McCall7ef5cb32011-03-18 02:56:14 +00003271 // Darwin's kernel doesn't support guard variables; just die if we
3272 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003273 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003274 CmdArgs.push_back("-fforbid-guard-variables");
3275
Douglas Gregordbe39272011-02-01 15:15:22 +00003276 if (Args.hasArg(options::OPT_mms_bitfields)) {
3277 CmdArgs.push_back("-mms-bitfields");
3278 }
John McCall8517abc2010-02-19 02:45:38 +00003279
Daniel Dunbar306945d2009-09-16 06:17:29 +00003280 // This is a coarse approximation of what llvm-gcc actually does, both
3281 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3282 // complicated ways.
3283 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003284 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3285 options::OPT_fno_asynchronous_unwind_tables,
3286 (getToolChain().IsUnwindTablesDefault() ||
3287 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3288 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003289 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3290 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003291 CmdArgs.push_back("-munwind-tables");
3292
Chandler Carruth05fb5852012-11-21 23:40:23 +00003293 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003294
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003295 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3296 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003297 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003298 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003299
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003300 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003301 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003302
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003303 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003304 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003305 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003306 }
3307
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003308 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003309 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003310 if (!CPU.empty()) {
3311 CmdArgs.push_back("-target-cpu");
3312 CmdArgs.push_back(Args.MakeArgString(CPU));
3313 }
3314
Rafael Espindolaeb265472013-08-21 21:59:03 +00003315 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3316 CmdArgs.push_back("-mfpmath");
3317 CmdArgs.push_back(A->getValue());
3318 }
3319
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003320 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003321 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003322
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003323 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003324 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003325 default:
3326 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003327
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003328 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003329 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003330 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003331 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003332 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003333 break;
3334
Tim Northover573cbee2014-05-24 12:52:07 +00003335 case llvm::Triple::aarch64:
3336 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003337 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003338 break;
3339
Eric Christopher0b26a612010-03-02 02:41:08 +00003340 case llvm::Triple::mips:
3341 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003342 case llvm::Triple::mips64:
3343 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003344 AddMIPSTargetArgs(Args, CmdArgs);
3345 break;
3346
Ulrich Weigand8afad612014-07-28 13:17:52 +00003347 case llvm::Triple::ppc:
3348 case llvm::Triple::ppc64:
3349 case llvm::Triple::ppc64le:
3350 AddPPCTargetArgs(Args, CmdArgs);
3351 break;
3352
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003353 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003354 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003355 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003356 AddSparcTargetArgs(Args, CmdArgs);
3357 break;
3358
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003359 case llvm::Triple::x86:
3360 case llvm::Triple::x86_64:
3361 AddX86TargetArgs(Args, CmdArgs);
3362 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003363
3364 case llvm::Triple::hexagon:
3365 AddHexagonTargetArgs(Args, CmdArgs);
3366 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003367 }
3368
Hans Wennborg75958c42013-08-08 00:17:41 +00003369 // Add clang-cl arguments.
3370 if (getToolChain().getDriver().IsCLMode())
3371 AddClangCLArgs(Args, CmdArgs);
3372
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003373 // Pass the linker version in use.
3374 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3375 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003376 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003377 }
3378
Eric Christopherb7d97e92013-04-03 01:58:53 +00003379 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003380 CmdArgs.push_back("-momit-leaf-frame-pointer");
3381
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003382 // Explicitly error on some things we know we don't support and can't just
3383 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003384 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003385 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3386 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003387 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003388 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003389 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3390 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003391 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003392 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003393 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003394 }
3395
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003396 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003397 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003398 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003399 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003400 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3401 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003402 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003403 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003404 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003405
Chad Rosierbe10f982011-08-02 17:58:04 +00003406 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003407 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003408 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3409 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003410 }
3411
Manman Ren17bdb0f2013-11-20 20:22:14 +00003412 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3413 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003414 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003415 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003416 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3417 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003418 // FIXME: we should support specifying dwarf version with
3419 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003420 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003421 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003422 const llvm::Triple &Triple = getToolChain().getTriple();
3423 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003424 Triple.getOS() == llvm::Triple::FreeBSD ||
3425 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003426 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003427 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003428 CmdArgs.push_back("-gdwarf-2");
3429 else if (A->getOption().matches(options::OPT_gdwarf_3))
3430 CmdArgs.push_back("-gdwarf-3");
3431 else if (A->getOption().matches(options::OPT_gdwarf_4))
3432 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003433 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003434 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003435 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003436 const llvm::Triple &Triple = getToolChain().getTriple();
3437 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003438 Triple.getOS() == llvm::Triple::FreeBSD ||
3439 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003440 CmdArgs.push_back("-gdwarf-2");
3441 else
3442 CmdArgs.push_back("-g");
3443 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003444 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003445
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003446 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3447 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003448 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3449 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003450 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003451
Eric Christopher138c32b2013-09-13 22:37:55 +00003452 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003453 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3454 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003455 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003456 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003457 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003458 CmdArgs.push_back("-g");
3459 CmdArgs.push_back("-backend-option");
3460 CmdArgs.push_back("-split-dwarf=Enable");
3461 }
3462
Eric Christopher138c32b2013-09-13 22:37:55 +00003463 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3464 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3465 CmdArgs.push_back("-backend-option");
3466 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3467 }
Eric Christophereec89c22013-06-18 00:03:50 +00003468
Eric Christopher0d403d22014-02-14 01:27:03 +00003469 // -gdwarf-aranges turns on the emission of the aranges section in the
3470 // backend.
3471 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3472 CmdArgs.push_back("-backend-option");
3473 CmdArgs.push_back("-generate-arange-section");
3474 }
3475
David Blaikief36d9ba2014-01-27 18:52:43 +00003476 if (Args.hasFlag(options::OPT_fdebug_types_section,
3477 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003478 CmdArgs.push_back("-backend-option");
3479 CmdArgs.push_back("-generate-type-units");
3480 }
Eric Christophereec89c22013-06-18 00:03:50 +00003481
Ed Schouten6e576152015-03-26 17:50:28 +00003482 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3483 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3484
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003485 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003486 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003487 CmdArgs.push_back("-ffunction-sections");
3488 }
3489
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003490 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3491 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003492 CmdArgs.push_back("-fdata-sections");
3493 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003494
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003495 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003496 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003497 CmdArgs.push_back("-fno-unique-section-names");
3498
Chris Lattner3c77a352010-06-22 00:03:40 +00003499 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3500
Justin Bognera71e6812015-04-30 23:49:42 +00003501 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3502 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003503 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3504 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3505 D.Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003506 << "-fprofile-instr-generate"
3507 << "-fprofile-instr-use";
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003508
Justin Bognera71e6812015-04-30 23:49:42 +00003509 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3510 A->render(Args, CmdArgs);
3511 else
3512 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003513
3514 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3515 A->render(Args, CmdArgs);
3516 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3517 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3518
Nick Lewycky207bce32011-04-21 23:44:07 +00003519 if (Args.hasArg(options::OPT_ftest_coverage) ||
3520 Args.hasArg(options::OPT_coverage))
3521 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003522 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3523 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003524 Args.hasArg(options::OPT_coverage))
3525 CmdArgs.push_back("-femit-coverage-data");
3526
Alex Lorenzee024992014-08-04 18:41:51 +00003527 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003528 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3529 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003530 D.Diag(diag::err_drv_argument_only_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003531 << "-fcoverage-mapping"
3532 << "-fprofile-instr-generate";
Alex Lorenzee024992014-08-04 18:41:51 +00003533
3534 if (Args.hasArg(options::OPT_fcoverage_mapping))
3535 CmdArgs.push_back("-fcoverage-mapping");
3536
Nick Lewycky480cb992011-05-04 20:46:58 +00003537 if (C.getArgs().hasArg(options::OPT_c) ||
3538 C.getArgs().hasArg(options::OPT_S)) {
3539 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003540 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003541 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003542 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003543 CoverageFilename = FinalOutput->getValue();
3544 } else {
3545 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3546 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003547 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003548 SmallString<128> Pwd;
3549 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003550 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003551 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003552 }
3553 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003554 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003555 }
3556 }
3557
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003558 // Pass options for controlling the default header search paths.
3559 if (Args.hasArg(options::OPT_nostdinc)) {
3560 CmdArgs.push_back("-nostdsysteminc");
3561 CmdArgs.push_back("-nobuiltininc");
3562 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003563 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003564 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003565 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3566 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3567 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003568
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003569 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003570 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003571 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003572
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003573 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3574
Ted Kremenekf7639e12012-03-06 20:06:33 +00003575 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003576 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003577 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003578 options::OPT_ccc_arcmt_modify,
3579 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003580 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003581 switch (A->getOption().getID()) {
3582 default:
3583 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003584 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003585 CmdArgs.push_back("-arcmt-check");
3586 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003587 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003588 CmdArgs.push_back("-arcmt-modify");
3589 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003590 case options::OPT_ccc_arcmt_migrate:
3591 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003592 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003593 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003594
3595 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3596 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003597 break;
John McCalld70fb982011-06-15 23:25:17 +00003598 }
3599 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003600 } else {
3601 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3602 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3603 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003604 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003605
Ted Kremenekf7639e12012-03-06 20:06:33 +00003606 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3607 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003608 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3609 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003610 }
3611 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003612 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003613
3614 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003615 options::OPT_objcmt_migrate_subscripting,
3616 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003617 // None specified, means enable them all.
3618 CmdArgs.push_back("-objcmt-migrate-literals");
3619 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003620 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003621 } else {
3622 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3623 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003624 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003625 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003626 } else {
3627 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3628 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3629 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3630 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3631 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3632 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003633 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003634 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3635 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3636 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3637 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3638 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3639 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3640 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003641 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003642 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003643 }
3644
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003645 // Add preprocessing options like -I, -D, etc. if we are using the
3646 // preprocessor.
3647 //
3648 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003649 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003650 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003651
Rafael Espindolaa7431922011-07-21 23:40:37 +00003652 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3653 // that "The compiler can only warn and ignore the option if not recognized".
3654 // When building with ccache, it will pass -D options to clang even on
3655 // preprocessed inputs and configure concludes that -fPIC is not supported.
3656 Args.ClaimAllArgs(options::OPT_D);
3657
Alp Toker7874bdc2013-11-15 20:40:58 +00003658 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003659 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3660 if (A->getOption().matches(options::OPT_O4)) {
3661 CmdArgs.push_back("-O3");
3662 D.Diag(diag::warn_O4_is_O3);
3663 } else {
3664 A->render(Args, CmdArgs);
3665 }
3666 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003667
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003668 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003669 for (const Arg *A :
3670 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3671 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003672 }
3673
Rafael Espindola577637a2015-01-03 00:06:04 +00003674 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003675
Richard Smith3be1cb22014-08-07 00:24:21 +00003676 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003677 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003678 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3679 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003680 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003681 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003682
3683 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003684 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003685 //
3686 // If a std is supplied, only add -trigraphs if it follows the
3687 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003688 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003689 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3690 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003691 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003692 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003693 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003694 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003695 else
3696 Std->render(Args, CmdArgs);
3697
Nico Weber00721502014-12-23 22:32:37 +00003698 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003699 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003700 options::OPT_ftrigraphs,
3701 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003702 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003703 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003704 } else {
3705 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003706 //
3707 // FIXME: Clang doesn't correctly handle -std= when the input language
3708 // doesn't match. For the time being just ignore this for C++ inputs;
3709 // eventually we want to do all the standard defaulting here instead of
3710 // splitting it between the driver and clang -cc1.
3711 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003712 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3713 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003714 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003715 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003716
Nico Weber00721502014-12-23 22:32:37 +00003717 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3718 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003719 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003720
Richard Smith282b4492013-09-04 22:50:31 +00003721 // GCC's behavior for -Wwrite-strings is a bit strange:
3722 // * In C, this "warning flag" changes the types of string literals from
3723 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3724 // for the discarded qualifier.
3725 // * In C++, this is just a normal warning flag.
3726 //
3727 // Implementing this warning correctly in C is hard, so we follow GCC's
3728 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3729 // a non-const char* in C, rather than using this crude hack.
3730 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003731 // FIXME: This should behave just like a warning flag, and thus should also
3732 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3733 Arg *WriteStrings =
3734 Args.getLastArg(options::OPT_Wwrite_strings,
3735 options::OPT_Wno_write_strings, options::OPT_w);
3736 if (WriteStrings &&
3737 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003738 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003739 }
3740
Chandler Carruth61fbf622011-04-23 09:27:53 +00003741 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003742 // during C++ compilation, which it is by default. GCC keeps this define even
3743 // in the presence of '-w', match this behavior bug-for-bug.
3744 if (types::isCXX(InputType) &&
3745 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3746 true)) {
3747 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003748 }
3749
Chandler Carruthe0391482010-05-22 02:21:53 +00003750 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3751 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3752 if (Asm->getOption().matches(options::OPT_fasm))
3753 CmdArgs.push_back("-fgnu-keywords");
3754 else
3755 CmdArgs.push_back("-fno-gnu-keywords");
3756 }
3757
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003758 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3759 CmdArgs.push_back("-fno-dwarf-directory-asm");
3760
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003761 if (ShouldDisableAutolink(Args, getToolChain()))
3762 CmdArgs.push_back("-fno-autolink");
3763
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003764 // Add in -fdebug-compilation-dir if necessary.
3765 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003766
Richard Smith9a568822011-11-21 19:36:32 +00003767 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3768 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003769 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003770 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003771 }
3772
Richard Smith79c927b2013-11-06 19:31:51 +00003773 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3774 CmdArgs.push_back("-foperator-arrow-depth");
3775 CmdArgs.push_back(A->getValue());
3776 }
3777
Richard Smith9a568822011-11-21 19:36:32 +00003778 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3779 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003780 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003781 }
3782
Richard Smitha3d3bd22013-05-08 02:12:03 +00003783 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3784 CmdArgs.push_back("-fconstexpr-steps");
3785 CmdArgs.push_back(A->getValue());
3786 }
3787
Richard Smithb3a14522013-02-22 01:59:51 +00003788 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3789 CmdArgs.push_back("-fbracket-depth");
3790 CmdArgs.push_back(A->getValue());
3791 }
3792
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003793 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3794 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003795 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003796 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003797 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3798 } else
3799 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003800 }
3801
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003802 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003803 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003804
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003805 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3806 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003807 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003808 }
David Chisnall5778fce2009-08-31 16:41:57 +00003809
Chris Lattnere23003d2010-01-09 21:54:33 +00003810 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3811 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003812 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003813 }
3814
Chris Lattnerb35583d2010-04-07 20:49:23 +00003815 CmdArgs.push_back("-ferror-limit");
3816 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003817 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003818 else
3819 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003820
Chandler Carrutha77a7272010-05-06 04:55:18 +00003821 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3822 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003823 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003824 }
3825
3826 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3827 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003828 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003829 }
3830
Richard Smithf6f003a2011-12-16 19:06:07 +00003831 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3832 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003833 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003834 }
3835
Nick Lewycky24653262014-12-16 21:39:02 +00003836 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3837 CmdArgs.push_back("-fspell-checking-limit");
3838 CmdArgs.push_back(A->getValue());
3839 }
3840
Daniel Dunbar2c978472009-11-04 06:24:47 +00003841 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003842 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003843 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003844 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003845 } else {
3846 // If -fmessage-length=N was not specified, determine whether this is a
3847 // terminal and, if so, implicitly define -fmessage-length appropriately.
3848 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003849 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003850 }
3851
John McCallb4a99d32013-02-19 01:57:35 +00003852 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3853 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3854 options::OPT_fvisibility_ms_compat)) {
3855 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3856 CmdArgs.push_back("-fvisibility");
3857 CmdArgs.push_back(A->getValue());
3858 } else {
3859 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3860 CmdArgs.push_back("-fvisibility");
3861 CmdArgs.push_back("hidden");
3862 CmdArgs.push_back("-ftype-visibility");
3863 CmdArgs.push_back("default");
3864 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003865 }
3866
Douglas Gregor08329632010-06-15 17:05:35 +00003867 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003868
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003869 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3870
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003871 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003872 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3873 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003874 CmdArgs.push_back("-ffreestanding");
3875
Daniel Dunbare357d562009-12-03 18:42:11 +00003876 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003877 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003878 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003879 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3880 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003881 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003882 // AltiVec language extensions aren't relevant for assembling.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003883 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm)
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003884 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003885 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3886 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003887
Alexey Bataevdb390212015-05-20 04:24:19 +00003888 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003889 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3890 options::OPT_fno_openmp, false))
3891 switch (getOpenMPRuntime(getToolChain(), Args)) {
3892 case OMPRT_OMP:
3893 case OMPRT_IOMP5:
3894 // Clang can generate useful OpenMP code for these two runtime libraries.
3895 CmdArgs.push_back("-fopenmp");
3896 break;
3897 default:
3898 // By default, if Clang doesn't know how to generate useful OpenMP code
3899 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3900 // down to the actual compilation.
3901 // FIXME: It would be better to have a mode which *only* omits IR
3902 // generation based on the OpenMP support so that we get consistent
3903 // semantic analysis, etc.
3904 break;
3905 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003906
Peter Collingbourne32701642013-11-01 18:16:25 +00003907 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3908 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003909
Eric Christopher459d2712013-02-19 06:16:53 +00003910 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003911 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
3912 const llvm::Triple::ArchType Arch = getToolChain().getArch();
3913 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
3914 Arch == llvm::Triple::ppc64le))
3915 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3916 << "ppc/ppc64/ppc64le";
3917 }
Chad Rosier864dfe12012-03-13 23:45:51 +00003918
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003919 if (getToolChain().SupportsProfiling())
3920 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003921
3922 // -flax-vector-conversions is default.
3923 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3924 options::OPT_fno_lax_vector_conversions))
3925 CmdArgs.push_back("-fno-lax-vector-conversions");
3926
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003927 if (Args.getLastArg(options::OPT_fapple_kext))
3928 CmdArgs.push_back("-fapple-kext");
3929
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003930 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003931 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003932 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003933 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3934 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003935
3936 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3937 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003938 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003939 }
3940
Bob Wilson14adb362012-02-03 06:27:22 +00003941 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003942
Chandler Carruth6e501032011-03-27 00:04:55 +00003943 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3944 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003945 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00003946 if (A->getOption().matches(options::OPT_fwrapv))
3947 CmdArgs.push_back("-fwrapv");
3948 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3949 options::OPT_fno_strict_overflow)) {
3950 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3951 CmdArgs.push_back("-fwrapv");
3952 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003953
3954 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3955 options::OPT_fno_reroll_loops))
3956 if (A->getOption().matches(options::OPT_freroll_loops))
3957 CmdArgs.push_back("-freroll-loops");
3958
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003959 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003960 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3961 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003962
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003963 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3964
Daniel Dunbar4930e332009-11-17 08:07:36 +00003965 // -stack-protector=0 is default.
3966 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00003967 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
3968 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
3969 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
3970 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
3971 Args.ClaimAllArgs(options::OPT_fstack_protector);
3972 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003973 options::OPT_fstack_protector_all,
3974 options::OPT_fstack_protector_strong,
3975 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003976 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003977 StackProtectorLevel = std::max<unsigned>(
3978 LangOptions::SSPOn,
3979 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00003980 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003981 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003982 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003983 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003984 } else {
3985 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003986 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00003987 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003988 if (StackProtectorLevel) {
3989 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003990 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003991 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003992
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003993 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00003994 for (const Arg *A : Args.filtered(options::OPT__param)) {
3995 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003996 if (Str.startswith("ssp-buffer-size=")) {
3997 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003998 CmdArgs.push_back("-stack-protector-buffer-size");
3999 // FIXME: Verify the argument is a valid integer.
4000 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004001 }
Sean Silva14facf32015-06-09 01:57:17 +00004002 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004003 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004004 }
4005
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004006 // Translate -mstackrealign
4007 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4008 false)) {
4009 CmdArgs.push_back("-backend-option");
4010 CmdArgs.push_back("-force-align-stack");
4011 }
4012 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004013 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004014 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4015 }
4016
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004017 if (Args.hasArg(options::OPT_mstack_alignment)) {
4018 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4019 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004020 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004021
Hans Wennborg77dc2362015-01-20 19:45:50 +00004022 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4023 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4024
4025 if (!Size.empty())
4026 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4027 else
4028 CmdArgs.push_back("-mstack-probe-size=0");
4029 }
4030
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004031 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4032 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004033 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4034
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004035 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4036 options::OPT_mno_restrict_it)) {
4037 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4038 CmdArgs.push_back("-backend-option");
4039 CmdArgs.push_back("-arm-restrict-it");
4040 } else {
4041 CmdArgs.push_back("-backend-option");
4042 CmdArgs.push_back("-arm-no-restrict-it");
4043 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004044 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4045 TT.getArch() == llvm::Triple::thumb)) {
4046 // Windows on ARM expects restricted IT blocks
4047 CmdArgs.push_back("-backend-option");
4048 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004049 }
4050
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004051 if (TT.getArch() == llvm::Triple::arm ||
4052 TT.getArch() == llvm::Triple::thumb) {
4053 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
4054 options::OPT_mno_long_calls)) {
4055 if (A->getOption().matches(options::OPT_mlong_calls)) {
4056 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00004057 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004058 }
4059 }
4060 }
4061
Daniel Dunbard18049a2009-04-07 21:16:11 +00004062 // Forward -f options with positive and negative forms; we translate
4063 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004064 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4065 StringRef fname = A->getValue();
4066 if (!llvm::sys::fs::exists(fname))
4067 D.Diag(diag::err_drv_no_such_file) << fname;
4068 else
4069 A->render(Args, CmdArgs);
4070 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004071
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004072 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004073 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004074 CmdArgs.push_back("-fapple-kext");
4075 if (!Args.hasArg(options::OPT_fbuiltin))
4076 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004077 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004078 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004079 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004080 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004081 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004082
Nuno Lopes13c88c72009-12-16 16:59:22 +00004083 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4084 options::OPT_fno_assume_sane_operator_new))
4085 CmdArgs.push_back("-fno-assume-sane-operator-new");
4086
Daniel Dunbar4930e332009-11-17 08:07:36 +00004087 // -fblocks=0 is default.
4088 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004089 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004090 (Args.hasArg(options::OPT_fgnu_runtime) &&
4091 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4092 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004093 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004095 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004096 !getToolChain().hasBlocksRuntime())
4097 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004098 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004099
Richard Smith47972af2015-06-16 00:08:24 +00004100 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004101 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004102 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004103 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004104 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004105 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4106 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004107 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004108 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004109 HaveModules = true;
4110 }
4111 }
4112
Richard Smith47972af2015-06-16 00:08:24 +00004113 // -fmodule-maps enables implicit reading of module map files. By default,
4114 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004115 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4116 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004117 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004118 }
4119
Daniel Jasperac42b752013-10-21 06:34:34 +00004120 // -fmodules-decluse checks that modules used are declared so (off by
4121 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004122 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004123 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004124 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004125 }
4126
Daniel Jasper962b38e2014-04-11 11:47:45 +00004127 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4128 // all #included headers are part of modules.
4129 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004130 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004131 CmdArgs.push_back("-fmodules-strict-decluse");
4132 }
4133
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004134 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4135 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4136 options::OPT_fno_implicit_modules)) {
4137 CmdArgs.push_back("-fno-implicit-modules");
4138 }
4139
Daniel Jasperac42b752013-10-21 06:34:34 +00004140 // -fmodule-name specifies the module that is currently being built (or
4141 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004142 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004143
Richard Smith9887d792014-10-17 01:42:53 +00004144 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004145 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004146 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004147
Richard Smithe842a472014-10-22 02:05:46 +00004148 // -fmodule-file can be used to specify files containing precompiled modules.
4149 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4150
4151 // -fmodule-cache-path specifies where our implicitly-built module files
4152 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004153 SmallString<128> ModuleCachePath;
4154 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4155 ModuleCachePath = A->getValue();
4156 if (HaveModules) {
4157 if (C.isForDiagnostics()) {
4158 // When generating crash reports, we want to emit the modules along with
4159 // the reproduction sources, so we ignore any provided module path.
4160 ModuleCachePath = Output.getFilename();
4161 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4162 llvm::sys::path::append(ModuleCachePath, "modules");
4163 } else if (ModuleCachePath.empty()) {
4164 // No module path was provided: use the default.
4165 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4166 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004167 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4168 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004169 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4170 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004171 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004172 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4173 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4174 }
4175
4176 // When building modules and generating crashdumps, we need to dump a module
4177 // dependency VFS alongside the output.
4178 if (HaveModules && C.isForDiagnostics()) {
4179 SmallString<128> VFSDir(Output.getFilename());
4180 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004181 // Add the cache directory as a temp so the crash diagnostics pick it up.
4182 C.addTempFile(Args.MakeArgString(VFSDir));
4183
Justin Bognera88f0122014-06-20 22:59:50 +00004184 llvm::sys::path::append(VFSDir, "vfs");
4185 CmdArgs.push_back("-module-dependency-dir");
4186 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004187 }
4188
Richard Smith9887d792014-10-17 01:42:53 +00004189 if (HaveModules)
4190 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004191
Douglas Gregor35b04d62013-02-07 19:01:24 +00004192 // Pass through all -fmodules-ignore-macro arguments.
4193 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004194 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4195 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004196
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004197 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4198
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004199 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4200 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4201 D.Diag(diag::err_drv_argument_not_allowed_with)
4202 << A->getAsString(Args) << "-fbuild-session-timestamp";
4203
4204 llvm::sys::fs::file_status Status;
4205 if (llvm::sys::fs::status(A->getValue(), Status))
4206 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004207 CmdArgs.push_back(Args.MakeArgString(
4208 "-fbuild-session-timestamp=" +
4209 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004210 }
4211
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004212 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004213 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4214 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004215 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4216
4217 Args.AddLastArg(CmdArgs,
4218 options::OPT_fmodules_validate_once_per_build_session);
4219 }
4220
Ben Langmuirdcf73862014-03-12 00:06:17 +00004221 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4222
John McCalldfea9982010-04-09 19:12:06 +00004223 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004224 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004225 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004226 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004227
Anders Carlssond470fef2010-11-21 00:09:52 +00004228 // -felide-constructors is the default.
4229 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004230 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004231 CmdArgs.push_back("-fno-elide-constructors");
4232
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004233 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004234
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004235 if (KernelOrKext || (types::isCXX(InputType) &&
4236 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4237 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004238 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004239
Tony Linthicum76329bf2011-12-12 21:14:55 +00004240 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004241 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4242 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004243 CmdArgs.push_back("-fshort-enums");
4244
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004245 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004246 if (Arg *A = Args.getLastArg(
4247 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4248 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4249 if (A->getOption().matches(options::OPT_funsigned_char) ||
4250 A->getOption().matches(options::OPT_fno_signed_char)) {
4251 CmdArgs.push_back("-fno-signed-char");
4252 }
4253 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004254 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004255 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004256
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004257 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004258 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4259 options::OPT_fno_use_cxa_atexit,
4260 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004261 getToolChain().getArch() != llvm::Triple::hexagon &&
4262 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004263 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004264 CmdArgs.push_back("-fno-use-cxa-atexit");
4265
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004266 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004267 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004268 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004269 CmdArgs.push_back("-fms-extensions");
4270
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004271 // -fno-use-line-directives is default.
4272 if (Args.hasFlag(options::OPT_fuse_line_directives,
4273 options::OPT_fno_use_line_directives, false))
4274 CmdArgs.push_back("-fuse-line-directives");
4275
Francois Pichet1b4f1632011-09-17 04:32:15 +00004276 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004277 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004278 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004279 (IsWindowsMSVC &&
4280 Args.hasFlag(options::OPT_fms_extensions,
4281 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004282 CmdArgs.push_back("-fms-compatibility");
4283
David Majnemerc371ff02015-03-22 08:39:22 +00004284 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004285 VersionTuple MSVT = visualstudio::getMSVCVersion(
4286 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4287 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004288 CmdArgs.push_back(
4289 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004290
David Majnemer8db91762015-05-18 04:49:30 +00004291 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4292 if (ImplyVCPPCXXVer) {
4293 if (IsMSVC2015Compatible)
4294 CmdArgs.push_back("-std=c++14");
4295 else
4296 CmdArgs.push_back("-std=c++11");
4297 }
4298
Eric Christopher5ecce122013-02-18 00:38:31 +00004299 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004300 if (Args.hasFlag(options::OPT_fborland_extensions,
4301 options::OPT_fno_borland_extensions, false))
4302 CmdArgs.push_back("-fborland-extensions");
4303
David Majnemerc371ff02015-03-22 08:39:22 +00004304 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4305 // than 19.
4306 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4307 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004308 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004309 CmdArgs.push_back("-fno-threadsafe-statics");
4310
Francois Pichet02744872011-09-01 16:38:08 +00004311 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4312 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004313 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004314 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004315 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004316
Chandler Carruthe03aa552010-04-17 20:17:31 +00004317 // -fgnu-keywords default varies depending on language; only pass if
4318 // specified.
4319 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004320 options::OPT_fno_gnu_keywords))
4321 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004322
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004323 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004324 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004325 CmdArgs.push_back("-fgnu89-inline");
4326
Chad Rosier9c76d242012-03-15 22:31:42 +00004327 if (Args.hasArg(options::OPT_fno_inline))
4328 CmdArgs.push_back("-fno-inline");
4329
Chad Rosier64d6be92012-03-06 21:17:19 +00004330 if (Args.hasArg(options::OPT_fno_inline_functions))
4331 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004332
John McCall5fb5df92012-06-20 06:18:46 +00004333 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004334
John McCall5fb5df92012-06-20 06:18:46 +00004335 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004336 // legacy is the default. Except for deployment taget of 10.5,
4337 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4338 // gets ignored silently.
4339 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004340 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4341 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004342 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004343 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004344 if (getToolChain().UseObjCMixedDispatch())
4345 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4346 else
4347 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4348 }
4349 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004350
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004351 // When ObjectiveC legacy runtime is in effect on MacOSX,
4352 // turn on the option to do Array/Dictionary subscripting
4353 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004354 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004355 getToolChain().getTriple().isMacOSX() &&
4356 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4357 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004358 objcRuntime.isNeXTFamily())
4359 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004360
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004361 // -fencode-extended-block-signature=1 is default.
4362 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4363 CmdArgs.push_back("-fencode-extended-block-signature");
4364 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004365
John McCall24fc0de2011-07-06 00:26:06 +00004366 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4367 // NOTE: This logic is duplicated in ToolChains.cpp.
4368 bool ARC = isObjCAutoRefCount(Args);
4369 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004370 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004371
John McCall24fc0de2011-07-06 00:26:06 +00004372 CmdArgs.push_back("-fobjc-arc");
4373
Chandler Carruth491db322011-11-04 07:34:47 +00004374 // FIXME: It seems like this entire block, and several around it should be
4375 // wrapped in isObjC, but for now we just use it here as this is where it
4376 // was being used previously.
4377 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4378 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4379 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4380 else
4381 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4382 }
4383
John McCall24fc0de2011-07-06 00:26:06 +00004384 // Allow the user to enable full exceptions code emission.
4385 // We define off for Objective-CC, on for Objective-C++.
4386 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4387 options::OPT_fno_objc_arc_exceptions,
4388 /*default*/ types::isCXX(InputType)))
4389 CmdArgs.push_back("-fobjc-arc-exceptions");
4390 }
4391
4392 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4393 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004394 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004395 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004396
John McCall24fc0de2011-07-06 00:26:06 +00004397 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4398 // takes precedence.
4399 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4400 if (!GCArg)
4401 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4402 if (GCArg) {
4403 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004404 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004405 } else if (getToolChain().SupportsObjCGC()) {
4406 GCArg->render(Args, CmdArgs);
4407 } else {
4408 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004409 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004410 }
4411 }
4412
Bob Wilsonb111ec92015-03-02 19:01:14 +00004413 if (Args.hasFlag(options::OPT_fapplication_extension,
4414 options::OPT_fno_application_extension, false))
4415 CmdArgs.push_back("-fapplication-extension");
4416
Reid Klecknerc542d372014-06-27 17:02:02 +00004417 // Handle GCC-style exception args.
4418 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004419 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4420 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004421
4422 if (getToolChain().UseSjLjExceptions())
4423 CmdArgs.push_back("-fsjlj-exceptions");
4424
4425 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004426 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4427 options::OPT_fno_assume_sane_operator_new))
4428 CmdArgs.push_back("-fno-assume-sane-operator-new");
4429
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004430 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4431 // most platforms.
4432 if (Args.hasFlag(options::OPT_fsized_deallocation,
4433 options::OPT_fno_sized_deallocation, false))
4434 CmdArgs.push_back("-fsized-deallocation");
4435
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004436 // -fconstant-cfstrings is default, and may be subject to argument translation
4437 // on Darwin.
4438 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4439 options::OPT_fno_constant_cfstrings) ||
4440 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4441 options::OPT_mno_constant_cfstrings))
4442 CmdArgs.push_back("-fno-constant-cfstrings");
4443
John Thompsoned4e2952009-11-05 20:14:16 +00004444 // -fshort-wchar default varies depending on platform; only
4445 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004446 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4447 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004448 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004449
Hans Wennborg28c96312013-07-31 23:39:13 +00004450 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004451 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004452 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004453 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004454
Daniel Dunbar096ed292011-10-05 21:04:55 +00004455 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4456 // -fno-pack-struct doesn't apply to -fpack-struct=.
4457 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004458 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004459 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004460 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004461 } else if (Args.hasFlag(options::OPT_fpack_struct,
4462 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004463 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004464 }
4465
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004466 // Handle -fmax-type-align=N and -fno-type-align
4467 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4468 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4469 if (!SkipMaxTypeAlign) {
4470 std::string MaxTypeAlignStr = "-fmax-type-align=";
4471 MaxTypeAlignStr += A->getValue();
4472 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4473 }
4474 } else if (getToolChain().getTriple().isOSDarwin()) {
4475 if (!SkipMaxTypeAlign) {
4476 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4477 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4478 }
4479 }
4480
Robert Lytton0e076492013-08-13 09:43:10 +00004481 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004482 if (!Args.hasArg(options::OPT_fcommon))
4483 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004484 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004485 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004486
Daniel Dunbard18049a2009-04-07 21:16:11 +00004487 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004488 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004489 CmdArgs.push_back("-fno-common");
4490
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004491 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004492 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004493 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004494 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004495 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004496 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004497
Daniel Dunbar6358d682010-10-15 22:30:42 +00004498 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004499 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004500 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004501 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004502
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004503 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004504 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4505 StringRef value = inputCharset->getValue();
4506 if (value != "UTF-8")
4507 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4508 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004509 }
4510
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004511 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004512 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4513 StringRef value = execCharset->getValue();
4514 if (value != "UTF-8")
4515 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4516 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004517 }
4518
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004519 // -fcaret-diagnostics is default.
4520 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4521 options::OPT_fno_caret_diagnostics, true))
4522 CmdArgs.push_back("-fno-caret-diagnostics");
4523
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004524 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004525 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004526 options::OPT_fno_diagnostics_fixit_info))
4527 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004528
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004529 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004530 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004531 options::OPT_fno_diagnostics_show_option))
4532 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004533
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004534 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004535 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004536 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004537 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004538 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004539
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004540 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004541 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004542 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004543 }
4544
Chandler Carruthb6766f02011-03-27 01:50:55 +00004545 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004546 options::OPT_fdiagnostics_show_note_include_stack,
4547 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004548 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004549 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004550 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4551 else
4552 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4553 }
4554
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004555 // Color diagnostics are the default, unless the terminal doesn't support
4556 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004557 // Support both clang's -f[no-]color-diagnostics and gcc's
4558 // -f[no-]diagnostics-colors[=never|always|auto].
4559 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004560 for (const auto &Arg : Args) {
4561 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004562 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4563 !O.matches(options::OPT_fdiagnostics_color) &&
4564 !O.matches(options::OPT_fno_color_diagnostics) &&
4565 !O.matches(options::OPT_fno_diagnostics_color) &&
4566 !O.matches(options::OPT_fdiagnostics_color_EQ))
4567 continue;
4568
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004569 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004570 if (O.matches(options::OPT_fcolor_diagnostics) ||
4571 O.matches(options::OPT_fdiagnostics_color)) {
4572 ShowColors = Colors_On;
4573 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4574 O.matches(options::OPT_fno_diagnostics_color)) {
4575 ShowColors = Colors_Off;
4576 } else {
4577 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004578 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004579 if (value == "always")
4580 ShowColors = Colors_On;
4581 else if (value == "never")
4582 ShowColors = Colors_Off;
4583 else if (value == "auto")
4584 ShowColors = Colors_Auto;
4585 else
4586 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004587 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004588 }
4589 }
4590 if (ShowColors == Colors_On ||
4591 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004592 CmdArgs.push_back("-fcolor-diagnostics");
4593
Nico Rieck7857d462013-09-11 00:38:02 +00004594 if (Args.hasArg(options::OPT_fansi_escape_codes))
4595 CmdArgs.push_back("-fansi-escape-codes");
4596
Daniel Dunbardb097022009-06-08 21:13:54 +00004597 if (!Args.hasFlag(options::OPT_fshow_source_location,
4598 options::OPT_fno_show_source_location))
4599 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004600
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004601 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004602 true))
4603 CmdArgs.push_back("-fno-show-column");
4604
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004605 if (!Args.hasFlag(options::OPT_fspell_checking,
4606 options::OPT_fno_spell_checking))
4607 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004608
Chad Rosierc8e56e82012-12-05 21:08:21 +00004609 // -fno-asm-blocks is default.
4610 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4611 false))
4612 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004613
Steven Wucb0d13f2015-01-16 23:05:28 +00004614 // -fgnu-inline-asm is default.
4615 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4616 options::OPT_fno_gnu_inline_asm, true))
4617 CmdArgs.push_back("-fno-gnu-inline-asm");
4618
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004619 // Enable vectorization per default according to the optimization level
4620 // selected. For optimization levels that want vectorization we use the alias
4621 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004622 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004623 OptSpecifier VectorizeAliasOption =
4624 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004625 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004626 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004627 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004628
Chad Rosier136d67d2014-04-28 19:30:57 +00004629 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004630 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004631 OptSpecifier SLPVectAliasOption =
4632 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004633 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004634 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004635 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004636
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004637 // -fno-slp-vectorize-aggressive is default.
4638 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004639 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004640 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004641
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004642 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4643 A->render(Args, CmdArgs);
4644
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004645 // -fdollars-in-identifiers default varies depending on platform and
4646 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004647 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004648 options::OPT_fno_dollars_in_identifiers)) {
4649 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004650 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004651 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004652 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004653 }
4654
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004655 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4656 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004657 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004658 options::OPT_fno_unit_at_a_time)) {
4659 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004660 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004661 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004662
Eli Friedman055c9702011-11-02 01:53:16 +00004663 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4664 options::OPT_fno_apple_pragma_pack, false))
4665 CmdArgs.push_back("-fapple-pragma-pack");
4666
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004667 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004668 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4669 // by default.
4670 if (getToolChain().getArch() == llvm::Triple::le32) {
4671 CmdArgs.push_back("-fno-math-builtin");
4672 }
4673
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004674// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4675//
4676// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004677#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004678 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004679 (getToolChain().getArch() == llvm::Triple::arm ||
4680 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004681 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4682 CmdArgs.push_back("-fno-builtin-strcat");
4683 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4684 CmdArgs.push_back("-fno-builtin-strcpy");
4685 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004686#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004687
Justin Bognera88f0122014-06-20 22:59:50 +00004688 // Enable rewrite includes if the user's asked for it or if we're generating
4689 // diagnostics.
4690 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4691 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004692 if (Args.hasFlag(options::OPT_frewrite_includes,
4693 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004694 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004695 CmdArgs.push_back("-frewrite-includes");
4696
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004697 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004698 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004699 options::OPT_traditional_cpp)) {
4700 if (isa<PreprocessJobAction>(JA))
4701 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004702 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004703 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004704 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004705
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004706 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004707 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004708
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004709 // Handle serialized diagnostics.
4710 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4711 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004712 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004713 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004714
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004715 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4716 CmdArgs.push_back("-fretain-comments-from-system-headers");
4717
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004718 // Forward -fcomment-block-commands to -cc1.
4719 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004720 // Forward -fparse-all-comments to -cc1.
4721 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004722
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004723 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4724 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004725 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004726 bool OptDisabled = false;
Sean Silva14facf32015-06-09 01:57:17 +00004727 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4728 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004729
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004730 // We translate this by hand to the -cc1 argument, since nightly test uses
4731 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004732 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004733 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004734 OptDisabled = true;
4735 } else
Sean Silva14facf32015-06-09 01:57:17 +00004736 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004737 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004738
Bob Wilson23a55f12014-12-21 07:00:00 +00004739 // With -save-temps, we want to save the unoptimized bitcode output from the
4740 // CompileJobAction, so disable optimizations if they are not already
4741 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004742 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004743 isa<CompileJobAction>(JA))
4744 CmdArgs.push_back("-disable-llvm-optzns");
4745
Daniel Dunbard67a3222009-03-30 06:36:42 +00004746 if (Output.getType() == types::TY_Dependencies) {
4747 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004748 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004749 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004750 CmdArgs.push_back(Output.getFilename());
4751 } else {
4752 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004753 }
4754
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004755 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004756 addDashXForInput(Args, II, CmdArgs);
4757
Daniel Dunbarb440f562010-08-02 02:38:21 +00004758 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004759 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004760 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004761 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004762 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004763
Chris Lattnere9d7d782009-11-03 19:50:27 +00004764 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4765
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004766 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004767
4768 // Optionally embed the -cc1 level arguments into the debug info, for build
4769 // analysis.
4770 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004771 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004772 for (const auto &Arg : Args)
4773 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004774
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004775 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004776 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004777 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004778 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004779 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004780 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004781 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004782 }
4783 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004784 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004785 }
4786
Eric Christopherd3804002013-02-22 20:12:52 +00004787 // Add the split debug info name to the command lines here so we
4788 // can propagate it to the backend.
4789 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004790 getToolChain().getTriple().isOSLinux() &&
4791 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4792 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004793 const char *SplitDwarfOut;
4794 if (SplitDwarf) {
4795 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004796 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004797 CmdArgs.push_back(SplitDwarfOut);
4798 }
4799
4800 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004801 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004802 Output.getType() == types::TY_Object &&
4803 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004804 auto CLCommand =
4805 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4806 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4807 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004808 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004809 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004810 }
4811
Eric Christopherf1545832013-02-22 23:50:16 +00004812 // Handle the debug info splitting at object creation time if we're
4813 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004814 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004815 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004816 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004817
Roman Divacky178e01602011-02-10 16:52:03 +00004818 if (Arg *A = Args.getLastArg(options::OPT_pg))
4819 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004820 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
4821 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004822
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004823 // Claim some arguments which clang supports automatically.
4824
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004825 // -fpch-preprocess is used with gcc to add a special marker in the output to
4826 // include the PCH file. Clang's PTH solution is completely transparent, so we
4827 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004828 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004829
Daniel Dunbar17731772009-03-23 19:03:36 +00004830 // Claim some arguments which clang doesn't support, but we don't
4831 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004832 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4833 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004834
Rafael Espindolab0092d72013-09-04 19:37:35 +00004835 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004836 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004837}
4838
John McCall5fb5df92012-06-20 06:18:46 +00004839/// Add options related to the Objective-C runtime/ABI.
4840///
4841/// Returns true if the runtime is non-fragile.
4842ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4843 ArgStringList &cmdArgs,
4844 RewriteKind rewriteKind) const {
4845 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004846 Arg *runtimeArg =
4847 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
4848 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00004849
4850 // Just forward -fobjc-runtime= to the frontend. This supercedes
4851 // options about fragility.
4852 if (runtimeArg &&
4853 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4854 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004855 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004856 if (runtime.tryParse(value)) {
4857 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004858 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004859 }
4860
4861 runtimeArg->render(args, cmdArgs);
4862 return runtime;
4863 }
4864
4865 // Otherwise, we'll need the ABI "version". Version numbers are
4866 // slightly confusing for historical reasons:
4867 // 1 - Traditional "fragile" ABI
4868 // 2 - Non-fragile ABI, version 1
4869 // 3 - Non-fragile ABI, version 2
4870 unsigned objcABIVersion = 1;
4871 // If -fobjc-abi-version= is present, use that to set the version.
4872 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004873 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004874 if (value == "1")
4875 objcABIVersion = 1;
4876 else if (value == "2")
4877 objcABIVersion = 2;
4878 else if (value == "3")
4879 objcABIVersion = 3;
4880 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004881 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00004882 } else {
4883 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884 bool nonFragileABIIsDefault =
4885 (rewriteKind == RK_NonFragile ||
4886 (rewriteKind == RK_None &&
4887 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00004888 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4889 options::OPT_fno_objc_nonfragile_abi,
4890 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004891// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00004892#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4893 unsigned nonFragileABIVersion = 1;
4894#else
4895 unsigned nonFragileABIVersion = 2;
4896#endif
4897
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004898 if (Arg *abiArg =
4899 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004900 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004901 if (value == "1")
4902 nonFragileABIVersion = 1;
4903 else if (value == "2")
4904 nonFragileABIVersion = 2;
4905 else
4906 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004907 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004908 }
4909
4910 objcABIVersion = 1 + nonFragileABIVersion;
4911 } else {
4912 objcABIVersion = 1;
4913 }
4914 }
4915
4916 // We don't actually care about the ABI version other than whether
4917 // it's non-fragile.
4918 bool isNonFragile = objcABIVersion != 1;
4919
4920 // If we have no runtime argument, ask the toolchain for its default runtime.
4921 // However, the rewriter only really supports the Mac runtime, so assume that.
4922 ObjCRuntime runtime;
4923 if (!runtimeArg) {
4924 switch (rewriteKind) {
4925 case RK_None:
4926 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4927 break;
4928 case RK_Fragile:
4929 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4930 break;
4931 case RK_NonFragile:
4932 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4933 break;
4934 }
4935
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004936 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00004937 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4938 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004939 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004940 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4941
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004942 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00004943 } else {
4944 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4945 }
4946
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004947 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00004948 } else {
4949 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004950 // Legacy behaviour is to target the gnustep runtime if we are i
4951 // non-fragile mode or the GCC runtime in fragile mode.
4952 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004953 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00004954 else
4955 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004956 }
4957
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004958 cmdArgs.push_back(
4959 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00004960 return runtime;
4961}
4962
Reid Klecknerc542d372014-06-27 17:02:02 +00004963static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4964 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4965 I += HaveDash;
4966 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004967}
Reid Klecknerc542d372014-06-27 17:02:02 +00004968
4969struct EHFlags {
4970 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4971 bool Synch;
4972 bool Asynch;
4973 bool NoExceptC;
4974};
4975
4976/// /EH controls whether to run destructor cleanups when exceptions are
4977/// thrown. There are three modifiers:
4978/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4979/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4980/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4981/// - c: Assume that extern "C" functions are implicitly noexcept. This
4982/// modifier is an optimization, so we ignore it for now.
4983/// The default is /EHs-c-, meaning cleanups are disabled.
4984static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4985 EHFlags EH;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004986 std::vector<std::string> EHArgs =
4987 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00004988 for (auto EHVal : EHArgs) {
4989 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4990 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004991 case 'a':
4992 EH.Asynch = maybeConsumeDash(EHVal, I);
4993 continue;
4994 case 'c':
4995 EH.NoExceptC = maybeConsumeDash(EHVal, I);
4996 continue;
4997 case 's':
4998 EH.Synch = maybeConsumeDash(EHVal, I);
4999 continue;
5000 default:
5001 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005002 }
5003 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5004 break;
5005 }
5006 }
5007 return EH;
5008}
5009
Hans Wennborg75958c42013-08-08 00:17:41 +00005010void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5011 unsigned RTOptionID = options::OPT__SLASH_MT;
5012
Hans Wennborgf1a74252013-09-10 20:18:04 +00005013 if (Args.hasArg(options::OPT__SLASH_LDd))
5014 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5015 // but defining _DEBUG is sticky.
5016 RTOptionID = options::OPT__SLASH_MTd;
5017
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005018 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005019 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005020
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005021 switch (RTOptionID) {
5022 case options::OPT__SLASH_MD:
5023 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005024 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005025 CmdArgs.push_back("-D_MT");
5026 CmdArgs.push_back("-D_DLL");
5027 CmdArgs.push_back("--dependent-lib=msvcrt");
5028 break;
5029 case options::OPT__SLASH_MDd:
5030 CmdArgs.push_back("-D_DEBUG");
5031 CmdArgs.push_back("-D_MT");
5032 CmdArgs.push_back("-D_DLL");
5033 CmdArgs.push_back("--dependent-lib=msvcrtd");
5034 break;
5035 case options::OPT__SLASH_MT:
5036 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005037 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005038 CmdArgs.push_back("-D_MT");
5039 CmdArgs.push_back("--dependent-lib=libcmt");
5040 break;
5041 case options::OPT__SLASH_MTd:
5042 CmdArgs.push_back("-D_DEBUG");
5043 CmdArgs.push_back("-D_MT");
5044 CmdArgs.push_back("--dependent-lib=libcmtd");
5045 break;
5046 default:
5047 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005048 }
5049
Reid Kleckner6beca0e2013-08-08 19:33:10 +00005050 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5051 // users want. The /Za flag to cl.exe turns this off, but it's not
5052 // implemented in clang.
5053 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00005054
Hans Wennborg8858a032014-07-21 23:42:07 +00005055 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5056 // would produce interleaved output, so ignore /showIncludes in such cases.
5057 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5058 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5059 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005060
David Majnemerf6072342014-07-01 22:24:56 +00005061 // This controls whether or not we emit RTTI data for polymorphic types.
5062 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5063 /*default=*/false))
5064 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005065
Reid Klecknerc542d372014-06-27 17:02:02 +00005066 const Driver &D = getToolChain().getDriver();
5067 EHFlags EH = parseClangCLEHFlags(D, Args);
5068 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005069 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005070 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005071 CmdArgs.push_back("-fexceptions");
5072 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005073
Hans Wennborge50cec32014-06-13 20:59:54 +00005074 // /EP should expand to -E -P.
5075 if (Args.hasArg(options::OPT__SLASH_EP)) {
5076 CmdArgs.push_back("-E");
5077 CmdArgs.push_back("-P");
5078 }
5079
David Majnemera5b195a2015-02-14 01:35:12 +00005080 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005081 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5082 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005083 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5084 else
5085 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5086
5087 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5088 VolatileOptionID = A->getOption().getID();
5089
5090 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5091 CmdArgs.push_back("-fms-volatile");
5092
David Majnemer86c318f2014-02-11 21:05:00 +00005093 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5094 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5095 if (MostGeneralArg && BestCaseArg)
5096 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5097 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5098
5099 if (MostGeneralArg) {
5100 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5101 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5102 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5103
5104 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5105 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5106 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5107 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5108 << FirstConflict->getAsString(Args)
5109 << SecondConflict->getAsString(Args);
5110
5111 if (SingleArg)
5112 CmdArgs.push_back("-fms-memptr-rep=single");
5113 else if (MultipleArg)
5114 CmdArgs.push_back("-fms-memptr-rep=multiple");
5115 else
5116 CmdArgs.push_back("-fms-memptr-rep=virtual");
5117 }
5118
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005119 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5120 A->render(Args, CmdArgs);
5121
Hans Wennborg81f74482013-09-10 01:07:07 +00005122 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5123 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005124 if (Args.hasArg(options::OPT__SLASH_fallback))
5125 CmdArgs.push_back("msvc-fallback");
5126 else
5127 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005128 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005129}
5130
Douglas Katzman95354292015-06-23 20:42:09 +00005131visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005132 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005133 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005134 return CLFallback.get();
5135}
5136
Daniel Sanders7f933f42015-01-30 17:35:23 +00005137void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5138 ArgStringList &CmdArgs) const {
5139 StringRef CPUName;
5140 StringRef ABIName;
5141 const llvm::Triple &Triple = getToolChain().getTriple();
5142 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5143
5144 CmdArgs.push_back("-target-abi");
5145 CmdArgs.push_back(ABIName.data());
5146}
5147
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005148void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005149 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005150 const ArgList &Args,
5151 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005152 ArgStringList CmdArgs;
5153
5154 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5155 const InputInfo &Input = Inputs[0];
5156
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005157 // Don't warn about "clang -w -c foo.s"
5158 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005159 // and "clang -emit-llvm -c foo.s"
5160 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005161
Rafael Espindola577637a2015-01-03 00:06:04 +00005162 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005163
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005164 // Invoke ourselves in -cc1as mode.
5165 //
5166 // FIXME: Implement custom jobs for internal actions.
5167 CmdArgs.push_back("-cc1as");
5168
5169 // Add the "effective" target triple.
5170 CmdArgs.push_back("-triple");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005171 std::string TripleStr =
5172 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005173 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5174
5175 // Set the output mode, we currently only expect to be used as a real
5176 // assembler.
5177 CmdArgs.push_back("-filetype");
5178 CmdArgs.push_back("obj");
5179
Eric Christopher45f2e712012-12-18 00:31:10 +00005180 // Set the main file name, so that debug info works even with
5181 // -save-temps or preprocessed assembly.
5182 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005183 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005184
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005185 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005186 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005187 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005188 if (!CPU.empty()) {
5189 CmdArgs.push_back("-target-cpu");
5190 CmdArgs.push_back(Args.MakeArgString(CPU));
5191 }
5192
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005193 // Add the target features
5194 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005195 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005196
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005197 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005198 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005199
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005200 // Pass along any -I options so we get proper .include search paths.
5201 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5202
Eric Christopherfc3ee562012-01-10 00:38:01 +00005203 // Determine the original source input.
5204 const Action *SourceAction = &JA;
5205 while (SourceAction->getKind() != Action::InputClass) {
5206 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5207 SourceAction = SourceAction->getInputs()[0];
5208 }
5209
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005210 // Forward -g and handle debug info related flags, assuming we are dealing
5211 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005212 if (SourceAction->getType() == types::TY_Asm ||
5213 SourceAction->getType() == types::TY_PP_Asm) {
5214 Args.ClaimAllArgs(options::OPT_g_Group);
5215 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5216 if (!A->getOption().matches(options::OPT_g0))
5217 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005218
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005219 if (Args.hasArg(options::OPT_gdwarf_2))
5220 CmdArgs.push_back("-gdwarf-2");
5221 if (Args.hasArg(options::OPT_gdwarf_3))
5222 CmdArgs.push_back("-gdwarf-3");
5223 if (Args.hasArg(options::OPT_gdwarf_4))
5224 CmdArgs.push_back("-gdwarf-4");
5225
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005226 // Add the -fdebug-compilation-dir flag if needed.
5227 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005228
5229 // Set the AT_producer to the clang version when using the integrated
5230 // assembler on assembly source files.
5231 CmdArgs.push_back("-dwarf-debug-producer");
5232 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005233 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005234
5235 // Optionally embed the -cc1as level arguments into the debug info, for build
5236 // analysis.
5237 if (getToolChain().UseDwarfDebugFlags()) {
5238 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005239 for (const auto &Arg : Args)
5240 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005241
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005242 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005243 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5244 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005245 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005246 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005247 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005248 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005249 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005250 }
5251 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005252 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005253 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005254
5255 // FIXME: Add -static support, once we have it.
5256
Daniel Sanders7f933f42015-01-30 17:35:23 +00005257 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005258 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005259 default:
5260 break;
5261
5262 case llvm::Triple::mips:
5263 case llvm::Triple::mipsel:
5264 case llvm::Triple::mips64:
5265 case llvm::Triple::mips64el:
5266 AddMIPSTargetArgs(Args, CmdArgs);
5267 break;
5268 }
5269
David Blaikie372d9502014-01-17 03:17:40 +00005270 // Consume all the warning flags. Usually this would be handled more
5271 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5272 // doesn't handle that so rather than warning about unused flags that are
5273 // actually used, we'll lie by omission instead.
5274 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005275 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5276 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005277
David Blaikie9260ed62013-07-25 21:19:01 +00005278 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5279 getToolChain().getDriver());
5280
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005281 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005282
5283 assert(Output.isFilename() && "Unexpected lipo output.");
5284 CmdArgs.push_back("-o");
5285 CmdArgs.push_back(Output.getFilename());
5286
Daniel Dunbarb440f562010-08-02 02:38:21 +00005287 assert(Input.isFilename() && "Invalid input.");
5288 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005289
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005290 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005292
5293 // Handle the debug info splitting at object creation time if we're
5294 // creating an object.
5295 // TODO: Currently only works on linux with newer objcopy.
5296 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005297 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005298 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005299 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005300}
5301
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005302void GnuTool::anchor() {}
5303
Daniel Dunbara3246a02009-03-18 08:07:30 +00005304void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005305 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005306 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005307 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005308 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005309 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005310
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005311 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005312 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005313 // Don't forward any -g arguments to assembly steps.
5314 if (isa<AssembleJobAction>(JA) &&
5315 A->getOption().matches(options::OPT_g_Group))
5316 continue;
5317
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005318 // Don't forward any -W arguments to assembly and link steps.
5319 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5320 A->getOption().matches(options::OPT_W_Group))
5321 continue;
5322
Daniel Dunbar2da02722009-03-19 07:55:12 +00005323 // It is unfortunate that we have to claim here, as this means
5324 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005325 // platforms using a generic gcc, even if we are just using gcc
5326 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005327 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005328 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005329 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005330 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005331
Daniel Dunbar4e295052010-01-25 22:35:08 +00005332 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005333
5334 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005335 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005336 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005337 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005338 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005339 }
5340
Daniel Dunbar5716d872009-05-02 21:41:52 +00005341 // Try to force gcc to match the tool chain we want, if we recognize
5342 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005343 //
5344 // FIXME: The triple class should directly provide the information we want
5345 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005346 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005347 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005348 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005349 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5350 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005351 CmdArgs.push_back("-m64");
5352
Daniel Dunbarb440f562010-08-02 02:38:21 +00005353 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005354 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005355 CmdArgs.push_back(Output.getFilename());
5356 } else {
5357 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005358 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005359 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005361 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005362
5363 // Only pass -x if gcc will understand it; otherwise hope gcc
5364 // understands the suffix correctly. The main use case this would go
5365 // wrong in is for linker inputs if they happened to have an odd
5366 // suffix; really the only way to get this to happen is a command
5367 // like '-x foobar a.c' which will treat a.c like a linker input.
5368 //
5369 // FIXME: For the linker case specifically, can we safely convert
5370 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005371 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005372 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005373 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5374 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005375 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005376 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005377 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005378 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005379 else if (II.getType() == types::TY_ModuleFile)
5380 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005381 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005382
Daniel Dunbara3246a02009-03-18 08:07:30 +00005383 if (types::canTypeBeUserSpecified(II.getType())) {
5384 CmdArgs.push_back("-x");
5385 CmdArgs.push_back(types::getTypeName(II.getType()));
5386 }
5387
Daniel Dunbarb440f562010-08-02 02:38:21 +00005388 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005389 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005390 else {
5391 const Arg &A = II.getInputArg();
5392
5393 // Reverse translate some rewritten options.
5394 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5395 CmdArgs.push_back("-lstdc++");
5396 continue;
5397 }
5398
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005399 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005400 A.render(Args, CmdArgs);
5401 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005402 }
5403
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005404 const std::string customGCCName = D.getCCCGenericGCCName();
5405 const char *GCCName;
5406 if (!customGCCName.empty())
5407 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005408 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005409 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005410 } else
5411 GCCName = "gcc";
5412
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005413 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005414 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005415}
5416
Douglas Katzman95354292015-06-23 20:42:09 +00005417void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5418 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005419 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005420}
5421
Douglas Katzman95354292015-06-23 20:42:09 +00005422void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5423 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005424 const Driver &D = getToolChain().getDriver();
5425
Eric Christophercc7ff502015-01-29 00:56:17 +00005426 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005427 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005428 case types::TY_LLVM_IR:
5429 case types::TY_LTO_IR:
5430 case types::TY_LLVM_BC:
5431 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005432 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005433 break;
5434 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005435 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005436 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005437 case types::TY_Nothing:
5438 CmdArgs.push_back("-fsyntax-only");
5439 break;
5440 default:
5441 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005442 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005443}
5444
Douglas Katzman95354292015-06-23 20:42:09 +00005445void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5446 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005447 // The types are (hopefully) good enough.
5448}
5449
Tony Linthicum76329bf2011-12-12 21:14:55 +00005450// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005451void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5452 ArgStringList &CmdArgs) const {}
5453void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5454 const InputInfo &Output,
5455 const InputInfoList &Inputs,
5456 const ArgList &Args,
5457 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005458 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005459
5460 const Driver &D = getToolChain().getDriver();
5461 ArgStringList CmdArgs;
5462
5463 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005464 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005465 CmdArgs.push_back(Args.MakeArgString(MarchString));
5466
5467 RenderExtraToolArgs(JA, CmdArgs);
5468
5469 if (Output.isFilename()) {
5470 CmdArgs.push_back("-o");
5471 CmdArgs.push_back(Output.getFilename());
5472 } else {
5473 assert(Output.isNothing() && "Unexpected output");
5474 CmdArgs.push_back("-fsyntax-only");
5475 }
5476
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005477 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005478 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005479
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005480 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005481
Tony Linthicum76329bf2011-12-12 21:14:55 +00005482 // Only pass -x if gcc will understand it; otherwise hope gcc
5483 // understands the suffix correctly. The main use case this would go
5484 // wrong in is for linker inputs if they happened to have an odd
5485 // suffix; really the only way to get this to happen is a command
5486 // like '-x foobar a.c' which will treat a.c like a linker input.
5487 //
5488 // FIXME: For the linker case specifically, can we safely convert
5489 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005490 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005491 // Don't try to pass LLVM or AST inputs to a generic gcc.
5492 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5493 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5494 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005495 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005496 else if (II.getType() == types::TY_AST)
5497 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005498 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005499 else if (II.getType() == types::TY_ModuleFile)
5500 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005501 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005502
5503 if (II.isFilename())
5504 CmdArgs.push_back(II.getFilename());
5505 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005506 // Don't render as input, we need gcc to do the translations.
5507 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005508 II.getInputArg().render(Args, CmdArgs);
5509 }
5510
5511 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005512 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005513 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005514}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005515
Douglas Katzman95354292015-06-23 20:42:09 +00005516void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5517 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005518 // The types are (hopefully) good enough.
5519}
5520
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005521static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005522 const toolchains::Hexagon_TC &ToolChain,
5523 const InputInfo &Output,
5524 const InputInfoList &Inputs,
5525 const ArgList &Args,
5526 ArgStringList &CmdArgs,
5527 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005528
Matthew Curtise689b052012-12-06 15:46:07 +00005529 const Driver &D = ToolChain.getDriver();
5530
Matthew Curtise689b052012-12-06 15:46:07 +00005531 //----------------------------------------------------------------------------
5532 //
5533 //----------------------------------------------------------------------------
5534 bool hasStaticArg = Args.hasArg(options::OPT_static);
5535 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005536 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005537 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5538 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5539 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005540 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005541 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005542
Matthew Curtise689b052012-12-06 15:46:07 +00005543 //----------------------------------------------------------------------------
5544 // Silence warnings for various options
5545 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005546
Matthew Curtise689b052012-12-06 15:46:07 +00005547 Args.ClaimAllArgs(options::OPT_g_Group);
5548 Args.ClaimAllArgs(options::OPT_emit_llvm);
5549 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5550 // handled somewhere else.
5551 Args.ClaimAllArgs(options::OPT_static_libgcc);
5552
5553 //----------------------------------------------------------------------------
5554 //
5555 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005556 for (const auto &Opt : ToolChain.ExtraOpts)
5557 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005558
Matthew Curtisf10a5952012-12-06 14:16:43 +00005559 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5560 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005561
Matthew Curtise689b052012-12-06 15:46:07 +00005562 if (buildingLib) {
5563 CmdArgs.push_back("-shared");
5564 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5565 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005566 }
5567
Matthew Curtise689b052012-12-06 15:46:07 +00005568 if (hasStaticArg)
5569 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005570
Matthew Curtise8f80a12012-12-06 17:49:03 +00005571 if (buildPIE && !buildingLib)
5572 CmdArgs.push_back("-pie");
5573
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005574 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005575 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5576 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005577 }
5578
Matthew Curtise689b052012-12-06 15:46:07 +00005579 //----------------------------------------------------------------------------
5580 //
5581 //----------------------------------------------------------------------------
5582 CmdArgs.push_back("-o");
5583 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005584
Matthew Curtise689b052012-12-06 15:46:07 +00005585 const std::string MarchSuffix = "/" + MarchString;
5586 const std::string G0Suffix = "/G0";
5587 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005588 const std::string RootDir =
5589 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005590 const std::string StartFilesDir =
5591 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005592
5593 //----------------------------------------------------------------------------
5594 // moslib
5595 //----------------------------------------------------------------------------
5596 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005597 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005598
Sean Silva14facf32015-06-09 01:57:17 +00005599 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5600 A->claim();
5601 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005602 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005603 }
Matthew Curtise689b052012-12-06 15:46:07 +00005604 if (oslibs.empty()) {
5605 oslibs.push_back("standalone");
5606 hasStandalone = true;
5607 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005608
Matthew Curtise689b052012-12-06 15:46:07 +00005609 //----------------------------------------------------------------------------
5610 // Start Files
5611 //----------------------------------------------------------------------------
5612 if (incStdLib && incStartFiles) {
5613
5614 if (!buildingLib) {
5615 if (hasStandalone) {
5616 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005617 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005618 }
5619 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5620 }
5621 std::string initObj = useShared ? "/initS.o" : "/init.o";
5622 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5623 }
5624
5625 //----------------------------------------------------------------------------
5626 // Library Search Paths
5627 //----------------------------------------------------------------------------
5628 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005629 for (const auto &LibPath : LibPaths)
5630 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005631
5632 //----------------------------------------------------------------------------
5633 //
5634 //----------------------------------------------------------------------------
5635 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5636 Args.AddAllArgs(CmdArgs, options::OPT_e);
5637 Args.AddAllArgs(CmdArgs, options::OPT_s);
5638 Args.AddAllArgs(CmdArgs, options::OPT_t);
5639 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5640
5641 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5642
5643 //----------------------------------------------------------------------------
5644 // Libraries
5645 //----------------------------------------------------------------------------
5646 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005647 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005648 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5649 CmdArgs.push_back("-lm");
5650 }
5651
5652 CmdArgs.push_back("--start-group");
5653
5654 if (!buildingLib) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005655 for (std::vector<std::string>::iterator i = oslibs.begin(),
5656 e = oslibs.end();
5657 i != e; ++i)
Matthew Curtise689b052012-12-06 15:46:07 +00005658 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5659 CmdArgs.push_back("-lc");
5660 }
5661 CmdArgs.push_back("-lgcc");
5662
5663 CmdArgs.push_back("--end-group");
5664 }
5665
5666 //----------------------------------------------------------------------------
5667 // End files
5668 //----------------------------------------------------------------------------
5669 if (incStdLib && incStartFiles) {
5670 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5671 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5672 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005673}
5674
Douglas Katzman95354292015-06-23 20:42:09 +00005675void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5676 const InputInfo &Output,
5677 const InputInfoList &Inputs,
5678 const ArgList &Args,
5679 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005680
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005681 const toolchains::Hexagon_TC &ToolChain =
5682 static_cast<const toolchains::Hexagon_TC &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005683
5684 ArgStringList CmdArgs;
5685 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5686 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005687
5688 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005689 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5690 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005691}
5692// Hexagon tools end.
5693
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005694const std::string arm::getARMArch(const ArgList &Args,
5695 const llvm::Triple &Triple) {
5696 std::string MArch;
Bernard Ogden31561762013-12-12 13:27:11 +00005697 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5698 // Otherwise, if we have -march= choose the base CPU for that arch.
5699 MArch = A->getValue();
5700 } else {
5701 // Otherwise, use the Arch from the triple.
5702 MArch = Triple.getArchName();
5703 }
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005704 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005705
5706 // Handle -march=native.
5707 if (MArch == "native") {
5708 std::string CPU = llvm::sys::getHostCPUName();
5709 if (CPU != "generic") {
5710 // Translate the native cpu into the architecture suffix for that CPU.
5711 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5712 // If there is no valid architecture suffix for this CPU we don't know how
5713 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005714 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005715 MArch = "";
5716 else
5717 MArch = std::string("arm") + Suffix;
5718 }
5719 }
5720
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005721 return MArch;
5722}
5723/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5724const char *arm::getARMCPUForMArch(const ArgList &Args,
5725 const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005726 std::string MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005727 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5728 // here means an -march=native that we can't handle, so instead return no CPU.
5729 if (MArch.empty())
5730 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005731
John Brawna95c1a82015-05-08 12:52:18 +00005732 // We need to return an empty string here on invalid MArch values as the
5733 // various places that call this function can't cope with a null result.
5734 const char *result = Triple.getARMCPUForArch(MArch);
5735 if (result)
5736 return result;
5737 else
5738 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005739}
5740
5741/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Gabor Ballabas208826c2015-06-04 17:56:32 +00005742std::string arm::getARMTargetCPU(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005743 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005744 // FIXME: Warn on inconsistent use of -mcpu and -march.
5745 // If we have -mcpu=, use that.
5746 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +00005747 std::string MCPU = StringRef(A->getValue()).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005748 // Handle -mcpu=native.
5749 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005750 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005751 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005752 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005753 }
5754
5755 return getARMCPUForMArch(Args, Triple);
5756}
5757
5758/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005759/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005760// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005761const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005762 if (CPU == "generic" &&
5763 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5764 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005765
Renato Golin3c007252015-05-28 15:05:53 +00005766 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5767 if (ArchKind == llvm::ARM::AK_INVALID)
5768 return "";
5769 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005770}
5771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005772void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005773 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005774 if (Args.hasArg(options::OPT_r))
5775 return;
5776
John Brawn94fd9632015-05-21 12:19:49 +00005777 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5778 // to generate BE-8 executables.
5779 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5780 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005781}
5782
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005783mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5784 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5785 .Case("mips1", NanLegacy)
5786 .Case("mips2", NanLegacy)
5787 .Case("mips3", NanLegacy)
5788 .Case("mips4", NanLegacy)
5789 .Case("mips5", NanLegacy)
5790 .Case("mips32", NanLegacy)
5791 .Case("mips32r2", NanLegacy)
5792 .Case("mips32r3", NanLegacy | Nan2008)
5793 .Case("mips32r5", NanLegacy | Nan2008)
5794 .Case("mips32r6", Nan2008)
5795 .Case("mips64", NanLegacy)
5796 .Case("mips64r2", NanLegacy)
5797 .Case("mips64r3", NanLegacy | Nan2008)
5798 .Case("mips64r5", NanLegacy | Nan2008)
5799 .Case("mips64r6", Nan2008)
5800 .Default(NanLegacy);
5801}
5802
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005803bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5804 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5805 return A && (A->getValue() == StringRef(Value));
5806}
5807
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005808bool mips::isUCLibc(const ArgList &Args) {
5809 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005810 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005811}
5812
Daniel Sanders2bf13662014-07-10 14:40:57 +00005813bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005814 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5815 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005816 .Case("2008", true)
5817 .Case("legacy", false)
5818 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005819
5820 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005821 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005822 .Cases("mips32r6", "mips64r6", true)
5823 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005824
5825 return false;
5826}
5827
Daniel Sanders379d44b2014-07-16 11:52:23 +00005828bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00005829 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00005830 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005831 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005832 return false;
5833
5834 if (ABIName != "32")
5835 return false;
5836
Toma Tabacu94ea6862015-06-16 13:54:13 +00005837 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
5838 // present.
5839 if (FloatABI == "soft")
5840 return false;
5841
Daniel Sanders379d44b2014-07-16 11:52:23 +00005842 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 .Cases("mips2", "mips3", "mips4", "mips5", true)
5844 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5845 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
5846 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00005847}
5848
Toma Tabacu94ea6862015-06-16 13:54:13 +00005849bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
5850 StringRef CPUName, StringRef ABIName,
5851 StringRef FloatABI) {
5852 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
5853
5854 // FPXX shouldn't be used if -msingle-float is present.
5855 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
5856 options::OPT_mdouble_float))
5857 if (A->getOption().matches(options::OPT_msingle_float))
5858 UseFPXX = false;
5859
5860 return UseFPXX;
5861}
5862
Tim Northover157d9112014-01-16 08:48:16 +00005863llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005864 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5865 // archs which Darwin doesn't use.
5866
5867 // The matching this routine does is fairly pointless, since it is neither the
5868 // complete architecture list, nor a reasonable subset. The problem is that
5869 // historically the driver driver accepts this and also ties its -march=
5870 // handling to the architecture name, so we need to be careful before removing
5871 // support for it.
5872
5873 // This code must be kept in sync with Clang's Darwin specific argument
5874 // translation.
5875
5876 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005877 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5878 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5879 .Case("ppc64", llvm::Triple::ppc64)
5880 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5881 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5882 llvm::Triple::x86)
5883 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
5884 // This is derived from the driver driver.
5885 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
5886 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
5887 .Cases("armv7s", "xscale", llvm::Triple::arm)
5888 .Case("arm64", llvm::Triple::aarch64)
5889 .Case("r600", llvm::Triple::r600)
5890 .Case("amdgcn", llvm::Triple::amdgcn)
5891 .Case("nvptx", llvm::Triple::nvptx)
5892 .Case("nvptx64", llvm::Triple::nvptx64)
5893 .Case("amdil", llvm::Triple::amdil)
5894 .Case("spir", llvm::Triple::spir)
5895 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005896}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005897
Tim Northover157d9112014-01-16 08:48:16 +00005898void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005899 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00005900 T.setArch(Arch);
5901
5902 if (Str == "x86_64h")
5903 T.setArchName(Str);
5904 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5905 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005906 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005907 }
5908}
5909
Bob Wilsondecc03e2012-11-23 06:14:39 +00005910const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005911 const InputInfo &Input) {
5912 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005913}
5914
Bob Wilsondecc03e2012-11-23 06:14:39 +00005915const char *Clang::getBaseInputStem(const ArgList &Args,
5916 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005917 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005918
Chris Lattner906bb902011-01-16 08:14:11 +00005919 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005920 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005921
5922 return Str;
5923}
5924
Bob Wilsondecc03e2012-11-23 06:14:39 +00005925const char *Clang::getDependencyFileName(const ArgList &Args,
5926 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005927 // FIXME: Think about this more.
5928 std::string Res;
5929
5930 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005931 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005932 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005933 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005934 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005935 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005936 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005937}
5938
Douglas Katzman95354292015-06-23 20:42:09 +00005939void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5940 const InputInfo &Output,
5941 const InputInfoList &Inputs,
5942 const ArgList &Args,
5943 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005944 const ToolChain &ToolChain = getToolChain();
5945 const Driver &D = ToolChain.getDriver();
5946 ArgStringList CmdArgs;
5947
5948 // Silence warning for "clang -g foo.o -o foo"
5949 Args.ClaimAllArgs(options::OPT_g_Group);
5950 // and "clang -emit-llvm foo.o -o foo"
5951 Args.ClaimAllArgs(options::OPT_emit_llvm);
5952 // and for "clang -w foo.o -o foo". Other warning options are already
5953 // handled somewhere else.
5954 Args.ClaimAllArgs(options::OPT_w);
5955
5956 if (!D.SysRoot.empty())
5957 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5958
5959 // CloudABI only supports static linkage.
5960 CmdArgs.push_back("-Bstatic");
5961 CmdArgs.push_back("--eh-frame-hdr");
5962 CmdArgs.push_back("--gc-sections");
5963
5964 if (Output.isFilename()) {
5965 CmdArgs.push_back("-o");
5966 CmdArgs.push_back(Output.getFilename());
5967 } else {
5968 assert(Output.isNothing() && "Invalid output.");
5969 }
5970
5971 if (!Args.hasArg(options::OPT_nostdlib) &&
5972 !Args.hasArg(options::OPT_nostartfiles)) {
5973 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5974 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5975 }
5976
5977 Args.AddAllArgs(CmdArgs, options::OPT_L);
5978 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5979 for (const auto &Path : Paths)
5980 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
5981 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5982 Args.AddAllArgs(CmdArgs, options::OPT_e);
5983 Args.AddAllArgs(CmdArgs, options::OPT_s);
5984 Args.AddAllArgs(CmdArgs, options::OPT_t);
5985 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5986 Args.AddAllArgs(CmdArgs, options::OPT_r);
5987
Alexey Samsonov907880e2015-06-19 19:57:46 +00005988 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005989 AddGoldPlugin(ToolChain, Args, CmdArgs);
5990
5991 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5992
5993 if (!Args.hasArg(options::OPT_nostdlib) &&
5994 !Args.hasArg(options::OPT_nodefaultlibs)) {
5995 if (D.CCCIsCXX())
5996 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5997 CmdArgs.push_back("-lc");
5998 CmdArgs.push_back("-lcompiler_rt");
5999 }
6000
6001 if (!Args.hasArg(options::OPT_nostdlib) &&
6002 !Args.hasArg(options::OPT_nostartfiles))
6003 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6004
6005 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
6006 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
6007}
6008
Douglas Katzman95354292015-06-23 20:42:09 +00006009void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6010 const InputInfo &Output,
6011 const InputInfoList &Inputs,
6012 const ArgList &Args,
6013 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006014 ArgStringList CmdArgs;
6015
6016 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6017 const InputInfo &Input = Inputs[0];
6018
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006019 // Determine the original source input.
6020 const Action *SourceAction = &JA;
6021 while (SourceAction->getKind() != Action::InputClass) {
6022 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6023 SourceAction = SourceAction->getInputs()[0];
6024 }
6025
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006026 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006027 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006028 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6029 // FIXME: at run-time detect assembler capabilities or rely on version
6030 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006031 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006032 const llvm::Triple &T(getToolChain().getTriple());
6033 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006034 CmdArgs.push_back("-Q");
6035 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006036
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006037 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006038 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006039 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006040 if (Args.hasArg(options::OPT_gstabs))
6041 CmdArgs.push_back("--gstabs");
6042 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006043 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006044 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006045
Daniel Dunbarbe220842009-03-20 16:06:39 +00006046 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006047 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006048
Daniel Dunbar6d484762010-07-22 01:47:22 +00006049 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006050 if (getToolChain().getArch() == llvm::Triple::x86 ||
6051 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006052 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6053 CmdArgs.push_back("-force_cpusubtype_ALL");
6054
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006055 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006056 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006057 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006058 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006059 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006060 CmdArgs.push_back("-static");
6061
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006062 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006063
6064 assert(Output.isFilename() && "Unexpected lipo output.");
6065 CmdArgs.push_back("-o");
6066 CmdArgs.push_back(Output.getFilename());
6067
Daniel Dunbarb440f562010-08-02 02:38:21 +00006068 assert(Input.isFilename() && "Invalid input.");
6069 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006070
6071 // asm_final spec is empty.
6072
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006073 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006074 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006075}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006076
Tim Northover157d9112014-01-16 08:48:16 +00006077void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006078
Tim Northover157d9112014-01-16 08:48:16 +00006079void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6080 ArgStringList &CmdArgs) const {
6081 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006082
Daniel Dunbarc1964212009-03-26 16:23:12 +00006083 // Derived from darwin_arch spec.
6084 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006085 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006086
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006087 // FIXME: Is this needed anymore?
6088 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006089 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006090}
6091
Douglas Katzman95354292015-06-23 20:42:09 +00006092bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006093 // We only need to generate a temp path for LTO if we aren't compiling object
6094 // files. When compiling source files, we run 'dsymutil' after linking. We
6095 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006096 for (const auto &Input : Inputs)
6097 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006098 return true;
6099
6100 return false;
6101}
6102
Douglas Katzman95354292015-06-23 20:42:09 +00006103void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6104 ArgStringList &CmdArgs,
6105 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006106 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006107 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006108
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006109 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006110 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6111 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006112 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6113 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006114 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006115 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006116 }
6117
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006118 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006119 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006120 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6121 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006122
Bob Wilson3d27dad2013-08-02 22:25:34 +00006123 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6124 CmdArgs.push_back("-export_dynamic");
6125
Bob Wilsonb111ec92015-03-02 19:01:14 +00006126 // If we are using App Extension restrictions, pass a flag to the linker
6127 // telling it that the compiled code has been audited.
6128 if (Args.hasFlag(options::OPT_fapplication_extension,
6129 options::OPT_fno_application_extension, false))
6130 CmdArgs.push_back("-application_extension");
6131
Bill Wendling313b6bf2012-11-16 23:03:00 +00006132 // If we are using LTO, then automatically create a temporary file path for
6133 // the linker to use, so that it's lifetime will extend past a possible
6134 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006135 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006136 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006137 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006138 C.addTempFile(TmpPath);
6139 CmdArgs.push_back("-object_path_lto");
6140 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006141 }
6142
Daniel Dunbarc1964212009-03-26 16:23:12 +00006143 // Derived from the "link" spec.
6144 Args.AddAllArgs(CmdArgs, options::OPT_static);
6145 if (!Args.hasArg(options::OPT_static))
6146 CmdArgs.push_back("-dynamic");
6147 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6148 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6149 // here. How do we wish to handle such things?
6150 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006151
Daniel Dunbarc1964212009-03-26 16:23:12 +00006152 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006153 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006154 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006155 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006156
6157 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6158 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6159 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6160
6161 Arg *A;
6162 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6163 (A = Args.getLastArg(options::OPT_current__version)) ||
6164 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006165 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6166 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006167
6168 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6169 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6170 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6171 } else {
6172 CmdArgs.push_back("-dylib");
6173
6174 Arg *A;
6175 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6176 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6177 (A = Args.getLastArg(options::OPT_client__name)) ||
6178 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6179 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6180 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006181 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6182 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006183
Daniel Dunbarc1964212009-03-26 16:23:12 +00006184 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6185 "-dylib_compatibility_version");
6186 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6187 "-dylib_current_version");
6188
Tim Northover157d9112014-01-16 08:48:16 +00006189 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006190
6191 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6192 "-dylib_install_name");
6193 }
6194
6195 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6196 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6197 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006198 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006199 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006200 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6201 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6202 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6203 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6204 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6205 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006206 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006207 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6208 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6209 Args.AddAllArgs(CmdArgs, options::OPT_init);
6210
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006211 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006212 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006213
Daniel Dunbarc1964212009-03-26 16:23:12 +00006214 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6215 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6216 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6217 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6218 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006219
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006220 if (const Arg *A =
6221 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6222 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006223 if (A->getOption().matches(options::OPT_fpie) ||
6224 A->getOption().matches(options::OPT_fPIE))
6225 CmdArgs.push_back("-pie");
6226 else
6227 CmdArgs.push_back("-no_pie");
6228 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006229
6230 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6231 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6232 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6233 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6234 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6235 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6236 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6237 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6238 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6239 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6240 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6241 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6242 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6243 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6244 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6245 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006246
Daniel Dunbar84384642011-05-02 21:03:47 +00006247 // Give --sysroot= preference, over the Apple specific behavior to also use
6248 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006249 StringRef sysroot = C.getSysRoot();
6250 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006251 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006252 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006253 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6254 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006255 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006256 }
6257
Daniel Dunbarc1964212009-03-26 16:23:12 +00006258 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6259 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6260 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6261 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6262 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006263 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006264 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6265 Args.AddAllArgs(CmdArgs, options::OPT_y);
6266 Args.AddLastArg(CmdArgs, options::OPT_w);
6267 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6268 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6269 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6270 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6271 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6272 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6273 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6274 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6275 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6276 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6277 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6278 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6279}
6280
Douglas Katzman95354292015-06-23 20:42:09 +00006281void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6282 const InputInfo &Output,
6283 const InputInfoList &Inputs,
6284 const ArgList &Args,
6285 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006286 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006287
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006288 // If the number of arguments surpasses the system limits, we will encode the
6289 // input files in a separate file, shortening the command line. To this end,
6290 // build a list of input file names that can be passed via a file with the
6291 // -filelist linker option.
6292 llvm::opt::ArgStringList InputFileList;
6293
Daniel Dunbarc1964212009-03-26 16:23:12 +00006294 // The logic here is derived from gcc's behavior; most of which
6295 // comes from specs (starting with link_command). Consult gcc for
6296 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006297 ArgStringList CmdArgs;
6298
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006299 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6300 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6301 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006302 for (const auto &Arg : Args)
6303 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006304 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006305 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006306 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006307 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006308 return;
6309 }
6310
Daniel Dunbarc1964212009-03-26 16:23:12 +00006311 // I'm not sure why this particular decomposition exists in gcc, but
6312 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006313 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006314
Daniel Dunbarc1964212009-03-26 16:23:12 +00006315 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6316 Args.AddAllArgs(CmdArgs, options::OPT_s);
6317 Args.AddAllArgs(CmdArgs, options::OPT_t);
6318 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6319 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006320 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006321 Args.AddAllArgs(CmdArgs, options::OPT_r);
6322
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006323 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6324 // members of static archive libraries which implement Objective-C classes or
6325 // categories.
6326 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6327 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006328
Daniel Dunbarc1964212009-03-26 16:23:12 +00006329 CmdArgs.push_back("-o");
6330 CmdArgs.push_back(Output.getFilename());
6331
Chad Rosier06fd3c62012-05-16 23:45:12 +00006332 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006333 !Args.hasArg(options::OPT_nostartfiles))
6334 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006335
Peter Collingbournec4122c12015-06-15 21:08:13 +00006336 // SafeStack requires its own runtime libraries
6337 // These libraries should be linked first, to make sure the
6338 // __safestack_init constructor executes before everything else
6339 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6340 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6341 "libclang_rt.safestack_osx.a",
6342 /*AlwaysLink=*/true);
6343 }
6344
Daniel Dunbarc1964212009-03-26 16:23:12 +00006345 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006346
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006347 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6348 options::OPT_fno_openmp, false)) {
6349 switch (getOpenMPRuntime(getToolChain(), Args)) {
6350 case OMPRT_OMP:
6351 CmdArgs.push_back("-lomp");
6352 break;
6353 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006354 CmdArgs.push_back("-lgomp");
6355 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006356 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006357 CmdArgs.push_back("-liomp5");
6358 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006359 case OMPRT_Unknown:
6360 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006361 break;
6362 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006363 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006364
Douglas Gregor9295df02012-05-15 21:00:27 +00006365 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006366 // Build the input file for -filelist (list of linker input files) in case we
6367 // need it later
6368 for (const auto &II : Inputs) {
6369 if (!II.isFilename()) {
6370 // This is a linker input argument.
6371 // We cannot mix input arguments and file names in a -filelist input, thus
6372 // we prematurely stop our list (remaining files shall be passed as
6373 // arguments).
6374 if (InputFileList.size() > 0)
6375 break;
6376
6377 continue;
6378 }
6379
6380 InputFileList.push_back(II.getFilename());
6381 }
6382
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006383 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006384 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006385 // We use arclite library for both ARC and subscripting support.
6386 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6387
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006388 CmdArgs.push_back("-framework");
6389 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006390 // Link libobj.
6391 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006392 }
John McCall31168b02011-06-15 23:02:42 +00006393
Daniel Dunbarc1964212009-03-26 16:23:12 +00006394 if (LinkingOutput) {
6395 CmdArgs.push_back("-arch_multiple");
6396 CmdArgs.push_back("-final_output");
6397 CmdArgs.push_back(LinkingOutput);
6398 }
6399
Daniel Dunbarc1964212009-03-26 16:23:12 +00006400 if (Args.hasArg(options::OPT_fnested_functions))
6401 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006402
Justin Bognerc7701242015-05-12 05:44:36 +00006403 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6404 // paths are different enough from other toolchains that this needs a fair
6405 // amount of refactoring done first.
6406 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6407
Daniel Dunbarc1964212009-03-26 16:23:12 +00006408 if (!Args.hasArg(options::OPT_nostdlib) &&
6409 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006410 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006411 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006412
Daniel Dunbarc1964212009-03-26 16:23:12 +00006413 // link_ssp spec is empty.
6414
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006415 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006416 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006417 }
6418
Chad Rosier06fd3c62012-05-16 23:45:12 +00006419 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006420 !Args.hasArg(options::OPT_nostartfiles)) {
6421 // endfile_spec is empty.
6422 }
6423
6424 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6425 Args.AddAllArgs(CmdArgs, options::OPT_F);
6426
Steven Wu3ffb61b2015-02-06 18:08:29 +00006427 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006428 for (const Arg *A : Args.filtered(options::OPT_iframework))
6429 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006430
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006431 if (!Args.hasArg(options::OPT_nostdlib) &&
6432 !Args.hasArg(options::OPT_nodefaultlibs)) {
6433 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6434 if (A->getValue() == StringRef("Accelerate")) {
6435 CmdArgs.push_back("-framework");
6436 CmdArgs.push_back("Accelerate");
6437 }
6438 }
6439 }
6440
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006441 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006442 std::unique_ptr<Command> Cmd =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006443 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006444 Cmd->setInputFileList(std::move(InputFileList));
6445 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006446}
6447
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006448void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006449 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006450 const InputInfoList &Inputs,
6451 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006452 const char *LinkingOutput) const {
6453 ArgStringList CmdArgs;
6454
6455 CmdArgs.push_back("-create");
6456 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006457
6458 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006459 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006460
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006461 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006462 assert(II.isFilename() && "Unexpected lipo input.");
6463 CmdArgs.push_back(II.getFilename());
6464 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006465
6466 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006467 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006468}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006469
Daniel Dunbar88299622010-06-04 18:28:36 +00006470void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006471 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006472 const InputInfoList &Inputs,
6473 const ArgList &Args,
6474 const char *LinkingOutput) const {
6475 ArgStringList CmdArgs;
6476
Daniel Dunbareb86b042011-05-09 17:23:16 +00006477 CmdArgs.push_back("-o");
6478 CmdArgs.push_back(Output.getFilename());
6479
Daniel Dunbar88299622010-06-04 18:28:36 +00006480 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6481 const InputInfo &Input = Inputs[0];
6482 assert(Input.isFilename() && "Unexpected dsymutil input.");
6483 CmdArgs.push_back(Input.getFilename());
6484
Daniel Dunbar88299622010-06-04 18:28:36 +00006485 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006486 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006487 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006488}
6489
Eric Christopher551ef452011-08-23 17:56:55 +00006490void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006491 const InputInfo &Output,
6492 const InputInfoList &Inputs,
6493 const ArgList &Args,
6494 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006495 ArgStringList CmdArgs;
6496 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006497 CmdArgs.push_back("--debug-info");
6498 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006499 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006500
6501 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6502 const InputInfo &Input = Inputs[0];
6503 assert(Input.isFilename() && "Unexpected verify input");
6504
6505 // Grabbing the output of the earlier dsymutil run.
6506 CmdArgs.push_back(Input.getFilename());
6507
6508 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006509 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006510 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006511}
6512
Douglas Katzman95354292015-06-23 20:42:09 +00006513void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006514 const InputInfo &Output,
6515 const InputInfoList &Inputs,
6516 const ArgList &Args,
6517 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006518 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006519 ArgStringList CmdArgs;
6520
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006521 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006522
6523 CmdArgs.push_back("-o");
6524 CmdArgs.push_back(Output.getFilename());
6525
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006526 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006527 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006528
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006529 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006530 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006531}
6532
Douglas Katzman95354292015-06-23 20:42:09 +00006533void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6534 const InputInfo &Output,
6535 const InputInfoList &Inputs,
6536 const ArgList &Args,
6537 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006538 // FIXME: Find a real GCC, don't hard-code versions here
6539 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6540 const llvm::Triple &T = getToolChain().getTriple();
6541 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006542 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006543 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006544 case llvm::Triple::x86:
6545 GCCLibPath +=
6546 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6547 break;
6548 case llvm::Triple::x86_64:
6549 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6550 GCCLibPath += "/4.5.2/amd64/";
6551 LibPath += "amd64/";
6552 break;
6553 default:
6554 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006555 }
6556
6557 ArgStringList CmdArgs;
6558
David Chisnall272a0712012-02-29 15:06:12 +00006559 // Demangle C++ names in errors
6560 CmdArgs.push_back("-C");
6561
David Chisnallf571cde2012-02-15 13:39:01 +00006562 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6563 (!Args.hasArg(options::OPT_shared))) {
6564 CmdArgs.push_back("-e");
6565 CmdArgs.push_back("_start");
6566 }
6567
6568 if (Args.hasArg(options::OPT_static)) {
6569 CmdArgs.push_back("-Bstatic");
6570 CmdArgs.push_back("-dn");
6571 } else {
6572 CmdArgs.push_back("-Bdynamic");
6573 if (Args.hasArg(options::OPT_shared)) {
6574 CmdArgs.push_back("-shared");
6575 } else {
6576 CmdArgs.push_back("--dynamic-linker");
6577 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6578 }
6579 }
6580
6581 if (Output.isFilename()) {
6582 CmdArgs.push_back("-o");
6583 CmdArgs.push_back(Output.getFilename());
6584 } else {
6585 assert(Output.isNothing() && "Invalid output.");
6586 }
6587
6588 if (!Args.hasArg(options::OPT_nostdlib) &&
6589 !Args.hasArg(options::OPT_nostartfiles)) {
6590 if (!Args.hasArg(options::OPT_shared)) {
6591 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6592 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006593 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006594 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6595 } else {
6596 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006597 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6598 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006599 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006600 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006601 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006602 }
6603
6604 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6605
6606 Args.AddAllArgs(CmdArgs, options::OPT_L);
6607 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6608 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006609 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006610
6611 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6612
6613 if (!Args.hasArg(options::OPT_nostdlib) &&
6614 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006615 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006616 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006617 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006618 if (!Args.hasArg(options::OPT_shared)) {
6619 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006620 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006621 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006622 }
David Chisnallf571cde2012-02-15 13:39:01 +00006623 }
6624
6625 if (!Args.hasArg(options::OPT_nostdlib) &&
6626 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006627 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006628 }
David Chisnall96de9932012-02-16 16:00:47 +00006629 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006630
Alexey Samsonov7811d192014-02-20 13:57:37 +00006631 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006632
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006633 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006634 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006635}
6636
Douglas Katzman95354292015-06-23 20:42:09 +00006637void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6638 const InputInfo &Output,
6639 const InputInfoList &Inputs,
6640 const ArgList &Args,
6641 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006642 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006643 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006644 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006645
Rafael Espindolacc126272014-02-28 01:55:21 +00006646 switch (getToolChain().getArch()) {
6647 case llvm::Triple::x86:
6648 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6649 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006650 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006651 break;
6652
6653 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006654 CmdArgs.push_back("-mppc");
6655 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006656 break;
6657
6658 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006659 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006660 CmdArgs.push_back("-32");
6661 NeedsKPIC = true;
6662 break;
6663
6664 case llvm::Triple::sparcv9:
6665 CmdArgs.push_back("-64");
6666 CmdArgs.push_back("-Av9a");
6667 NeedsKPIC = true;
6668 break;
6669
6670 case llvm::Triple::mips64:
6671 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006672 StringRef CPUName;
6673 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006674 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006675
6676 CmdArgs.push_back("-mabi");
6677 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6678
6679 if (getToolChain().getArch() == llvm::Triple::mips64)
6680 CmdArgs.push_back("-EB");
6681 else
6682 CmdArgs.push_back("-EL");
6683
Rafael Espindolacc126272014-02-28 01:55:21 +00006684 NeedsKPIC = true;
6685 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006686 }
6687
Rafael Espindolacc126272014-02-28 01:55:21 +00006688 default:
6689 break;
6690 }
6691
6692 if (NeedsKPIC)
6693 addAssemblerKPIC(Args, CmdArgs);
6694
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006695 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006696
6697 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006698 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006699
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006700 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006701 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006702
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006703 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006704 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006705}
6706
Douglas Katzman95354292015-06-23 20:42:09 +00006707void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6708 const InputInfo &Output,
6709 const InputInfoList &Inputs,
6710 const ArgList &Args,
6711 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006712 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006713 ArgStringList CmdArgs;
6714
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006715 // Silence warning for "clang -g foo.o -o foo"
6716 Args.ClaimAllArgs(options::OPT_g_Group);
6717 // and "clang -emit-llvm foo.o -o foo"
6718 Args.ClaimAllArgs(options::OPT_emit_llvm);
6719 // and for "clang -w foo.o -o foo". Other warning options are already
6720 // handled somewhere else.
6721 Args.ClaimAllArgs(options::OPT_w);
6722
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006723 if (getToolChain().getArch() == llvm::Triple::mips64)
6724 CmdArgs.push_back("-EB");
6725 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6726 CmdArgs.push_back("-EL");
6727
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006728 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006729 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006730 CmdArgs.push_back("-e");
6731 CmdArgs.push_back("__start");
6732 }
6733
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006734 if (Args.hasArg(options::OPT_static)) {
6735 CmdArgs.push_back("-Bstatic");
6736 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006737 if (Args.hasArg(options::OPT_rdynamic))
6738 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006739 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006740 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006741 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006742 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006743 } else {
6744 CmdArgs.push_back("-dynamic-linker");
6745 CmdArgs.push_back("/usr/libexec/ld.so");
6746 }
6747 }
6748
Rafael Espindola044f7832013-06-05 04:28:55 +00006749 if (Args.hasArg(options::OPT_nopie))
6750 CmdArgs.push_back("-nopie");
6751
Daniel Dunbarb440f562010-08-02 02:38:21 +00006752 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006753 CmdArgs.push_back("-o");
6754 CmdArgs.push_back(Output.getFilename());
6755 } else {
6756 assert(Output.isNothing() && "Invalid output.");
6757 }
6758
6759 if (!Args.hasArg(options::OPT_nostdlib) &&
6760 !Args.hasArg(options::OPT_nostartfiles)) {
6761 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006762 if (Args.hasArg(options::OPT_pg))
6763 CmdArgs.push_back(
6764 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00006765 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006766 CmdArgs.push_back(
6767 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6768 CmdArgs.push_back(
6769 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006770 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006771 CmdArgs.push_back(
6772 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006773 }
6774 }
6775
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006776 std::string Triple = getToolChain().getTripleString();
6777 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006778 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006779 CmdArgs.push_back(
6780 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006781
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006782 Args.AddAllArgs(CmdArgs, options::OPT_L);
6783 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6784 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006785 Args.AddAllArgs(CmdArgs, options::OPT_s);
6786 Args.AddAllArgs(CmdArgs, options::OPT_t);
6787 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6788 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006789
Daniel Dunbar54423b22010-09-17 00:24:54 +00006790 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006791
6792 if (!Args.hasArg(options::OPT_nostdlib) &&
6793 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006794 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006795 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006796 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006797 CmdArgs.push_back("-lm_p");
6798 else
6799 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006800 }
6801
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006802 // FIXME: For some reason GCC passes -lgcc before adding
6803 // the default system libraries. Just mimic this for now.
6804 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006805
Eric Christopher17674ec2012-09-13 06:32:34 +00006806 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006807 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
6808 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00006809 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006810 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00006811 }
6812
Chandler Carruth45661652011-12-17 22:32:42 +00006813 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006814 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006815 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00006816 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006817 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006818 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006819
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006820 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006821 }
6822
6823 if (!Args.hasArg(options::OPT_nostdlib) &&
6824 !Args.hasArg(options::OPT_nostartfiles)) {
6825 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006826 CmdArgs.push_back(
6827 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006828 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006829 CmdArgs.push_back(
6830 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006831 }
6832
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006833 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006834 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006835}
Ed Schoutene33194b2009-04-02 19:13:12 +00006836
Douglas Katzman95354292015-06-23 20:42:09 +00006837void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6838 const InputInfo &Output,
6839 const InputInfoList &Inputs,
6840 const ArgList &Args,
6841 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006842 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006843 ArgStringList CmdArgs;
6844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006845 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00006846
6847 CmdArgs.push_back("-o");
6848 CmdArgs.push_back(Output.getFilename());
6849
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006850 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006851 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006852
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006853 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006855}
6856
Douglas Katzman95354292015-06-23 20:42:09 +00006857void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6858 const InputInfo &Output,
6859 const InputInfoList &Inputs,
6860 const ArgList &Args,
6861 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00006862 const Driver &D = getToolChain().getDriver();
6863 ArgStringList CmdArgs;
6864
6865 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6866 (!Args.hasArg(options::OPT_shared))) {
6867 CmdArgs.push_back("-e");
6868 CmdArgs.push_back("__start");
6869 }
6870
6871 if (Args.hasArg(options::OPT_static)) {
6872 CmdArgs.push_back("-Bstatic");
6873 } else {
6874 if (Args.hasArg(options::OPT_rdynamic))
6875 CmdArgs.push_back("-export-dynamic");
6876 CmdArgs.push_back("--eh-frame-hdr");
6877 CmdArgs.push_back("-Bdynamic");
6878 if (Args.hasArg(options::OPT_shared)) {
6879 CmdArgs.push_back("-shared");
6880 } else {
6881 CmdArgs.push_back("-dynamic-linker");
6882 CmdArgs.push_back("/usr/libexec/ld.so");
6883 }
6884 }
6885
6886 if (Output.isFilename()) {
6887 CmdArgs.push_back("-o");
6888 CmdArgs.push_back(Output.getFilename());
6889 } else {
6890 assert(Output.isNothing() && "Invalid output.");
6891 }
6892
6893 if (!Args.hasArg(options::OPT_nostdlib) &&
6894 !Args.hasArg(options::OPT_nostartfiles)) {
6895 if (!Args.hasArg(options::OPT_shared)) {
6896 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006897 CmdArgs.push_back(
6898 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006899 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006900 CmdArgs.push_back(
6901 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6902 CmdArgs.push_back(
6903 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006904 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006905 CmdArgs.push_back(
6906 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006907 }
6908 }
6909
6910 Args.AddAllArgs(CmdArgs, options::OPT_L);
6911 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6912 Args.AddAllArgs(CmdArgs, options::OPT_e);
6913
6914 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6915
6916 if (!Args.hasArg(options::OPT_nostdlib) &&
6917 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006918 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006919 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6920 if (Args.hasArg(options::OPT_pg))
6921 CmdArgs.push_back("-lm_p");
6922 else
6923 CmdArgs.push_back("-lm");
6924 }
6925
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006926 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006927 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006928 CmdArgs.push_back("-lpthread_p");
6929 else
6930 CmdArgs.push_back("-lpthread");
6931 }
6932
Eli Friedman9fa28852012-08-08 23:57:20 +00006933 if (!Args.hasArg(options::OPT_shared)) {
6934 if (Args.hasArg(options::OPT_pg))
6935 CmdArgs.push_back("-lc_p");
6936 else
6937 CmdArgs.push_back("-lc");
6938 }
6939
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006940 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006941 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006942 case llvm::Triple::arm:
6943 MyArch = "arm";
6944 break;
6945 case llvm::Triple::x86:
6946 MyArch = "i386";
6947 break;
6948 case llvm::Triple::x86_64:
6949 MyArch = "amd64";
6950 break;
6951 default:
6952 llvm_unreachable("Unsupported architecture");
6953 }
6954 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006955 }
6956
6957 if (!Args.hasArg(options::OPT_nostdlib) &&
6958 !Args.hasArg(options::OPT_nostartfiles)) {
6959 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006960 CmdArgs.push_back(
6961 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006962 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006963 CmdArgs.push_back(
6964 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006965 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006966
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006967 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006968 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006969}
6970
Douglas Katzman95354292015-06-23 20:42:09 +00006971void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6972 const InputInfo &Output,
6973 const InputInfoList &Inputs,
6974 const ArgList &Args,
6975 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006976 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006977 ArgStringList CmdArgs;
6978
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006979 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6980 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006981 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006982 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006983 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006984 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006985 else if (getToolChain().getArch() == llvm::Triple::mips ||
6986 getToolChain().getArch() == llvm::Triple::mipsel ||
6987 getToolChain().getArch() == llvm::Triple::mips64 ||
6988 getToolChain().getArch() == llvm::Triple::mips64el) {
6989 StringRef CPUName;
6990 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006991 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006992
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006993 CmdArgs.push_back("-march");
6994 CmdArgs.push_back(CPUName.data());
6995
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006996 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006997 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006998
6999 if (getToolChain().getArch() == llvm::Triple::mips ||
7000 getToolChain().getArch() == llvm::Triple::mips64)
7001 CmdArgs.push_back("-EB");
7002 else
7003 CmdArgs.push_back("-EL");
7004
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007005 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007006 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007007 getToolChain().getArch() == llvm::Triple::armeb ||
7008 getToolChain().getArch() == llvm::Triple::thumb ||
7009 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007010 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007011 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007012 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7013
7014 if (FloatABI == "hard") {
7015 CmdArgs.push_back("-mfpu=vfp");
7016 } else {
7017 CmdArgs.push_back("-mfpu=softvfp");
7018 }
7019
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007020 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007021 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007022 case llvm::Triple::GNUEABI:
7023 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007024 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007025 break;
7026
7027 default:
7028 CmdArgs.push_back("-matpcs");
7029 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007030 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007031 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007032 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007033 if (getToolChain().getArch() == llvm::Triple::sparc)
7034 CmdArgs.push_back("-Av8plusa");
7035 else
7036 CmdArgs.push_back("-Av9a");
7037
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007038 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007039 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007040
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007041 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007042
7043 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007044 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007045
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007046 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007047 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007048
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007049 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007050 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007051}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007052
Douglas Katzman95354292015-06-23 20:42:09 +00007053void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7054 const InputInfo &Output,
7055 const InputInfoList &Inputs,
7056 const ArgList &Args,
7057 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007058 const toolchains::FreeBSD &ToolChain =
7059 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007060 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007061 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007062 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007063 !Args.hasArg(options::OPT_shared) &&
7064 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007065 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007066
7067 // Silence warning for "clang -g foo.o -o foo"
7068 Args.ClaimAllArgs(options::OPT_g_Group);
7069 // and "clang -emit-llvm foo.o -o foo"
7070 Args.ClaimAllArgs(options::OPT_emit_llvm);
7071 // and for "clang -w foo.o -o foo". Other warning options are already
7072 // handled somewhere else.
7073 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007074
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007075 if (!D.SysRoot.empty())
7076 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7077
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007078 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007079 CmdArgs.push_back("-pie");
7080
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007081 if (Args.hasArg(options::OPT_static)) {
7082 CmdArgs.push_back("-Bstatic");
7083 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007084 if (Args.hasArg(options::OPT_rdynamic))
7085 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007086 CmdArgs.push_back("--eh-frame-hdr");
7087 if (Args.hasArg(options::OPT_shared)) {
7088 CmdArgs.push_back("-Bshareable");
7089 } else {
7090 CmdArgs.push_back("-dynamic-linker");
7091 CmdArgs.push_back("/libexec/ld-elf.so.1");
7092 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007093 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007094 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7095 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7096 CmdArgs.push_back("--hash-style=both");
7097 }
7098 }
7099 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007100 }
7101
7102 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7103 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007104 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007105 CmdArgs.push_back("-m");
7106 CmdArgs.push_back("elf_i386_fbsd");
7107 }
7108
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007109 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007110 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007111 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007112 }
7113
Daniel Dunbarb440f562010-08-02 02:38:21 +00007114 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007115 CmdArgs.push_back("-o");
7116 CmdArgs.push_back(Output.getFilename());
7117 } else {
7118 assert(Output.isNothing() && "Invalid output.");
7119 }
7120
7121 if (!Args.hasArg(options::OPT_nostdlib) &&
7122 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007123 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007124 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007125 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007126 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007127 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007128 crt1 = "Scrt1.o";
7129 else
7130 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007131 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007132 if (crt1)
7133 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7134
7135 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7136
Craig Topper92fc2df2014-05-17 16:56:41 +00007137 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007138 if (Args.hasArg(options::OPT_static))
7139 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007140 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007141 crtbegin = "crtbeginS.o";
7142 else
7143 crtbegin = "crtbegin.o";
7144
7145 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007146 }
7147
7148 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007149 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007150 for (const auto &Path : Paths)
7151 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007152 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7153 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007154 Args.AddAllArgs(CmdArgs, options::OPT_s);
7155 Args.AddAllArgs(CmdArgs, options::OPT_t);
7156 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7157 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007158
Alexey Samsonov907880e2015-06-19 19:57:46 +00007159 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007160 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007161
Alexey Samsonov52550342014-09-15 19:58:40 +00007162 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007163 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007164
7165 if (!Args.hasArg(options::OPT_nostdlib) &&
7166 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007167 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007168 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007169 if (Args.hasArg(options::OPT_pg))
7170 CmdArgs.push_back("-lm_p");
7171 else
7172 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007173 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007174 if (NeedsSanitizerDeps)
7175 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007176 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7177 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007178 if (Args.hasArg(options::OPT_pg))
7179 CmdArgs.push_back("-lgcc_p");
7180 else
7181 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007182 if (Args.hasArg(options::OPT_static)) {
7183 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007184 } else if (Args.hasArg(options::OPT_pg)) {
7185 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007186 } else {
7187 CmdArgs.push_back("--as-needed");
7188 CmdArgs.push_back("-lgcc_s");
7189 CmdArgs.push_back("--no-as-needed");
7190 }
7191
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007192 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007193 if (Args.hasArg(options::OPT_pg))
7194 CmdArgs.push_back("-lpthread_p");
7195 else
7196 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007197 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007198
Roman Divacky66f22762011-02-10 16:59:40 +00007199 if (Args.hasArg(options::OPT_pg)) {
7200 if (Args.hasArg(options::OPT_shared))
7201 CmdArgs.push_back("-lc");
7202 else
7203 CmdArgs.push_back("-lc_p");
7204 CmdArgs.push_back("-lgcc_p");
7205 } else {
7206 CmdArgs.push_back("-lc");
7207 CmdArgs.push_back("-lgcc");
7208 }
7209
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007210 if (Args.hasArg(options::OPT_static)) {
7211 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007212 } else if (Args.hasArg(options::OPT_pg)) {
7213 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007214 } else {
7215 CmdArgs.push_back("--as-needed");
7216 CmdArgs.push_back("-lgcc_s");
7217 CmdArgs.push_back("--no-as-needed");
7218 }
7219 }
7220
7221 if (!Args.hasArg(options::OPT_nostdlib) &&
7222 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007223 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007224 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007225 else
7226 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007227 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007228 }
7229
Alexey Samsonov7811d192014-02-20 13:57:37 +00007230 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007231
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007232 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007233 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007234}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007235
Douglas Katzman95354292015-06-23 20:42:09 +00007236void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007237 const InputInfo &Output,
7238 const InputInfoList &Inputs,
7239 const ArgList &Args,
7240 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007241 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007242 ArgStringList CmdArgs;
7243
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007244 // GNU as needs different flags for creating the correct output format
7245 // on architectures with different ABIs or optional feature sets.
7246 switch (getToolChain().getArch()) {
7247 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007248 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007249 break;
7250 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007251 case llvm::Triple::armeb:
7252 case llvm::Triple::thumb:
7253 case llvm::Triple::thumbeb: {
Gabor Ballabas208826c2015-06-04 17:56:32 +00007254 std::string MArch = arm::getARMTargetCPU(Args, getToolChain().getTriple());
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007255 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007256 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007257 }
7258
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007259 case llvm::Triple::mips:
7260 case llvm::Triple::mipsel:
7261 case llvm::Triple::mips64:
7262 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007263 StringRef CPUName;
7264 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007265 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007266
7267 CmdArgs.push_back("-march");
7268 CmdArgs.push_back(CPUName.data());
7269
7270 CmdArgs.push_back("-mabi");
7271 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7272
7273 if (getToolChain().getArch() == llvm::Triple::mips ||
7274 getToolChain().getArch() == llvm::Triple::mips64)
7275 CmdArgs.push_back("-EB");
7276 else
7277 CmdArgs.push_back("-EL");
7278
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007279 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007280 break;
7281 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007282
7283 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007284 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007285 CmdArgs.push_back("-32");
7286 addAssemblerKPIC(Args, CmdArgs);
7287 break;
7288
7289 case llvm::Triple::sparcv9:
7290 CmdArgs.push_back("-64");
7291 CmdArgs.push_back("-Av9");
7292 addAssemblerKPIC(Args, CmdArgs);
7293 break;
7294
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007295 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007296 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007297 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007299 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007300
7301 CmdArgs.push_back("-o");
7302 CmdArgs.push_back(Output.getFilename());
7303
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007304 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007305 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007306
David Chisnallddbd68f2011-09-27 22:03:18 +00007307 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007308 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007309}
7310
Douglas Katzman95354292015-06-23 20:42:09 +00007311void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7312 const InputInfo &Output,
7313 const InputInfoList &Inputs,
7314 const ArgList &Args,
7315 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007316 const Driver &D = getToolChain().getDriver();
7317 ArgStringList CmdArgs;
7318
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007319 if (!D.SysRoot.empty())
7320 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7321
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007322 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007323 if (Args.hasArg(options::OPT_static)) {
7324 CmdArgs.push_back("-Bstatic");
7325 } else {
7326 if (Args.hasArg(options::OPT_rdynamic))
7327 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007328 if (Args.hasArg(options::OPT_shared)) {
7329 CmdArgs.push_back("-Bshareable");
7330 } else {
7331 CmdArgs.push_back("-dynamic-linker");
7332 CmdArgs.push_back("/libexec/ld.elf_so");
7333 }
7334 }
7335
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007336 // Many NetBSD architectures support more than one ABI.
7337 // Determine the correct emulation for ld.
7338 switch (getToolChain().getArch()) {
7339 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007340 CmdArgs.push_back("-m");
7341 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007342 break;
7343 case llvm::Triple::arm:
7344 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007345 CmdArgs.push_back("-m");
7346 switch (getToolChain().getTriple().getEnvironment()) {
7347 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007348 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007349 CmdArgs.push_back("armelf_nbsd_eabi");
7350 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007351 case llvm::Triple::EABIHF:
7352 case llvm::Triple::GNUEABIHF:
7353 CmdArgs.push_back("armelf_nbsd_eabihf");
7354 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007355 default:
7356 CmdArgs.push_back("armelf_nbsd");
7357 break;
7358 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007359 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007360 case llvm::Triple::armeb:
7361 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007362 arm::appendEBLinkFlags(
7363 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007364 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007365 CmdArgs.push_back("-m");
7366 switch (getToolChain().getTriple().getEnvironment()) {
7367 case llvm::Triple::EABI:
7368 case llvm::Triple::GNUEABI:
7369 CmdArgs.push_back("armelfb_nbsd_eabi");
7370 break;
7371 case llvm::Triple::EABIHF:
7372 case llvm::Triple::GNUEABIHF:
7373 CmdArgs.push_back("armelfb_nbsd_eabihf");
7374 break;
7375 default:
7376 CmdArgs.push_back("armelfb_nbsd");
7377 break;
7378 }
7379 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007380 case llvm::Triple::mips64:
7381 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007382 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007383 CmdArgs.push_back("-m");
7384 if (getToolChain().getArch() == llvm::Triple::mips64)
7385 CmdArgs.push_back("elf32btsmip");
7386 else
7387 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007388 } else if (mips::hasMipsAbiArg(Args, "64")) {
7389 CmdArgs.push_back("-m");
7390 if (getToolChain().getArch() == llvm::Triple::mips64)
7391 CmdArgs.push_back("elf64btsmip");
7392 else
7393 CmdArgs.push_back("elf64ltsmip");
7394 }
7395 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007396 case llvm::Triple::ppc:
7397 CmdArgs.push_back("-m");
7398 CmdArgs.push_back("elf32ppc_nbsd");
7399 break;
7400
7401 case llvm::Triple::ppc64:
7402 case llvm::Triple::ppc64le:
7403 CmdArgs.push_back("-m");
7404 CmdArgs.push_back("elf64ppc");
7405 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007406
7407 case llvm::Triple::sparc:
7408 CmdArgs.push_back("-m");
7409 CmdArgs.push_back("elf32_sparc");
7410 break;
7411
7412 case llvm::Triple::sparcv9:
7413 CmdArgs.push_back("-m");
7414 CmdArgs.push_back("elf64_sparc");
7415 break;
7416
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007417 default:
7418 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007419 }
7420
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007421 if (Output.isFilename()) {
7422 CmdArgs.push_back("-o");
7423 CmdArgs.push_back(Output.getFilename());
7424 } else {
7425 assert(Output.isNothing() && "Invalid output.");
7426 }
7427
7428 if (!Args.hasArg(options::OPT_nostdlib) &&
7429 !Args.hasArg(options::OPT_nostartfiles)) {
7430 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007431 CmdArgs.push_back(
7432 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7433 CmdArgs.push_back(
7434 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7435 CmdArgs.push_back(
7436 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007437 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007438 CmdArgs.push_back(
7439 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7440 CmdArgs.push_back(
7441 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007442 }
7443 }
7444
7445 Args.AddAllArgs(CmdArgs, options::OPT_L);
7446 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7447 Args.AddAllArgs(CmdArgs, options::OPT_e);
7448 Args.AddAllArgs(CmdArgs, options::OPT_s);
7449 Args.AddAllArgs(CmdArgs, options::OPT_t);
7450 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7451 Args.AddAllArgs(CmdArgs, options::OPT_r);
7452
7453 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7454
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007455 unsigned Major, Minor, Micro;
7456 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7457 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007458 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007459 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007460 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007461 case llvm::Triple::arm:
7462 case llvm::Triple::armeb:
7463 case llvm::Triple::thumb:
7464 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007465 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007466 case llvm::Triple::ppc64:
7467 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007468 case llvm::Triple::x86:
7469 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007470 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007471 break;
7472 default:
7473 break;
7474 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007475 }
7476
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007477 if (!Args.hasArg(options::OPT_nostdlib) &&
7478 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007479 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007480 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7481 CmdArgs.push_back("-lm");
7482 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007483 if (Args.hasArg(options::OPT_pthread))
7484 CmdArgs.push_back("-lpthread");
7485 CmdArgs.push_back("-lc");
7486
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007487 if (useLibgcc) {
7488 if (Args.hasArg(options::OPT_static)) {
7489 // libgcc_eh depends on libc, so resolve as much as possible,
7490 // pull in any new requirements from libc and then get the rest
7491 // of libgcc.
7492 CmdArgs.push_back("-lgcc_eh");
7493 CmdArgs.push_back("-lc");
7494 CmdArgs.push_back("-lgcc");
7495 } else {
7496 CmdArgs.push_back("-lgcc");
7497 CmdArgs.push_back("--as-needed");
7498 CmdArgs.push_back("-lgcc_s");
7499 CmdArgs.push_back("--no-as-needed");
7500 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007501 }
7502 }
7503
7504 if (!Args.hasArg(options::OPT_nostdlib) &&
7505 !Args.hasArg(options::OPT_nostartfiles)) {
7506 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007507 CmdArgs.push_back(
7508 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007509 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007510 CmdArgs.push_back(
7511 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7512 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007513 }
7514
Alexey Samsonov7811d192014-02-20 13:57:37 +00007515 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007516
Logan Chieneb9162f2014-06-26 14:23:45 +00007517 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007518 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007519}
7520
Douglas Katzman95354292015-06-23 20:42:09 +00007521void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7522 const InputInfo &Output,
7523 const InputInfoList &Inputs,
7524 const ArgList &Args,
7525 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007526 claimNoWarnArgs(Args);
7527
Rafael Espindola92b00932010-08-10 00:25:48 +00007528 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007529 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007530
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007531 switch (getToolChain().getArch()) {
7532 default:
7533 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007534 // Add --32/--64 to make sure we get the format we want.
7535 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007536 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007537 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007538 break;
7539 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007540 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7541 CmdArgs.push_back("--x32");
7542 else
7543 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007544 break;
7545 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007546 CmdArgs.push_back("-a32");
7547 CmdArgs.push_back("-mppc");
7548 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007549 break;
7550 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007551 CmdArgs.push_back("-a64");
7552 CmdArgs.push_back("-mppc64");
7553 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007554 break;
7555 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007556 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007557 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007558 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007559 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007560 break;
7561 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007562 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007563 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007564 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007565 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007566 break;
7567 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007568 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007569 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007570 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007571 break;
7572 case llvm::Triple::arm:
7573 case llvm::Triple::armeb:
7574 case llvm::Triple::thumb:
7575 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007576 const llvm::Triple &Triple = getToolChain().getTriple();
7577 switch (Triple.getSubArch()) {
7578 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007579 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007580 break;
7581 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007582 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007583 break;
7584 default:
7585 break;
7586 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007587
Tim Northover9c7e0352013-12-12 11:55:52 +00007588 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007589 getToolChain().getDriver(), Args,
7590 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007591 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007592
7593 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007594
7595 // FIXME: remove krait check when GNU tools support krait cpu
7596 // for now replace it with -march=armv7-a to avoid a lower
7597 // march from being picked in the absence of a cpu flag.
7598 Arg *A;
7599 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007600 StringRef(A->getValue()).lower() == "krait")
7601 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007602 else
7603 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007604 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007605 break;
7606 }
7607 case llvm::Triple::mips:
7608 case llvm::Triple::mipsel:
7609 case llvm::Triple::mips64:
7610 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007611 StringRef CPUName;
7612 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007613 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007614 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007615
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007616 CmdArgs.push_back("-march");
7617 CmdArgs.push_back(CPUName.data());
7618
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007619 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007620 CmdArgs.push_back(ABIName.data());
7621
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007622 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7623 // or -mshared (not implemented) is in effect.
7624 bool IsPicOrPie = false;
7625 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7626 options::OPT_fpic, options::OPT_fno_pic,
7627 options::OPT_fPIE, options::OPT_fno_PIE,
7628 options::OPT_fpie, options::OPT_fno_pie)) {
7629 if (A->getOption().matches(options::OPT_fPIC) ||
7630 A->getOption().matches(options::OPT_fpic) ||
7631 A->getOption().matches(options::OPT_fPIE) ||
7632 A->getOption().matches(options::OPT_fpie))
7633 IsPicOrPie = true;
7634 }
7635 if (!IsPicOrPie)
7636 CmdArgs.push_back("-mno-shared");
7637
Daniel Sanders379d44b2014-07-16 11:52:23 +00007638 // LLVM doesn't support -mplt yet and acts as if it is always given.
7639 // However, -mplt has no effect with the N64 ABI.
7640 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007641
7642 if (getToolChain().getArch() == llvm::Triple::mips ||
7643 getToolChain().getArch() == llvm::Triple::mips64)
7644 CmdArgs.push_back("-EB");
7645 else
7646 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007647
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007648 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7649 if (StringRef(A->getValue()) == "2008")
7650 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7651 }
7652
Daniel Sanders379d44b2014-07-16 11:52:23 +00007653 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007654 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007655 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7656 options::OPT_mfp64)) {
7657 A->claim();
7658 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007659 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7660 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007661 CmdArgs.push_back("-mfpxx");
7662
7663 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7664 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007665 if (Arg *A =
7666 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007667 if (A->getOption().matches(options::OPT_mips16)) {
7668 A->claim();
7669 A->render(Args, CmdArgs);
7670 } else {
7671 A->claim();
7672 CmdArgs.push_back("-no-mips16");
7673 }
7674 }
7675
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007676 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7677 options::OPT_mno_micromips);
7678 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7679 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7680
Simon Atanasyanbd986632013-11-26 11:58:04 +00007681 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7682 // Do not use AddLastArg because not all versions of MIPS assembler
7683 // support -mmsa / -mno-msa options.
7684 if (A->getOption().matches(options::OPT_mmsa))
7685 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7686 }
7687
Daniel Sanders379d44b2014-07-16 11:52:23 +00007688 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7689 options::OPT_msoft_float);
7690
Toma Tabacub36d6102015-06-11 12:13:18 +00007691 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7692 options::OPT_msingle_float);
7693
Daniel Sanders379d44b2014-07-16 11:52:23 +00007694 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7695 options::OPT_mno_odd_spreg);
7696
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007697 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007698 break;
7699 }
7700 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007701 // Always pass an -march option, since our default of z10 is later
7702 // than the GNU assembler's default.
7703 StringRef CPUName = getSystemZTargetCPU(Args);
7704 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007705 break;
7706 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007707 }
7708
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007709 if (NeedsKPIC)
7710 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007712 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007713
7714 CmdArgs.push_back("-o");
7715 CmdArgs.push_back(Output.getFilename());
7716
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007717 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007718 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007719
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007720 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007721 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007722
7723 // Handle the debug info splitting at object creation time if we're
7724 // creating an object.
7725 // TODO: Currently only works on linux with newer objcopy.
7726 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007727 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007728 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007729 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007730}
7731
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007732static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007733 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007734 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007735 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7736 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007737 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007738 CmdArgs.push_back("-lgcc");
7739
Logan Chien3d3373c2012-11-19 12:04:11 +00007740 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007741 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007742 CmdArgs.push_back("-lgcc");
7743 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007744 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007745 CmdArgs.push_back("--as-needed");
7746 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007747 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007748 CmdArgs.push_back("--no-as-needed");
7749 }
7750
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007751 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007752 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007753 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007754 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007755
7756 // According to Android ABI, we have to link with libdl if we are
7757 // linking with non-static libgcc.
7758 //
7759 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7760 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7761 if (isAndroid && !StaticLibgcc)
7762 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007763}
7764
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007765static std::string getLinuxDynamicLinker(const ArgList &Args,
7766 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007767 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7768
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007769 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7770 if (ToolChain.getTriple().isArch64Bit())
7771 return "/system/bin/linker64";
7772 else
7773 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007774 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7775 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007776 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007777 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007778 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007779 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007780 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007781 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007782 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7783 return "/lib/ld-linux-armhf.so.3";
7784 else
7785 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007786 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7787 // TODO: check which dynamic linker name.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007788 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007789 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007790 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007791 return "/lib/ld-linux.so.3";
7792 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7793 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007794 StringRef CPUName;
7795 StringRef ABIName;
7796 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7797 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7798
7799 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7800 .Case("o32", "/lib")
7801 .Case("n32", "/lib32")
7802 .Case("n64", "/lib64")
7803 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007804 StringRef LibName;
7805 if (mips::isUCLibc(Args))
7806 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7807 else
7808 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007809
7810 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007811 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007812 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007813 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007814 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7815 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007816 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007817 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007818 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7819 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007820 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007821 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00007822 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007823 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007824 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007825 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00007826 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7827 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007828 else
7829 return "/lib64/ld-linux-x86-64.so.2";
7830}
7831
Renato Golinc4b49242014-02-13 10:01:16 +00007832static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007833 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007834 // Make use of compiler-rt if --rtlib option is used
7835 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7836
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007837 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007838 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007839 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007840 default:
7841 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007842 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007843 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007844 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007845 break;
7846 }
Renato Golinc4b49242014-02-13 10:01:16 +00007847 break;
7848 case ToolChain::RLT_Libgcc:
7849 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7850 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007851 }
7852}
7853
Rafael Espindola1e085772014-08-15 17:14:35 +00007854static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7855 switch (T.getArch()) {
7856 case llvm::Triple::x86:
7857 return "elf_i386";
7858 case llvm::Triple::aarch64:
7859 return "aarch64linux";
7860 case llvm::Triple::aarch64_be:
7861 return "aarch64_be_linux";
7862 case llvm::Triple::arm:
7863 case llvm::Triple::thumb:
7864 return "armelf_linux_eabi";
7865 case llvm::Triple::armeb:
7866 case llvm::Triple::thumbeb:
7867 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7868 case llvm::Triple::ppc:
7869 return "elf32ppclinux";
7870 case llvm::Triple::ppc64:
7871 return "elf64ppc";
7872 case llvm::Triple::ppc64le:
7873 return "elf64lppc";
7874 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007875 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007876 return "elf32_sparc";
7877 case llvm::Triple::sparcv9:
7878 return "elf64_sparc";
7879 case llvm::Triple::mips:
7880 return "elf32btsmip";
7881 case llvm::Triple::mipsel:
7882 return "elf32ltsmip";
7883 case llvm::Triple::mips64:
7884 if (mips::hasMipsAbiArg(Args, "n32"))
7885 return "elf32btsmipn32";
7886 return "elf64btsmip";
7887 case llvm::Triple::mips64el:
7888 if (mips::hasMipsAbiArg(Args, "n32"))
7889 return "elf32ltsmipn32";
7890 return "elf64ltsmip";
7891 case llvm::Triple::systemz:
7892 return "elf64_s390";
7893 case llvm::Triple::x86_64:
7894 if (T.getEnvironment() == llvm::Triple::GNUX32)
7895 return "elf32_x86_64";
7896 return "elf_x86_64";
7897 default:
7898 llvm_unreachable("Unexpected arch");
7899 }
7900}
7901
Douglas Katzman95354292015-06-23 20:42:09 +00007902void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7903 const InputInfo &Output,
7904 const InputInfoList &Inputs,
7905 const ArgList &Args,
7906 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007907 const toolchains::Linux &ToolChain =
7908 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007909 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007910 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007911 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007912 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007913 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007914 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
7915 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007916
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007917 ArgStringList CmdArgs;
7918
Rafael Espindolad1002f62010-11-15 18:28:16 +00007919 // Silence warning for "clang -g foo.o -o foo"
7920 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007921 // and "clang -emit-llvm foo.o -o foo"
7922 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007923 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007924 // handled somewhere else.
7925 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007926
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007927 if (!D.SysRoot.empty())
7928 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007929
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007930 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007931 CmdArgs.push_back("-pie");
7932
Rafael Espindola1c76c592010-11-07 22:57:16 +00007933 if (Args.hasArg(options::OPT_rdynamic))
7934 CmdArgs.push_back("-export-dynamic");
7935
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007936 if (Args.hasArg(options::OPT_s))
7937 CmdArgs.push_back("-s");
7938
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007939 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
7940 arm::appendEBLinkFlags(
7941 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007942 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007943
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007944 for (const auto &Opt : ToolChain.ExtraOpts)
7945 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007946
7947 if (!Args.hasArg(options::OPT_static)) {
7948 CmdArgs.push_back("--eh-frame-hdr");
7949 }
7950
7951 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007952 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007953
7954 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007955 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7956 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007957 CmdArgs.push_back("-Bstatic");
7958 else
7959 CmdArgs.push_back("-static");
7960 } else if (Args.hasArg(options::OPT_shared)) {
7961 CmdArgs.push_back("-shared");
7962 }
7963
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007964 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7965 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007966 (!Args.hasArg(options::OPT_static) &&
7967 !Args.hasArg(options::OPT_shared))) {
7968 CmdArgs.push_back("-dynamic-linker");
7969 CmdArgs.push_back(Args.MakeArgString(
7970 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7971 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007972
7973 CmdArgs.push_back("-o");
7974 CmdArgs.push_back(Output.getFilename());
7975
Rafael Espindola81937ec2010-12-01 01:52:43 +00007976 if (!Args.hasArg(options::OPT_nostdlib) &&
7977 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007978 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007979 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007980 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00007981 if (Args.hasArg(options::OPT_pg))
7982 crt1 = "gcrt1.o";
7983 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007984 crt1 = "Scrt1.o";
7985 else
7986 crt1 = "crt1.o";
7987 }
7988 if (crt1)
7989 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007990
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007991 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7992 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007993
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007994 const char *crtbegin;
7995 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007996 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007997 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007998 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007999 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008000 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008001 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008002 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008003 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008004
8005 // Add crtfastmath.o if available and fast math is enabled.
8006 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008007 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008008
8009 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008010 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008011
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008012 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008013
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008014 for (const auto &Path : Paths)
8015 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008016
Alexey Samsonov907880e2015-06-19 19:57:46 +00008017 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008018 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008019
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008020 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8021 CmdArgs.push_back("--no-demangle");
8022
Alexey Samsonov52550342014-09-15 19:58:40 +00008023 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008024 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008025 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008026 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008027
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008028 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008029 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008030 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008031 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008032 if (OnlyLibstdcxxStatic)
8033 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008034 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008035 if (OnlyLibstdcxxStatic)
8036 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008037 CmdArgs.push_back("-lm");
8038 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008039 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8040 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008041
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008042 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008043 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8044 if (Args.hasArg(options::OPT_static))
8045 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008046
Alexey Samsonov52550342014-09-15 19:58:40 +00008047 if (NeedsSanitizerDeps)
8048 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8049
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008050 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8051 Args.hasArg(options::OPT_pthreads);
8052
8053 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8054 options::OPT_fno_openmp, false)) {
8055 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8056 // FIXME: Does this really make sense for all GNU toolchains?
8057 WantPthread = true;
8058
8059 // Also link the particular OpenMP runtimes.
8060 switch (getOpenMPRuntime(ToolChain, Args)) {
8061 case OMPRT_OMP:
8062 CmdArgs.push_back("-lomp");
8063 break;
8064 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008065 CmdArgs.push_back("-lgomp");
8066
8067 // FIXME: Exclude this for platforms with libgomp that don't require
8068 // librt. Most modern Linux platforms require it, but some may not.
8069 CmdArgs.push_back("-lrt");
8070 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008071 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008072 CmdArgs.push_back("-liomp5");
8073 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008074 case OMPRT_Unknown:
8075 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008076 break;
8077 }
Chandler Carruth01538002013-01-17 13:19:29 +00008078 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008079
Renato Golinc4b49242014-02-13 10:01:16 +00008080 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008081
Richard Smith31d1de22015-05-20 22:48:44 +00008082 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008083 CmdArgs.push_back("-lpthread");
8084
8085 CmdArgs.push_back("-lc");
8086
8087 if (Args.hasArg(options::OPT_static))
8088 CmdArgs.push_back("--end-group");
8089 else
Renato Golinc4b49242014-02-13 10:01:16 +00008090 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008091 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008092
Rafael Espindola81937ec2010-12-01 01:52:43 +00008093 if (!Args.hasArg(options::OPT_nostartfiles)) {
8094 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008095 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008096 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008097 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008098 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008099 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008100 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008101
Rafael Espindola81937ec2010-12-01 01:52:43 +00008102 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008103 if (!isAndroid)
8104 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008105 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008106 }
8107
David Blaikiec11bf802014-09-04 16:04:28 +00008108 C.addCommand(
8109 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008110}
8111
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008112// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8113// for the various SFI requirements like register masking. The assembly tool
8114// inserts the file containing the macros as an input into all the assembly
8115// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008116void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8117 const InputInfo &Output,
8118 const InputInfoList &Inputs,
8119 const ArgList &Args,
8120 const char *LinkingOutput) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008121 const toolchains::NaCl_TC &ToolChain =
8122 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008123 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8124 "nacl-arm-macros.s");
8125 InputInfoList NewInputs;
8126 NewInputs.push_back(NaClMacros);
8127 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008128 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8129 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008130}
8131
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008132// This is quite similar to gnutools::link::ConstructJob with changes that
8133// we use static by default, do not yet support sanitizers or LTO, and a few
8134// others. Eventually we can support more of that and hopefully migrate back
8135// to gnutools::link.
Douglas Katzman95354292015-06-23 20:42:09 +00008136void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8137 const InputInfo &Output,
8138 const InputInfoList &Inputs,
8139 const ArgList &Args,
8140 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008141
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008142 const toolchains::NaCl_TC &ToolChain =
8143 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008144 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008145 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008146 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008147 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008148
8149 ArgStringList CmdArgs;
8150
8151 // Silence warning for "clang -g foo.o -o foo"
8152 Args.ClaimAllArgs(options::OPT_g_Group);
8153 // and "clang -emit-llvm foo.o -o foo"
8154 Args.ClaimAllArgs(options::OPT_emit_llvm);
8155 // and for "clang -w foo.o -o foo". Other warning options are already
8156 // handled somewhere else.
8157 Args.ClaimAllArgs(options::OPT_w);
8158
8159 if (!D.SysRoot.empty())
8160 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8161
8162 if (Args.hasArg(options::OPT_rdynamic))
8163 CmdArgs.push_back("-export-dynamic");
8164
8165 if (Args.hasArg(options::OPT_s))
8166 CmdArgs.push_back("-s");
8167
8168 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8169 // there is --build-id, which we do want.
8170 CmdArgs.push_back("--build-id");
8171
8172 if (!IsStatic)
8173 CmdArgs.push_back("--eh-frame-hdr");
8174
8175 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008176 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008177 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008178 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008179 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008180 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008181 CmdArgs.push_back("elf_x86_64_nacl");
8182 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008183 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8184 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008185
8186 if (IsStatic)
8187 CmdArgs.push_back("-static");
8188 else if (Args.hasArg(options::OPT_shared))
8189 CmdArgs.push_back("-shared");
8190
8191 CmdArgs.push_back("-o");
8192 CmdArgs.push_back(Output.getFilename());
8193 if (!Args.hasArg(options::OPT_nostdlib) &&
8194 !Args.hasArg(options::OPT_nostartfiles)) {
8195 if (!Args.hasArg(options::OPT_shared))
8196 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8197 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8198
8199 const char *crtbegin;
8200 if (IsStatic)
8201 crtbegin = "crtbeginT.o";
8202 else if (Args.hasArg(options::OPT_shared))
8203 crtbegin = "crtbeginS.o";
8204 else
8205 crtbegin = "crtbegin.o";
8206 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8207 }
8208
8209 Args.AddAllArgs(CmdArgs, options::OPT_L);
8210 Args.AddAllArgs(CmdArgs, options::OPT_u);
8211
8212 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8213
8214 for (const auto &Path : Paths)
8215 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8216
8217 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8218 CmdArgs.push_back("--no-demangle");
8219
8220 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8221
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008222 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008223 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008224 bool OnlyLibstdcxxStatic =
8225 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008226 if (OnlyLibstdcxxStatic)
8227 CmdArgs.push_back("-Bstatic");
8228 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8229 if (OnlyLibstdcxxStatic)
8230 CmdArgs.push_back("-Bdynamic");
8231 CmdArgs.push_back("-lm");
8232 }
8233
8234 if (!Args.hasArg(options::OPT_nostdlib)) {
8235 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8236 // Always use groups, since it has no effect on dynamic libraries.
8237 CmdArgs.push_back("--start-group");
8238 CmdArgs.push_back("-lc");
8239 // NaCl's libc++ currently requires libpthread, so just always include it
8240 // in the group for C++.
8241 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008242 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008243 CmdArgs.push_back("-lpthread");
8244 }
8245
8246 CmdArgs.push_back("-lgcc");
8247 CmdArgs.push_back("--as-needed");
8248 if (IsStatic)
8249 CmdArgs.push_back("-lgcc_eh");
8250 else
8251 CmdArgs.push_back("-lgcc_s");
8252 CmdArgs.push_back("--no-as-needed");
8253 CmdArgs.push_back("--end-group");
8254 }
8255
8256 if (!Args.hasArg(options::OPT_nostartfiles)) {
8257 const char *crtend;
8258 if (Args.hasArg(options::OPT_shared))
8259 crtend = "crtendS.o";
8260 else
8261 crtend = "crtend.o";
8262
8263 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8264 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8265 }
8266 }
8267
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008268 C.addCommand(
8269 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008270}
8271
Douglas Katzman95354292015-06-23 20:42:09 +00008272void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8273 const InputInfo &Output,
8274 const InputInfoList &Inputs,
8275 const ArgList &Args,
8276 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008277 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008278 ArgStringList CmdArgs;
8279
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008280 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008281
8282 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008283 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008284
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008285 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008286 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008287
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008288 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008289 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008290}
8291
Douglas Katzman95354292015-06-23 20:42:09 +00008292void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8293 const InputInfo &Output,
8294 const InputInfoList &Inputs,
8295 const ArgList &Args,
8296 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008297 const Driver &D = getToolChain().getDriver();
8298 ArgStringList CmdArgs;
8299
Daniel Dunbarb440f562010-08-02 02:38:21 +00008300 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008301 CmdArgs.push_back("-o");
8302 CmdArgs.push_back(Output.getFilename());
8303 } else {
8304 assert(Output.isNothing() && "Invalid output.");
8305 }
8306
8307 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008308 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008309 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8310 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8311 CmdArgs.push_back(
8312 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8313 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008314 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008315
8316 Args.AddAllArgs(CmdArgs, options::OPT_L);
8317 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8318 Args.AddAllArgs(CmdArgs, options::OPT_e);
8319
Daniel Dunbar54423b22010-09-17 00:24:54 +00008320 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008321
Alexey Samsonov7811d192014-02-20 13:57:37 +00008322 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008323
Chris Lattner3e2ee142010-07-07 16:01:42 +00008324 if (!Args.hasArg(options::OPT_nostdlib) &&
8325 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008326 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008327 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008328 CmdArgs.push_back("-lm");
8329 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008330 }
8331
8332 if (!Args.hasArg(options::OPT_nostdlib) &&
8333 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008334 if (Args.hasArg(options::OPT_pthread))
8335 CmdArgs.push_back("-lpthread");
8336 CmdArgs.push_back("-lc");
8337 CmdArgs.push_back("-lCompilerRT-Generic");
8338 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8339 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008340 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008341 }
8342
Logan Chieneb9162f2014-06-26 14:23:45 +00008343 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008344 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008345}
8346
Daniel Dunbarcc912342009-05-02 18:28:39 +00008347/// DragonFly Tools
8348
8349// For now, DragonFly Assemble does just about the same as for
8350// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008351void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8352 const InputInfo &Output,
8353 const InputInfoList &Inputs,
8354 const ArgList &Args,
8355 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008356 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008357 ArgStringList CmdArgs;
8358
8359 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8360 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008361 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008362 CmdArgs.push_back("--32");
8363
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008364 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008365
8366 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008367 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008368
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008369 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008370 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008371
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008372 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008373 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008374}
8375
Douglas Katzman95354292015-06-23 20:42:09 +00008376void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8377 const InputInfo &Output,
8378 const InputInfoList &Inputs,
8379 const ArgList &Args,
8380 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008381 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008382 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008383 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008384
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008385 if (!D.SysRoot.empty())
8386 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8387
John McCall65b8da02013-04-11 22:55:55 +00008388 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008389 if (Args.hasArg(options::OPT_static)) {
8390 CmdArgs.push_back("-Bstatic");
8391 } else {
John McCall65b8da02013-04-11 22:55:55 +00008392 if (Args.hasArg(options::OPT_rdynamic))
8393 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008394 if (Args.hasArg(options::OPT_shared))
8395 CmdArgs.push_back("-Bshareable");
8396 else {
8397 CmdArgs.push_back("-dynamic-linker");
8398 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8399 }
John McCall65b8da02013-04-11 22:55:55 +00008400 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008401 }
8402
8403 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8404 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008405 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008406 CmdArgs.push_back("-m");
8407 CmdArgs.push_back("elf_i386");
8408 }
8409
Daniel Dunbarb440f562010-08-02 02:38:21 +00008410 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008411 CmdArgs.push_back("-o");
8412 CmdArgs.push_back(Output.getFilename());
8413 } else {
8414 assert(Output.isNothing() && "Invalid output.");
8415 }
8416
8417 if (!Args.hasArg(options::OPT_nostdlib) &&
8418 !Args.hasArg(options::OPT_nostartfiles)) {
8419 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008420 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008421 CmdArgs.push_back(
8422 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008423 else {
8424 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008425 CmdArgs.push_back(
8426 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008427 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008428 CmdArgs.push_back(
8429 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008430 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008431 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008432 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008433 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008434 CmdArgs.push_back(
8435 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008436 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008437 CmdArgs.push_back(
8438 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008439 }
8440
8441 Args.AddAllArgs(CmdArgs, options::OPT_L);
8442 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8443 Args.AddAllArgs(CmdArgs, options::OPT_e);
8444
Daniel Dunbar54423b22010-09-17 00:24:54 +00008445 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008446
8447 if (!Args.hasArg(options::OPT_nostdlib) &&
8448 !Args.hasArg(options::OPT_nodefaultlibs)) {
8449 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8450 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008451 if (UseGCC47)
8452 CmdArgs.push_back("-L/usr/lib/gcc47");
8453 else
8454 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008455
8456 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008457 if (UseGCC47) {
8458 CmdArgs.push_back("-rpath");
8459 CmdArgs.push_back("/usr/lib/gcc47");
8460 } else {
8461 CmdArgs.push_back("-rpath");
8462 CmdArgs.push_back("/usr/lib/gcc44");
8463 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008464 }
8465
Hans Wennborg70850d82013-07-18 20:29:38 +00008466 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008467 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008468 CmdArgs.push_back("-lm");
8469 }
8470
Daniel Dunbarcc912342009-05-02 18:28:39 +00008471 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008472 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008473
8474 if (!Args.hasArg(options::OPT_nolibc)) {
8475 CmdArgs.push_back("-lc");
8476 }
8477
John McCall65b8da02013-04-11 22:55:55 +00008478 if (UseGCC47) {
8479 if (Args.hasArg(options::OPT_static) ||
8480 Args.hasArg(options::OPT_static_libgcc)) {
8481 CmdArgs.push_back("-lgcc");
8482 CmdArgs.push_back("-lgcc_eh");
8483 } else {
8484 if (Args.hasArg(options::OPT_shared_libgcc)) {
8485 CmdArgs.push_back("-lgcc_pic");
8486 if (!Args.hasArg(options::OPT_shared))
8487 CmdArgs.push_back("-lgcc");
8488 } else {
8489 CmdArgs.push_back("-lgcc");
8490 CmdArgs.push_back("--as-needed");
8491 CmdArgs.push_back("-lgcc_pic");
8492 CmdArgs.push_back("--no-as-needed");
8493 }
8494 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008495 } else {
John McCall65b8da02013-04-11 22:55:55 +00008496 if (Args.hasArg(options::OPT_shared)) {
8497 CmdArgs.push_back("-lgcc_pic");
8498 } else {
8499 CmdArgs.push_back("-lgcc");
8500 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008501 }
8502 }
8503
8504 if (!Args.hasArg(options::OPT_nostdlib) &&
8505 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008506 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008507 CmdArgs.push_back(
8508 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008509 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008510 CmdArgs.push_back(
8511 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8512 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008513 }
8514
Alexey Samsonov7811d192014-02-20 13:57:37 +00008515 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008516
Logan Chieneb9162f2014-06-26 14:23:45 +00008517 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008518 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008519}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008520
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008521// Try to find Exe from a Visual Studio distribution. This first tries to find
8522// an installed copy of Visual Studio and, failing that, looks in the PATH,
8523// making sure that whatever executable that's found is not a same-named exe
8524// from clang itself to prevent clang from falling back to itself.
8525static std::string FindVisualStudioExecutable(const ToolChain &TC,
8526 const char *Exe,
8527 const char *ClangProgramPath) {
8528 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8529 std::string visualStudioBinDir;
8530 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8531 visualStudioBinDir)) {
8532 SmallString<128> FilePath(visualStudioBinDir);
8533 llvm::sys::path::append(FilePath, Exe);
8534 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8535 return FilePath.str();
8536 }
8537
8538 return Exe;
8539}
8540
Douglas Katzman95354292015-06-23 20:42:09 +00008541void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8542 const InputInfo &Output,
8543 const InputInfoList &Inputs,
8544 const ArgList &Args,
8545 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008546 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008547 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008548
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008549 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8550 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008551 CmdArgs.push_back(
8552 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008553
8554 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008555 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008556 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008557
Zachary Turner10d75b22014-10-22 20:40:43 +00008558 if (!llvm::sys::Process::GetEnv("LIB")) {
8559 // If the VC environment hasn't been configured (perhaps because the user
8560 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008561 // the environment variable is set however, assume the user knows what
8562 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008563 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008564 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008565 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8566 SmallString<128> LibDir(VisualStudioDir);
8567 llvm::sys::path::append(LibDir, "VC", "lib");
8568 switch (MSVC.getArch()) {
8569 case llvm::Triple::x86:
8570 // x86 just puts the libraries directly in lib
8571 break;
8572 case llvm::Triple::x86_64:
8573 llvm::sys::path::append(LibDir, "amd64");
8574 break;
8575 case llvm::Triple::arm:
8576 llvm::sys::path::append(LibDir, "arm");
8577 break;
8578 default:
8579 break;
8580 }
8581 CmdArgs.push_back(
8582 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8583 }
8584
8585 std::string WindowsSdkLibPath;
8586 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8587 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8588 WindowsSdkLibPath.c_str()));
8589 }
8590
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008591 CmdArgs.push_back("-nologo");
8592
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008593 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008594 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008595
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008596 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008597 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008598 if (DLL) {
8599 CmdArgs.push_back(Args.MakeArgString("-dll"));
8600
8601 SmallString<128> ImplibName(Output.getFilename());
8602 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008603 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008604 }
8605
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008606 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008607 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008608 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008609 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008610 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008611 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008612 };
8613 for (const auto &Component : CompilerRTComponents)
8614 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008615 // Make sure the dynamic runtime thunk is not optimized out at link time
8616 // to ensure proper SEH handling.
8617 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008618 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008619 CmdArgs.push_back(
8620 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008621 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008622 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008623 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008624 };
8625 for (const auto &Component : CompilerRTComponents)
8626 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008627 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008628 }
8629
Hans Wennborg2e274592013-08-13 23:38:57 +00008630 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008631
Reid Kleckner337188f2014-09-16 19:22:00 +00008632 // Add filenames, libraries, and other linker inputs.
8633 for (const auto &Input : Inputs) {
8634 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008635 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008636 continue;
8637 }
8638
8639 const Arg &A = Input.getInputArg();
8640
8641 // Render -l options differently for the MSVC linker.
8642 if (A.getOption().matches(options::OPT_l)) {
8643 StringRef Lib = A.getValue();
8644 const char *LinkLibArg;
8645 if (Lib.endswith(".lib"))
8646 LinkLibArg = Args.MakeArgString(Lib);
8647 else
8648 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8649 CmdArgs.push_back(LinkLibArg);
8650 continue;
8651 }
8652
8653 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8654 // or -L. Render it, even if MSVC doesn't understand it.
8655 A.renderAsInput(Args, CmdArgs);
8656 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008657
Zachary Turner719f58c2014-12-01 23:06:47 +00008658 // We need to special case some linker paths. In the case of lld, we need to
8659 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8660 // linker, we need to use a special search algorithm.
8661 llvm::SmallString<128> linkPath;
8662 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8663 if (Linker.equals_lower("lld"))
8664 Linker = "lld-link";
8665
8666 if (Linker.equals_lower("link")) {
8667 // If we're using the MSVC linker, it's not sufficient to just use link
8668 // from the program PATH, because other environments like GnuWin32 install
8669 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008670 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008671 C.getDriver().getClangProgramPath());
8672 } else {
8673 linkPath = Linker;
8674 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008675 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008676 }
8677
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008678 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008679 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008680}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008681
Douglas Katzman95354292015-06-23 20:42:09 +00008682void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8683 const InputInfo &Output,
8684 const InputInfoList &Inputs,
8685 const ArgList &Args,
8686 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008687 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8688}
8689
Douglas Katzman95354292015-06-23 20:42:09 +00008690std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008691 Compilation &C, const JobAction &JA, const InputInfo &Output,
8692 const InputInfoList &Inputs, const ArgList &Args,
8693 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008694 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008695 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008696 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008697 CmdArgs.push_back("/W0"); // No warnings.
8698
8699 // The goal is to be able to invoke this tool correctly based on
8700 // any flag accepted by clang-cl.
8701
8702 // These are spelled the same way in clang and cl.exe,.
8703 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8704 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008705
8706 // Optimization level.
8707 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8708 if (A->getOption().getID() == options::OPT_O0) {
8709 CmdArgs.push_back("/Od");
8710 } else {
8711 StringRef OptLevel = A->getValue();
8712 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8713 A->render(Args, CmdArgs);
8714 else if (OptLevel == "3")
8715 CmdArgs.push_back("/Ox");
8716 }
8717 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008718
Nico Weber3f8dafb2015-03-12 19:37:10 +00008719 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008720 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8721
David Majnemerf6072342014-07-01 22:24:56 +00008722 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8723 /*default=*/false))
8724 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008725 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8726 options::OPT_fno_function_sections))
8727 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8728 ? "/Gy"
8729 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008730 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8731 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008732 CmdArgs.push_back(
8733 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008734 if (Args.hasArg(options::OPT_fsyntax_only))
8735 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008736 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8737 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008738
Nico Weber3f8dafb2015-03-12 19:37:10 +00008739 std::vector<std::string> Includes =
8740 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008741 for (const auto &Include : Includes)
8742 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008743
Hans Wennborg87cfa712013-09-19 20:32:16 +00008744 // Flags that can simply be passed through.
8745 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8746 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008747 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008748
8749 // The order of these flags is relevant, so pick the last one.
8750 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8751 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8752 A->render(Args, CmdArgs);
8753
Hans Wennborg87cfa712013-09-19 20:32:16 +00008754 // Input filename.
8755 assert(Inputs.size() == 1);
8756 const InputInfo &II = Inputs[0];
8757 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8758 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8759 if (II.isFilename())
8760 CmdArgs.push_back(II.getFilename());
8761 else
8762 II.getInputArg().renderAsInput(Args, CmdArgs);
8763
8764 // Output filename.
8765 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008766 const char *Fo =
8767 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00008768 CmdArgs.push_back(Fo);
8769
Hans Wennborg188382e2013-09-20 18:16:35 +00008770 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008771 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8772 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008773 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8774 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008775}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008776
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008777/// XCore Tools
8778// We pass assemble and link construction to the xcc tool.
8779
Douglas Katzman95354292015-06-23 20:42:09 +00008780void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8781 const InputInfo &Output,
8782 const InputInfoList &Inputs,
8783 const ArgList &Args,
8784 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008785 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008786 ArgStringList CmdArgs;
8787
8788 CmdArgs.push_back("-o");
8789 CmdArgs.push_back(Output.getFilename());
8790
8791 CmdArgs.push_back("-c");
8792
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008793 if (Args.hasArg(options::OPT_v))
8794 CmdArgs.push_back("-v");
8795
Robert Lytton894d25c2014-05-02 09:33:25 +00008796 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8797 if (!A->getOption().matches(options::OPT_g0))
8798 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008799
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008800 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8801 false))
8802 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008803
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008804 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008805
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008806 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008807 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008808
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008809 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008810 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008811}
8812
Douglas Katzman95354292015-06-23 20:42:09 +00008813void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8814 const InputInfo &Output,
8815 const InputInfoList &Inputs,
8816 const ArgList &Args,
8817 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008818 ArgStringList CmdArgs;
8819
8820 if (Output.isFilename()) {
8821 CmdArgs.push_back("-o");
8822 CmdArgs.push_back(Output.getFilename());
8823 } else {
8824 assert(Output.isNothing() && "Invalid output.");
8825 }
8826
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008827 if (Args.hasArg(options::OPT_v))
8828 CmdArgs.push_back("-v");
8829
David Majnemer8de68642014-12-05 08:11:58 +00008830 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008831 CmdArgs.push_back("-fexceptions");
8832
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008833 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8834
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008835 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008836 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008837}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008838
Douglas Katzman95354292015-06-23 20:42:09 +00008839void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8840 const InputInfo &Output,
8841 const InputInfoList &Inputs,
8842 const ArgList &Args,
8843 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008844 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008845 const auto &TC =
8846 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8847 ArgStringList CmdArgs;
8848 const char *Exec;
8849
8850 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008851 default:
8852 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008853 case llvm::Triple::arm:
8854 case llvm::Triple::thumb:
8855 break;
8856 case llvm::Triple::x86:
8857 CmdArgs.push_back("--32");
8858 break;
8859 case llvm::Triple::x86_64:
8860 CmdArgs.push_back("--64");
8861 break;
8862 }
8863
8864 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8865
8866 CmdArgs.push_back("-o");
8867 CmdArgs.push_back(Output.getFilename());
8868
8869 for (const auto &Input : Inputs)
8870 CmdArgs.push_back(Input.getFilename());
8871
8872 const std::string Assembler = TC.GetProgramPath("as");
8873 Exec = Args.MakeArgString(Assembler);
8874
8875 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8876}
8877
Douglas Katzman95354292015-06-23 20:42:09 +00008878void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8879 const InputInfo &Output,
8880 const InputInfoList &Inputs,
8881 const ArgList &Args,
8882 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008883 const auto &TC =
8884 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8885 const llvm::Triple &T = TC.getTriple();
8886 const Driver &D = TC.getDriver();
8887 SmallString<128> EntryPoint;
8888 ArgStringList CmdArgs;
8889 const char *Exec;
8890
8891 // Silence warning for "clang -g foo.o -o foo"
8892 Args.ClaimAllArgs(options::OPT_g_Group);
8893 // and "clang -emit-llvm foo.o -o foo"
8894 Args.ClaimAllArgs(options::OPT_emit_llvm);
8895 // and for "clang -w foo.o -o foo"
8896 Args.ClaimAllArgs(options::OPT_w);
8897 // Other warning options are already handled somewhere else.
8898
8899 if (!D.SysRoot.empty())
8900 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8901
8902 if (Args.hasArg(options::OPT_pie))
8903 CmdArgs.push_back("-pie");
8904 if (Args.hasArg(options::OPT_rdynamic))
8905 CmdArgs.push_back("-export-dynamic");
8906 if (Args.hasArg(options::OPT_s))
8907 CmdArgs.push_back("--strip-all");
8908
8909 CmdArgs.push_back("-m");
8910 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008911 default:
8912 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008913 case llvm::Triple::arm:
8914 case llvm::Triple::thumb:
8915 // FIXME: this is incorrect for WinCE
8916 CmdArgs.push_back("thumb2pe");
8917 break;
8918 case llvm::Triple::x86:
8919 CmdArgs.push_back("i386pe");
8920 EntryPoint.append("_");
8921 break;
8922 case llvm::Triple::x86_64:
8923 CmdArgs.push_back("i386pep");
8924 break;
8925 }
8926
8927 if (Args.hasArg(options::OPT_shared)) {
8928 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008929 default:
8930 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008931 case llvm::Triple::arm:
8932 case llvm::Triple::thumb:
8933 case llvm::Triple::x86_64:
8934 EntryPoint.append("_DllMainCRTStartup");
8935 break;
8936 case llvm::Triple::x86:
8937 EntryPoint.append("_DllMainCRTStartup@12");
8938 break;
8939 }
8940
8941 CmdArgs.push_back("-shared");
8942 CmdArgs.push_back("-Bdynamic");
8943
8944 CmdArgs.push_back("--enable-auto-image-base");
8945
8946 CmdArgs.push_back("--entry");
8947 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8948 } else {
8949 EntryPoint.append("mainCRTStartup");
8950
8951 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8952 : "-Bdynamic");
8953
8954 if (!Args.hasArg(options::OPT_nostdlib) &&
8955 !Args.hasArg(options::OPT_nostartfiles)) {
8956 CmdArgs.push_back("--entry");
8957 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8958 }
8959
8960 // FIXME: handle subsystem
8961 }
8962
8963 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008964 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008965
8966 CmdArgs.push_back("-o");
8967 CmdArgs.push_back(Output.getFilename());
8968
8969 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8970 SmallString<261> ImpLib(Output.getFilename());
8971 llvm::sys::path::replace_extension(ImpLib, ".lib");
8972
8973 CmdArgs.push_back("--out-implib");
8974 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8975 }
8976
8977 if (!Args.hasArg(options::OPT_nostdlib) &&
8978 !Args.hasArg(options::OPT_nostartfiles)) {
8979 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8980 const char *CRTBegin;
8981
8982 CRTBegin =
8983 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8984 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8985 }
8986
8987 Args.AddAllArgs(CmdArgs, options::OPT_L);
8988
8989 const auto &Paths = TC.getFilePaths();
8990 for (const auto &Path : Paths)
8991 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8992
8993 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8994
8995 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8996 !Args.hasArg(options::OPT_nodefaultlibs)) {
8997 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8998 !Args.hasArg(options::OPT_static);
8999 if (StaticCXX)
9000 CmdArgs.push_back("-Bstatic");
9001 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9002 if (StaticCXX)
9003 CmdArgs.push_back("-Bdynamic");
9004 }
9005
9006 if (!Args.hasArg(options::OPT_nostdlib)) {
9007 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9008 // TODO handle /MT[d] /MD[d]
9009 CmdArgs.push_back("-lmsvcrt");
9010 AddRunTimeLibs(TC, D, CmdArgs, Args);
9011 }
9012 }
9013
9014 const std::string Linker = TC.GetProgramPath("ld");
9015 Exec = Args.MakeArgString(Linker);
9016
9017 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9018}
Douglas Katzman84a75642015-06-19 14:55:19 +00009019
Douglas Katzman95354292015-06-23 20:42:09 +00009020void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9021 const InputInfo &Output,
9022 const InputInfoList &Inputs,
9023 const ArgList &Args,
9024 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009025
9026 ArgStringList CmdArgs;
9027
9028 assert(Inputs.size() == 1);
9029 const InputInfo &II = Inputs[0];
9030 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9031 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9032
9033 // Append all -I, -iquote, -isystem paths.
9034 Args.AddAllArgs(CmdArgs, options::OPT_clang_i_Group);
9035 // These are spelled the same way in clang and moviCompile.
9036 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
9037
9038 CmdArgs.push_back("-DMYRIAD2");
9039 CmdArgs.push_back("-mcpu=myriad2");
9040 CmdArgs.push_back("-S");
9041
9042 // Any -O option passes through without translation. What about -Ofast ?
9043 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9044 A->render(Args, CmdArgs);
9045
9046 if (Args.hasFlag(options::OPT_ffunction_sections,
9047 options::OPT_fno_function_sections)) {
9048 CmdArgs.push_back("-ffunction-sections");
9049 }
9050 if (Args.hasArg(options::OPT_fno_inline_functions))
9051 CmdArgs.push_back("-fno-inline-functions");
9052
9053 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9054
9055 CmdArgs.push_back(II.getFilename());
9056 CmdArgs.push_back("-o");
9057 CmdArgs.push_back(Output.getFilename());
9058
9059 std::string Exec =
9060 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
9061 C.addCommand(
9062 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9063}
9064
Douglas Katzman95354292015-06-23 20:42:09 +00009065void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9066 const InputInfo &Output,
9067 const InputInfoList &Inputs,
9068 const ArgList &Args,
9069 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009070 ArgStringList CmdArgs;
9071
9072 assert(Inputs.size() == 1);
9073 const InputInfo &II = Inputs[0];
9074 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9075 assert(Output.getType() == types::TY_Object);
9076
9077 CmdArgs.push_back("-no6thSlotCompression");
9078 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9079 CmdArgs.push_back("-noSPrefixing");
9080 CmdArgs.push_back("-a"); // Mystery option.
9081 for (auto Arg : Args.filtered(options::OPT_I)) {
9082 Arg->claim();
9083 CmdArgs.push_back(
9084 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9085 }
9086 CmdArgs.push_back("-elf"); // Output format.
9087 CmdArgs.push_back(II.getFilename());
9088 CmdArgs.push_back(
9089 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9090
9091 std::string Exec =
9092 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
9093 C.addCommand(
9094 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9095}