blob: d80443b7d70328d3032b2356b2285f0112f5cc95 [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
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000415 Args.AddAllArgs(CmdArgs,
416 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
417 options::OPT_F, 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
Renato Goline17c5802015-07-27 23:44:42 +0000505// ARM tools start.
506
507// Get SubArch (vN).
508static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
509 llvm::StringRef Arch = Triple.getArchName();
510 return llvm::ARMTargetParser::parseArchVersion(Arch);
511}
512
513// True if M-profile.
514static bool isARMMProfile(const llvm::Triple &Triple) {
515 llvm::StringRef Arch = Triple.getArchName();
516 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
517 return Profile == llvm::ARM::PK_M;
518}
519
520// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000521static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
522 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000523 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
524 CPU = A->getValue();
525 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
526 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000527 if (!FromAs)
528 return;
529
530 for (const Arg *A :
531 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
532 StringRef Value = A->getValue();
533 if (Value.startswith("-mcpu="))
534 CPU = Value.substr(6);
535 if (Value.startswith("-march="))
536 Arch = Value.substr(7);
537 }
Renato Goline17c5802015-07-27 23:44:42 +0000538}
539
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000540// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000541// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000542static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000543 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000544 std::vector<const char *> &Features) {
Alexandros Lamprinease5b47642015-07-28 09:08:03 +0000545 unsigned HWDivID = llvm::ARMTargetParser::parseHWDiv(HWDiv);
546 if (!llvm::ARMTargetParser::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000547 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
548}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000549
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000550// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000551static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000552 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000553 std::vector<const char *> &Features) {
John Brawn5a589ad2015-06-05 13:34:11 +0000554 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
555 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000556 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
557}
558
Renato Golin7c542b42015-07-27 23:44:45 +0000559// Check if -march is valid by checking if it can be canonicalised and parsed.
560// getARMArch is used here instead of just checking the -march value in order
561// to handle -march=native correctly.
562static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000563 llvm::StringRef ArchName,
564 const llvm::Triple &Triple) {
565 std::string MArch = arm::getARMArch(ArchName, Triple);
566 if (llvm::ARMTargetParser::parseArch(MArch) == llvm::ARM::AK_INVALID)
567 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000568}
569
Renato Golin7c542b42015-07-27 23:44:45 +0000570// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
571static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
572 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000573 const llvm::Triple &Triple) {
574 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
575 std::string Arch = arm::getARMArch(ArchName, Triple);
576 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
577 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000578}
579
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000580// Select the float ABI as determined by -msoft-float, -mhard-float, and
581// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000582StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000583 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000584 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000585 if (Arg *A =
586 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
587 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000588 if (A->getOption().matches(options::OPT_msoft_float))
589 FloatABI = "soft";
590 else if (A->getOption().matches(options::OPT_mhard_float))
591 FloatABI = "hard";
592 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000593 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000594 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000595 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000596 FloatABI = "soft";
597 }
598 }
599 }
600
601 // If unspecified, choose the default based on the platform.
602 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000603 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000604 case llvm::Triple::Darwin:
605 case llvm::Triple::MacOSX:
606 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 // Darwin defaults to "softfp" for v6 and v7.
608 //
John Brawn94fd9632015-05-21 12:19:49 +0000609 if (getARMSubArchVersionNumber(Triple) == 6 ||
610 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000611 FloatABI = "softfp";
612 else
613 FloatABI = "soft";
614 break;
615 }
616
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000617 // FIXME: this is invalid for WindowsCE
618 case llvm::Triple::Win32:
619 FloatABI = "hard";
620 break;
621
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000622 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000623 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000624 case llvm::Triple::GNUEABIHF:
625 FloatABI = "hard";
626 break;
627 default:
628 // FreeBSD defaults to soft float
629 FloatABI = "soft";
630 break;
631 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000632 break;
633
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000635 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000642 case llvm::Triple::EABIHF:
643 FloatABI = "hard";
644 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000645 case llvm::Triple::EABI:
646 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
647 FloatABI = "softfp";
648 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000649 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000650 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000656 default:
657 // Assume "soft", but warn the user we are guessing.
658 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000659 if (Triple.getOS() != llvm::Triple::UnknownOS ||
660 !Triple.isOSBinFormatMachO())
661 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000662 break;
663 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 }
665 }
666
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000667 return FloatABI;
668}
669
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000670static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
671 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000672 std::vector<const char *> &Features,
673 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000674 bool KernelOrKext =
675 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000676 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000677 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
678 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
679
Nico Weber6e0ebae2015-04-29 21:16:40 +0000680 if (!ForAS) {
681 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
682 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
683 // stripped out by the ARM target. We should probably pass this a new
684 // -target-option, which is handled by the -cc1/-cc1as invocation.
685 //
686 // FIXME2: For consistency, it would be ideal if we set up the target
687 // machine state the same when using the frontend or the assembler. We don't
688 // currently do that for the assembler, we pass the options directly to the
689 // backend and never even instantiate the frontend TargetInfo. If we did,
690 // and used its handleTargetFeatures hook, then we could ensure the
691 // assembler and the frontend behave the same.
692
693 // Use software floating point operations?
694 if (FloatABI == "soft")
695 Features.push_back("+soft-float");
696
697 // Use software floating point argument passing?
698 if (FloatABI != "hard")
699 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000700 } else {
701 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
702 // to the assembler correctly.
703 for (const Arg *A :
704 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
705 StringRef Value = A->getValue();
706 if (Value.startswith("-mfpu=")) {
707 WaFPU = A;
708 } else if (Value.startswith("-mcpu=")) {
709 WaCPU = A;
710 } else if (Value.startswith("-mhwdiv=")) {
711 WaHDiv = A;
712 } else if (Value.startswith("-march=")) {
713 WaArch = A;
714 }
715 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000716 }
717
Renato Golin7c542b42015-07-27 23:44:45 +0000718 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
719 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
720 if (WaFPU) {
721 if (FPUArg)
722 D.Diag(clang::diag::warn_drv_unused_argument)
723 << FPUArg->getAsString(Args);
724 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
725 Features);
726 } else if (FPUArg) {
727 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
728 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000729
Renato Golin7c542b42015-07-27 23:44:45 +0000730 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
731 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
732 if (WaHDiv) {
733 if (HDivArg)
734 D.Diag(clang::diag::warn_drv_unused_argument)
735 << HDivArg->getAsString(Args);
736 getARMHWDivFeatures(D, WaHDiv, Args,
737 StringRef(WaHDiv->getValue()).substr(8), Features);
738 } else if (HDivArg)
739 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
740
741 // Check -march. ClangAs gives preference to -Wa,-march=.
742 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000743 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000744 if (WaArch) {
745 if (ArchArg)
746 D.Diag(clang::diag::warn_drv_unused_argument)
747 << ArchArg->getAsString(Args);
748 ArchName = StringRef(WaArch->getValue()).substr(7);
749 checkARMArchName(D, WaArch, Args, ArchName, Triple);
750 // FIXME: Set Arch.
751 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
752 } else if (ArchArg) {
753 ArchName = ArchArg->getValue();
754 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000755 }
756
Renato Golin7c542b42015-07-27 23:44:45 +0000757 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
758 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000759 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000760 if (WaCPU) {
761 if (CPUArg)
762 D.Diag(clang::diag::warn_drv_unused_argument)
763 << CPUArg->getAsString(Args);
764 CPUName = StringRef(WaCPU->getValue()).substr(6);
765 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
766 } else if (CPUArg) {
767 CPUName = CPUArg->getValue();
768 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000769 }
John Brawna95c1a82015-05-08 12:52:18 +0000770
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000771 // Setting -msoft-float effectively disables NEON because of the GCC
772 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000773 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000774 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000775 // Also need to explicitly disable features which imply NEON.
776 Features.push_back("-crypto");
777 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000778
Eric Christopher269c2a22015-04-04 03:34:43 +0000779 // En/disable crc code generation.
780 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000781 if (A->getOption().matches(options::OPT_mcrc))
782 Features.push_back("+crc");
783 else
784 Features.push_back("-crc");
785 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000786
787 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
788 Features.insert(Features.begin(), "+v8.1a");
789 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000790
Akira Hatanakac2694822015-07-07 08:28:42 +0000791 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
792 // neither options are specified, see if we are compiling for kernel/kext and
793 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000794 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
795 options::OPT_mno_long_calls)) {
796 if (A->getOption().matches(options::OPT_mlong_calls))
797 Features.push_back("+long-calls");
798 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
799 Features.push_back("+long-calls");
800 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000801
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000802 // Kernel code has more strict alignment requirements.
803 if (KernelOrKext)
804 Features.push_back("+strict-align");
805 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
806 options::OPT_munaligned_access)) {
807 if (A->getOption().matches(options::OPT_munaligned_access)) {
808 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
809 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
810 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
811 } else
812 Features.push_back("+strict-align");
813 } else {
814 // Assume pre-ARMv6 doesn't support unaligned accesses.
815 //
816 // ARMv6 may or may not support unaligned accesses depending on the
817 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
818 // Darwin and NetBSD targets support unaligned accesses, and others don't.
819 //
820 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
821 // which raises an alignment fault on unaligned accesses. Linux
822 // defaults this bit to 0 and handles it as a system-wide (not
823 // per-process) setting. It is therefore safe to assume that ARMv7+
824 // Linux targets support unaligned accesses. The same goes for NaCl.
825 //
826 // The above behavior is consistent with GCC.
827 int VersionNum = getARMSubArchVersionNumber(Triple);
828 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
829 if (VersionNum < 6)
830 Features.push_back("+strict-align");
831 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
832 if (VersionNum < 7)
833 Features.push_back("+strict-align");
834 } else
835 Features.push_back("+strict-align");
836 }
837
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000838 // llvm does not support reserving registers in general. There is support
839 // for reserving r9 on ARM though (defined as a platform-specific register
840 // in ARM EABI).
841 if (Args.hasArg(options::OPT_ffixed_r9))
842 Features.push_back("+reserve-r9");
843
Akira Hatanaka580efb22015-07-16 00:43:00 +0000844 // The kext linker doesn't know how to deal with movw/movt.
845 if (KernelOrKext)
846 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000847}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000848
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000849void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000850 bool KernelOrKext) const {
851 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000852 // Get the effective triple, which takes into account the deployment target.
853 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
854 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000855
856 // Select the ABI to use.
857 //
858 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000859 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000860 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000861 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000862 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000863 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000864 // The backend is hardwired to assume AAPCS for M-class processors, ensure
865 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000866 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000867 Triple.getOS() == llvm::Triple::UnknownOS || isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000868 ABIName = "aapcs";
869 } else {
870 ABIName = "apcs-gnu";
871 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000872 } else if (Triple.isOSWindows()) {
873 // FIXME: this is invalid for WindowsCE
874 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000875 } else {
876 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000877 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000878 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000879 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000880 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000881 ABIName = "aapcs-linux";
882 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000883 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000884 case llvm::Triple::EABI:
885 ABIName = "aapcs";
886 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000887 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000888 if (Triple.getOS() == llvm::Triple::NetBSD)
889 ABIName = "apcs-gnu";
890 else
891 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000892 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000893 }
894 }
895 CmdArgs.push_back("-target-abi");
896 CmdArgs.push_back(ABIName);
897
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000898 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000899 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000900 if (FloatABI == "soft") {
901 // Floating point operations and argument passing are soft.
902 //
903 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000904 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000905 CmdArgs.push_back("-mfloat-abi");
906 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000907 } else if (FloatABI == "softfp") {
908 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000909 CmdArgs.push_back("-mfloat-abi");
910 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000911 } else {
912 // Floating point operations and argument passing are hard.
913 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000914 CmdArgs.push_back("-mfloat-abi");
915 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000916 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000917
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000918 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000919 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
920 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000921 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000922 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000923 CmdArgs.push_back("-arm-global-merge=false");
924 else
925 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000926 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000927
Bob Wilson9c8af452013-04-11 18:53:25 +0000928 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000929 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000930 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000931}
Renato Goline17c5802015-07-27 23:44:42 +0000932// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000933
Tim Northover573cbee2014-05-24 12:52:07 +0000934/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
935/// targeting.
936static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000937 Arg *A;
938 std::string CPU;
939 // If we have -mtune or -mcpu, use that.
940 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000941 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000942 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000943 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000944 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000945 }
946
Kevin Qin110db6f2014-07-18 07:03:22 +0000947 // Handle CPU name is 'native'.
948 if (CPU == "native")
949 return llvm::sys::getHostCPUName();
950 else if (CPU.size())
951 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000952
James Molloy9b1586b2014-04-17 12:51:17 +0000953 // Make sure we pick "cyclone" if -arch is used.
954 // FIXME: Should this be picked by checking the target triple instead?
955 if (Args.getLastArg(options::OPT_arch))
956 return "cyclone";
957
958 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000959}
960
Tim Northover573cbee2014-05-24 12:52:07 +0000961void Clang::AddAArch64TargetArgs(const ArgList &Args,
962 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000963 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
964 llvm::Triple Triple(TripleStr);
965
966 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
967 Args.hasArg(options::OPT_mkernel) ||
968 Args.hasArg(options::OPT_fapple_kext))
969 CmdArgs.push_back("-disable-red-zone");
970
971 if (!Args.hasFlag(options::OPT_mimplicit_float,
972 options::OPT_mno_implicit_float, true))
973 CmdArgs.push_back("-no-implicit-float");
974
Craig Topper92fc2df2014-05-17 16:56:41 +0000975 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000976 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
977 ABIName = A->getValue();
978 else if (Triple.isOSDarwin())
979 ABIName = "darwinpcs";
980 else
981 ABIName = "aapcs";
982
983 CmdArgs.push_back("-target-abi");
984 CmdArgs.push_back(ABIName);
985
Bradley Smith9ff64332014-10-13 10:16:06 +0000986 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
987 options::OPT_mno_fix_cortex_a53_835769)) {
988 CmdArgs.push_back("-backend-option");
989 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
990 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
991 else
992 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000993 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
994 // Enabled A53 errata (835769) workaround by default on android
995 CmdArgs.push_back("-backend-option");
996 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000997 }
998
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000999 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001000 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1001 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001002 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001003 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001004 CmdArgs.push_back("-aarch64-global-merge=false");
1005 else
1006 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001007 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001008}
1009
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001010// Get CPU and ABI names. They are not independent
1011// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001012void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1013 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001014 const char *DefMips32CPU = "mips32r2";
1015 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001016
Daniel Sanders2bf13662014-07-10 14:40:57 +00001017 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1018 // default for mips64(el)?-img-linux-gnu.
1019 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1020 Triple.getEnvironment() == llvm::Triple::GNU) {
1021 DefMips32CPU = "mips32r6";
1022 DefMips64CPU = "mips64r6";
1023 }
Renato Golin7c542b42015-07-27 23:44:45 +00001024
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001025 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1026 if (Triple.getEnvironment() == llvm::Triple::Android)
1027 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001028
Brad Smithba26f582015-01-06 02:53:17 +00001029 // MIPS3 is the default for mips64*-unknown-openbsd.
1030 if (Triple.getOS() == llvm::Triple::OpenBSD)
1031 DefMips64CPU = "mips3";
1032
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001033 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001034 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001035
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001036 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001037 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001038 // Convert a GNU style Mips ABI name to the name
1039 // accepted by LLVM Mips backend.
1040 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001041 .Case("32", "o32")
1042 .Case("64", "n64")
1043 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001044 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001045
1046 // Setup default CPU and ABI names.
1047 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001048 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001049 default:
1050 llvm_unreachable("Unexpected triple arch name");
1051 case llvm::Triple::mips:
1052 case llvm::Triple::mipsel:
1053 CPUName = DefMips32CPU;
1054 break;
1055 case llvm::Triple::mips64:
1056 case llvm::Triple::mips64el:
1057 CPUName = DefMips64CPU;
1058 break;
1059 }
1060 }
1061
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001062 if (ABIName.empty()) {
1063 // Deduce ABI name from the target triple.
1064 if (Triple.getArch() == llvm::Triple::mips ||
1065 Triple.getArch() == llvm::Triple::mipsel)
1066 ABIName = "o32";
1067 else
1068 ABIName = "n64";
1069 }
1070
1071 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001072 // Deduce CPU name from ABI name.
1073 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001074 .Cases("o32", "eabi", DefMips32CPU)
1075 .Cases("n32", "n64", DefMips64CPU)
1076 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001077 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001078
1079 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001080}
1081
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001082// Convert ABI name to the GNU tools acceptable variant.
1083static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1084 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001085 .Case("o32", "32")
1086 .Case("n64", "64")
1087 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001088}
1089
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001090// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1091// and -mfloat-abi=.
1092static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001093 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001094 if (Arg *A =
1095 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1096 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001097 if (A->getOption().matches(options::OPT_msoft_float))
1098 FloatABI = "soft";
1099 else if (A->getOption().matches(options::OPT_mhard_float))
1100 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001101 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001102 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001103 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001104 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001105 FloatABI = "hard";
1106 }
1107 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001108 }
1109
1110 // If unspecified, choose the default based on the platform.
1111 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001112 // Assume "hard", because it's a default value used by gcc.
1113 // When we start to recognize specific target MIPS processors,
1114 // we will be able to select the default more correctly.
1115 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001116 }
1117
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001118 return FloatABI;
1119}
1120
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001121static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001122 std::vector<const char *> &Features,
1123 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001124 StringRef FeatureName) {
1125 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001126 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001127 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001128 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001129 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130 }
1131}
1132
Daniel Sanders379d44b2014-07-16 11:52:23 +00001133static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1134 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001135 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001136 StringRef CPUName;
1137 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001138 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001139 ABIName = getGnuCompatibleMipsABIName(ABIName);
1140
Daniel Sandersfeb61302014-08-08 15:47:17 +00001141 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1142 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001143
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001144 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001145 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001146 // FIXME: Note, this is a hack. We need to pass the selected float
1147 // mode to the MipsTargetInfoBase to define appropriate macros there.
1148 // Now it is the only method.
1149 Features.push_back("+soft-float");
1150 }
1151
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001152 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001153 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001154 if (Val == "2008") {
1155 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1156 Features.push_back("+nan2008");
1157 else {
1158 Features.push_back("-nan2008");
1159 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1160 }
1161 } else if (Val == "legacy") {
1162 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1163 Features.push_back("-nan2008");
1164 else {
1165 Features.push_back("+nan2008");
1166 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1167 }
1168 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001169 D.Diag(diag::err_drv_unsupported_option_argument)
1170 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001171 }
1172
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001173 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1174 options::OPT_mdouble_float, "single-float");
1175 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1176 "mips16");
1177 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1178 options::OPT_mno_micromips, "micromips");
1179 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1180 "dsp");
1181 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1182 "dspr2");
1183 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1184 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001185
1186 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1187 // pass -mfpxx
1188 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1189 options::OPT_mfp64)) {
1190 if (A->getOption().matches(options::OPT_mfp32))
1191 Features.push_back(Args.MakeArgString("-fp64"));
1192 else if (A->getOption().matches(options::OPT_mfpxx)) {
1193 Features.push_back(Args.MakeArgString("+fpxx"));
1194 Features.push_back(Args.MakeArgString("+nooddspreg"));
1195 } else
1196 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001197 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001198 Features.push_back(Args.MakeArgString("+fpxx"));
1199 Features.push_back(Args.MakeArgString("+nooddspreg"));
1200 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001201
Daniel Sanders28e5d392014-07-10 10:39:51 +00001202 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1203 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001204}
1205
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001207 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208 const Driver &D = getToolChain().getDriver();
1209 StringRef CPUName;
1210 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001211 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001212 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001213
1214 CmdArgs.push_back("-target-abi");
1215 CmdArgs.push_back(ABIName.data());
1216
1217 StringRef FloatABI = getMipsFloatABI(D, Args);
1218
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001219 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001220 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001221 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001222 CmdArgs.push_back("-mfloat-abi");
1223 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001224 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001225 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001226 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001227 CmdArgs.push_back("-mfloat-abi");
1228 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001229 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001230
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001231 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1232 if (A->getOption().matches(options::OPT_mxgot)) {
1233 CmdArgs.push_back("-mllvm");
1234 CmdArgs.push_back("-mxgot");
1235 }
1236 }
1237
Simon Atanasyanc580b322013-05-11 06:33:44 +00001238 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1239 options::OPT_mno_ldc1_sdc1)) {
1240 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1241 CmdArgs.push_back("-mllvm");
1242 CmdArgs.push_back("-mno-ldc1-sdc1");
1243 }
1244 }
1245
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001246 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1247 options::OPT_mno_check_zero_division)) {
1248 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1249 CmdArgs.push_back("-mllvm");
1250 CmdArgs.push_back("-mno-check-zero-division");
1251 }
1252 }
1253
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001254 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001255 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001256 CmdArgs.push_back("-mllvm");
1257 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1258 A->claim();
1259 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001260}
1261
Hal Finkel8eb59282012-06-11 22:35:19 +00001262/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1263static std::string getPPCTargetCPU(const ArgList &Args) {
1264 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001265 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001266
1267 if (CPUName == "native") {
1268 std::string CPU = llvm::sys::getHostCPUName();
1269 if (!CPU.empty() && CPU != "generic")
1270 return CPU;
1271 else
1272 return "";
1273 }
1274
1275 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001276 .Case("common", "generic")
1277 .Case("440", "440")
1278 .Case("440fp", "440")
1279 .Case("450", "450")
1280 .Case("601", "601")
1281 .Case("602", "602")
1282 .Case("603", "603")
1283 .Case("603e", "603e")
1284 .Case("603ev", "603ev")
1285 .Case("604", "604")
1286 .Case("604e", "604e")
1287 .Case("620", "620")
1288 .Case("630", "pwr3")
1289 .Case("G3", "g3")
1290 .Case("7400", "7400")
1291 .Case("G4", "g4")
1292 .Case("7450", "7450")
1293 .Case("G4+", "g4+")
1294 .Case("750", "750")
1295 .Case("970", "970")
1296 .Case("G5", "g5")
1297 .Case("a2", "a2")
1298 .Case("a2q", "a2q")
1299 .Case("e500mc", "e500mc")
1300 .Case("e5500", "e5500")
1301 .Case("power3", "pwr3")
1302 .Case("power4", "pwr4")
1303 .Case("power5", "pwr5")
1304 .Case("power5x", "pwr5x")
1305 .Case("power6", "pwr6")
1306 .Case("power6x", "pwr6x")
1307 .Case("power7", "pwr7")
1308 .Case("power8", "pwr8")
1309 .Case("pwr3", "pwr3")
1310 .Case("pwr4", "pwr4")
1311 .Case("pwr5", "pwr5")
1312 .Case("pwr5x", "pwr5x")
1313 .Case("pwr6", "pwr6")
1314 .Case("pwr6x", "pwr6x")
1315 .Case("pwr7", "pwr7")
1316 .Case("pwr8", "pwr8")
1317 .Case("powerpc", "ppc")
1318 .Case("powerpc64", "ppc64")
1319 .Case("powerpc64le", "ppc64le")
1320 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001321 }
1322
1323 return "";
1324}
1325
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001326static void getPPCTargetFeatures(const ArgList &Args,
1327 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001328 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1329 StringRef Name = A->getOption().getName();
1330 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001331
1332 // Skip over "-m".
1333 assert(Name.startswith("m") && "Invalid feature name.");
1334 Name = Name.substr(1);
1335
1336 bool IsNegative = Name.startswith("no-");
1337 if (IsNegative)
1338 Name = Name.substr(3);
1339
1340 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1341 // pass the correct option to the backend while calling the frontend
1342 // option the same.
1343 // TODO: Change the LLVM backend option maybe?
1344 if (Name == "mfcrf")
1345 Name = "mfocrf";
1346
1347 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1348 }
1349
1350 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001351 AddTargetFeature(Args, Features, options::OPT_faltivec,
1352 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001353}
1354
Ulrich Weigand8afad612014-07-28 13:17:52 +00001355void Clang::AddPPCTargetArgs(const ArgList &Args,
1356 ArgStringList &CmdArgs) const {
1357 // Select the ABI to use.
1358 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001359 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001360 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001361 case llvm::Triple::ppc64: {
1362 // When targeting a processor that supports QPX, or if QPX is
1363 // specifically enabled, default to using the ABI that supports QPX (so
1364 // long as it is not specifically disabled).
1365 bool HasQPX = false;
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1367 HasQPX = A->getValue() == StringRef("a2q");
1368 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1369 if (HasQPX) {
1370 ABIName = "elfv1-qpx";
1371 break;
1372 }
1373
Ulrich Weigand8afad612014-07-28 13:17:52 +00001374 ABIName = "elfv1";
1375 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001376 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001377 case llvm::Triple::ppc64le:
1378 ABIName = "elfv2";
1379 break;
1380 default:
1381 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001382 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001383
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001384 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1385 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1386 // the option if given as we don't have backend support for any targets
1387 // that don't use the altivec abi.
1388 if (StringRef(A->getValue()) != "altivec")
1389 ABIName = A->getValue();
1390
Ulrich Weigand8afad612014-07-28 13:17:52 +00001391 if (ABIName) {
1392 CmdArgs.push_back("-target-abi");
1393 CmdArgs.push_back(ABIName);
1394 }
1395}
1396
1397bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1398 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1399 return A && (A->getValue() == StringRef(Value));
1400}
1401
Tom Stellard6674c702013-04-01 20:56:53 +00001402/// Get the (LLVM) name of the R600 gpu we are targeting.
1403static std::string getR600TargetGPU(const ArgList &Args) {
1404 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001405 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001406 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001407 .Cases("rv630", "rv635", "r600")
1408 .Cases("rv610", "rv620", "rs780", "rs880")
1409 .Case("rv740", "rv770")
1410 .Case("palm", "cedar")
1411 .Cases("sumo", "sumo2", "sumo")
1412 .Case("hemlock", "cypress")
1413 .Case("aruba", "cayman")
1414 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001415 }
1416 return "";
1417}
1418
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001419void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001420 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001421 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001422 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001423
James Y Knightb2406522015-06-15 20:51:24 +00001424 bool SoftFloatABI = false;
1425 if (Arg *A =
1426 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001427 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001428 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429 }
1430
James Y Knightb2406522015-06-15 20:51:24 +00001431 // Only the hard-float ABI on Sparc is standardized, and it is the
1432 // default. GCC also supports a nonstandard soft-float ABI mode, and
1433 // perhaps LLVM should implement that, too. However, since llvm
1434 // currently does not support Sparc soft-float, at all, display an
1435 // error if it's requested.
1436 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001437 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1438 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001439 }
1440}
1441
Richard Sandiford4652d892013-07-19 16:51:51 +00001442static const char *getSystemZTargetCPU(const ArgList &Args) {
1443 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1444 return A->getValue();
1445 return "z10";
1446}
1447
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001448static void getSystemZTargetFeatures(const ArgList &Args,
1449 std::vector<const char *> &Features) {
1450 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001451 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001452 if (A->getOption().matches(options::OPT_mhtm))
1453 Features.push_back("+transactional-execution");
1454 else
1455 Features.push_back("-transactional-execution");
1456 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001457 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001458 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001459 if (A->getOption().matches(options::OPT_mvx))
1460 Features.push_back("+vector");
1461 else
1462 Features.push_back("-vector");
1463 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001464}
1465
Chandler Carruth953fb082013-01-13 11:46:33 +00001466static const char *getX86TargetCPU(const ArgList &Args,
1467 const llvm::Triple &Triple) {
1468 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001469 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001470 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001471 return "core-avx2";
1472
Chandler Carruth953fb082013-01-13 11:46:33 +00001473 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001474 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001475
1476 // FIXME: Reject attempts to use -march=native unless the target matches
1477 // the host.
1478 //
1479 // FIXME: We should also incorporate the detected target features for use
1480 // with -native.
1481 std::string CPU = llvm::sys::getHostCPUName();
1482 if (!CPU.empty() && CPU != "generic")
1483 return Args.MakeArgString(CPU);
1484 }
1485
Reid Kleckner3123eff2015-06-30 16:32:04 +00001486 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1487 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1488 StringRef Arch = A->getValue();
1489 const char *CPU;
1490 if (Triple.getArch() == llvm::Triple::x86) {
1491 CPU = llvm::StringSwitch<const char *>(Arch)
1492 .Case("IA32", "i386")
1493 .Case("SSE", "pentium3")
1494 .Case("SSE2", "pentium4")
1495 .Case("AVX", "sandybridge")
1496 .Case("AVX2", "haswell")
1497 .Default(nullptr);
1498 } else {
1499 CPU = llvm::StringSwitch<const char *>(Arch)
1500 .Case("AVX", "sandybridge")
1501 .Case("AVX2", "haswell")
1502 .Default(nullptr);
1503 }
1504 if (CPU)
1505 return CPU;
1506 }
1507
Chandler Carruth953fb082013-01-13 11:46:33 +00001508 // Select the default CPU if none was given (or detection failed).
1509
1510 if (Triple.getArch() != llvm::Triple::x86_64 &&
1511 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001512 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001513
1514 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1515
1516 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001517 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001518 if (Triple.getArchName() == "x86_64h")
1519 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001520 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001521 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001522
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001523 // Set up default CPU name for PS4 compilers.
1524 if (Triple.isPS4CPU())
1525 return "btver2";
1526
Alexey Bataev286d1b92014-01-31 04:07:13 +00001527 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001528 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001529 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001530
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001531 // Everything else goes to x86-64 in 64-bit mode.
1532 if (Is64Bit)
1533 return "x86-64";
1534
1535 switch (Triple.getOS()) {
1536 case llvm::Triple::FreeBSD:
1537 case llvm::Triple::NetBSD:
1538 case llvm::Triple::OpenBSD:
1539 return "i486";
1540 case llvm::Triple::Haiku:
1541 return "i586";
1542 case llvm::Triple::Bitrig:
1543 return "i686";
1544 default:
1545 // Fallback to p4.
1546 return "pentium4";
1547 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001548}
1549
Renato Golin7c542b42015-07-27 23:44:45 +00001550static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1551 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001552 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001553 default:
1554 return "";
1555
Amara Emerson703da2e2013-10-31 09:32:33 +00001556 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001557 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001558 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001559
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001560 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001561 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001562 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001563 case llvm::Triple::thumbeb: {
1564 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001565 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001566 return arm::getARMTargetCPU(MCPU, MArch, T);
1567 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001568 case llvm::Triple::mips:
1569 case llvm::Triple::mipsel:
1570 case llvm::Triple::mips64:
1571 case llvm::Triple::mips64el: {
1572 StringRef CPUName;
1573 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001574 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001575 return CPUName;
1576 }
1577
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001578 case llvm::Triple::nvptx:
1579 case llvm::Triple::nvptx64:
1580 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1581 return A->getValue();
1582 return "";
1583
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001584 case llvm::Triple::ppc:
1585 case llvm::Triple::ppc64:
1586 case llvm::Triple::ppc64le: {
1587 std::string TargetCPUName = getPPCTargetCPU(Args);
1588 // LLVM may default to generating code for the native CPU,
1589 // but, like gcc, we default to a more generic option for
1590 // each architecture. (except on Darwin)
1591 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1592 if (T.getArch() == llvm::Triple::ppc64)
1593 TargetCPUName = "ppc64";
1594 else if (T.getArch() == llvm::Triple::ppc64le)
1595 TargetCPUName = "ppc64le";
1596 else
1597 TargetCPUName = "ppc";
1598 }
1599 return TargetCPUName;
1600 }
1601
1602 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001603 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001604 case llvm::Triple::sparcv9:
1605 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001606 return A->getValue();
1607 return "";
1608
1609 case llvm::Triple::x86:
1610 case llvm::Triple::x86_64:
1611 return getX86TargetCPU(Args, T);
1612
1613 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001614 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001615
1616 case llvm::Triple::systemz:
1617 return getSystemZTargetCPU(Args);
1618
1619 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001620 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001621 return getR600TargetGPU(Args);
1622 }
1623}
1624
Alp Tokerce365ca2013-12-02 12:43:03 +00001625static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1626 ArgStringList &CmdArgs) {
1627 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1628 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1629 // forward.
1630 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001631 std::string Plugin =
1632 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001633 CmdArgs.push_back(Args.MakeArgString(Plugin));
1634
1635 // Try to pass driver level flags relevant to LTO code generation down to
1636 // the plugin.
1637
1638 // Handle flags for selecting CPU variants.
1639 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1640 if (!CPU.empty())
1641 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1642}
1643
Sanjay Patel2987c292015-06-11 14:53:41 +00001644/// This is a helper function for validating the optional refinement step
1645/// parameter in reciprocal argument strings. Return false if there is an error
1646/// parsing the refinement step. Otherwise, return true and set the Position
1647/// of the refinement step in the input string.
1648static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001649 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001650 const char RefinementStepToken = ':';
1651 Position = In.find(RefinementStepToken);
1652 if (Position != StringRef::npos) {
1653 StringRef Option = A.getOption().getName();
1654 StringRef RefStep = In.substr(Position + 1);
1655 // Allow exactly one numeric character for the additional refinement
1656 // step parameter. This is reasonable for all currently-supported
1657 // operations and architectures because we would expect that a larger value
1658 // of refinement steps would cause the estimate "optimization" to
1659 // under-perform the native operation. Also, if the estimate does not
1660 // converge quickly, it probably will not ever converge, so further
1661 // refinement steps will not produce a better answer.
1662 if (RefStep.size() != 1) {
1663 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1664 return false;
1665 }
1666 char RefStepChar = RefStep[0];
1667 if (RefStepChar < '0' || RefStepChar > '9') {
1668 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1669 return false;
1670 }
1671 }
1672 return true;
1673}
1674
1675/// The -mrecip flag requires processing of many optional parameters.
1676static void ParseMRecip(const Driver &D, const ArgList &Args,
1677 ArgStringList &OutStrings) {
1678 StringRef DisabledPrefixIn = "!";
1679 StringRef DisabledPrefixOut = "!";
1680 StringRef EnabledPrefixOut = "";
1681 StringRef Out = "-mrecip=";
1682
1683 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1684 if (!A)
1685 return;
1686
1687 unsigned NumOptions = A->getNumValues();
1688 if (NumOptions == 0) {
1689 // No option is the same as "all".
1690 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1691 return;
1692 }
1693
1694 // Pass through "all", "none", or "default" with an optional refinement step.
1695 if (NumOptions == 1) {
1696 StringRef Val = A->getValue(0);
1697 size_t RefStepLoc;
1698 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1699 return;
1700 StringRef ValBase = Val.slice(0, RefStepLoc);
1701 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1702 OutStrings.push_back(Args.MakeArgString(Out + Val));
1703 return;
1704 }
1705 }
1706
1707 // Each reciprocal type may be enabled or disabled individually.
1708 // Check each input value for validity, concatenate them all back together,
1709 // and pass through.
1710
1711 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001712 OptionStrings.insert(std::make_pair("divd", false));
1713 OptionStrings.insert(std::make_pair("divf", false));
1714 OptionStrings.insert(std::make_pair("vec-divd", false));
1715 OptionStrings.insert(std::make_pair("vec-divf", false));
1716 OptionStrings.insert(std::make_pair("sqrtd", false));
1717 OptionStrings.insert(std::make_pair("sqrtf", false));
1718 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1719 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001720
1721 for (unsigned i = 0; i != NumOptions; ++i) {
1722 StringRef Val = A->getValue(i);
1723
1724 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1725 // Ignore the disablement token for string matching.
1726 if (IsDisabled)
1727 Val = Val.substr(1);
1728
1729 size_t RefStep;
1730 if (!getRefinementStep(Val, D, *A, RefStep))
1731 return;
1732
1733 StringRef ValBase = Val.slice(0, RefStep);
1734 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1735 if (OptionIter == OptionStrings.end()) {
1736 // Try again specifying float suffix.
1737 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1738 if (OptionIter == OptionStrings.end()) {
1739 // The input name did not match any known option string.
1740 D.Diag(diag::err_drv_unknown_argument) << Val;
1741 return;
1742 }
1743 // The option was specified without a float or double suffix.
1744 // Make sure that the double entry was not already specified.
1745 // The float entry will be checked below.
1746 if (OptionStrings[ValBase.str() + 'd']) {
1747 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1748 return;
1749 }
1750 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001751
Sanjay Patel2987c292015-06-11 14:53:41 +00001752 if (OptionIter->second == true) {
1753 // Duplicate option specified.
1754 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1755 return;
1756 }
1757
1758 // Mark the matched option as found. Do not allow duplicate specifiers.
1759 OptionIter->second = true;
1760
1761 // If the precision was not specified, also mark the double entry as found.
1762 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1763 OptionStrings[ValBase.str() + 'd'] = true;
1764
1765 // Build the output string.
1766 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1767 Out = Args.MakeArgString(Out + Prefix + Val);
1768 if (i != NumOptions - 1)
1769 Out = Args.MakeArgString(Out + ",");
1770 }
1771
1772 OutStrings.push_back(Args.MakeArgString(Out));
1773}
1774
Eric Christopherc54920a2015-03-23 19:26:05 +00001775static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001776 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001777 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001778 // If -march=native, autodetect the feature list.
1779 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1780 if (StringRef(A->getValue()) == "native") {
1781 llvm::StringMap<bool> HostFeatures;
1782 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1783 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001784 Features.push_back(
1785 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001786 }
1787 }
1788
Jim Grosbach82eee262013-11-16 00:53:35 +00001789 if (Triple.getArchName() == "x86_64h") {
1790 // x86_64h implies quite a few of the more modern subtarget features
1791 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1792 Features.push_back("-rdrnd");
1793 Features.push_back("-aes");
1794 Features.push_back("-pclmul");
1795 Features.push_back("-rtm");
1796 Features.push_back("-hle");
1797 Features.push_back("-fsgsbase");
1798 }
1799
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001800 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001801 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001802 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001803 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001804 Features.push_back("+sse4.2");
1805 Features.push_back("+popcnt");
1806 } else
1807 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001808 }
1809
Eric Christopherc54920a2015-03-23 19:26:05 +00001810 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001811 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1812 StringRef Arch = A->getValue();
1813 bool ArchUsed = false;
1814 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001815 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001816 if (Arch == "AVX" || Arch == "AVX2") {
1817 ArchUsed = true;
1818 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1819 }
1820 }
1821 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001822 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001823 if (Arch == "IA32") {
1824 ArchUsed = true;
1825 } else if (Arch == "SSE" || Arch == "SSE2") {
1826 ArchUsed = true;
1827 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1828 }
1829 }
1830 if (!ArchUsed)
1831 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1832 }
1833
Jim Grosbach82eee262013-11-16 00:53:35 +00001834 // Now add any that the user explicitly requested on the command line,
1835 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001836 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1837 StringRef Name = A->getOption().getName();
1838 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001839
1840 // Skip over "-m".
1841 assert(Name.startswith("m") && "Invalid feature name.");
1842 Name = Name.substr(1);
1843
1844 bool IsNegative = Name.startswith("no-");
1845 if (IsNegative)
1846 Name = Name.substr(3);
1847
1848 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1849 }
1850}
1851
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001852void Clang::AddX86TargetArgs(const ArgList &Args,
1853 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001854 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001855 Args.hasArg(options::OPT_mkernel) ||
1856 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001857 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001858
Bob Wilson2616e2e2013-02-10 16:01:41 +00001859 // Default to avoid implicit floating-point for kernel/kext code, but allow
1860 // that to be overridden with -mno-soft-float.
1861 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1862 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001863 if (Arg *A = Args.getLastArg(
1864 options::OPT_msoft_float, options::OPT_mno_soft_float,
1865 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001866 const Option &O = A->getOption();
1867 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1868 O.matches(options::OPT_msoft_float));
1869 }
1870 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001871 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001872
1873 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1874 StringRef Value = A->getValue();
1875 if (Value == "intel" || Value == "att") {
1876 CmdArgs.push_back("-mllvm");
1877 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1878 } else {
1879 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1880 << A->getOption().getName() << Value;
1881 }
1882 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001883}
1884
Tony Linthicum76329bf2011-12-12 21:14:55 +00001885void Clang::AddHexagonTargetArgs(const ArgList &Args,
1886 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001887 CmdArgs.push_back("-mqdsp6-compat");
1888 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001889
Douglas Katzman54366072015-07-27 16:53:08 +00001890 if (const char *v =
1891 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001892 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001893 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001895 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001896 }
1897
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001898 if (!Args.hasArg(options::OPT_fno_short_enums))
1899 CmdArgs.push_back("-fshort-enums");
1900 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 CmdArgs.push_back("-mllvm");
1902 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001903 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001904 CmdArgs.push_back("-mllvm");
1905 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001906}
1907
Kevin Qin110db6f2014-07-18 07:03:22 +00001908// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001909static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001910 std::vector<const char *> &Features) {
1911 SmallVector<StringRef, 8> Split;
1912 text.split(Split, StringRef("+"), -1, false);
1913
Douglas Katzman2675d012015-06-29 19:12:56 +00001914 for (const StringRef Feature : Split) {
1915 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001916 .Case("fp", "+fp-armv8")
1917 .Case("simd", "+neon")
1918 .Case("crc", "+crc")
1919 .Case("crypto", "+crypto")
1920 .Case("nofp", "-fp-armv8")
1921 .Case("nosimd", "-neon")
1922 .Case("nocrc", "-crc")
1923 .Case("nocrypto", "-crypto")
1924 .Default(nullptr);
1925 if (result)
1926 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001927 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001928 D.Diag(diag::err_drv_no_neon_modifier);
1929 else
1930 return false;
1931 }
1932 return true;
1933}
1934
1935// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1936// decode CPU and feature.
1937static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1938 std::vector<const char *> &Features) {
1939 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1940 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001941 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1942 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001943 Features.push_back("+neon");
1944 Features.push_back("+crc");
1945 Features.push_back("+crypto");
1946 } else if (CPU == "generic") {
1947 Features.push_back("+neon");
1948 } else {
1949 return false;
1950 }
1951
1952 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1953 return false;
1954
1955 return true;
1956}
1957
1958static bool
1959getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1960 const ArgList &Args,
1961 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001962 std::string MarchLowerCase = March.lower();
1963 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001964
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001965 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001966 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001967 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001968 Features.push_back("+v8.1a");
1969 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001970 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001971 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001972
1973 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1974 return false;
1975
1976 return true;
1977}
1978
1979static bool
1980getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1981 const ArgList &Args,
1982 std::vector<const char *> &Features) {
1983 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001984 std::string McpuLowerCase = Mcpu.lower();
1985 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001986 return false;
1987
1988 return true;
1989}
1990
1991static bool
1992getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1993 const ArgList &Args,
1994 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001995 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001996 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001997 if (MtuneLowerCase == "native")
1998 MtuneLowerCase = llvm::sys::getHostCPUName();
1999 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002000 Features.push_back("+zcm");
2001 Features.push_back("+zcz");
2002 }
2003 return true;
2004}
2005
2006static bool
2007getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2008 const ArgList &Args,
2009 std::vector<const char *> &Features) {
2010 StringRef CPU;
2011 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002012 std::string McpuLowerCase = Mcpu.lower();
2013 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002014 return false;
2015
2016 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2017}
2018
Akira Hatanaka92500472015-07-27 19:29:04 +00002019static void getAArch64TargetFeatures(const Driver &D,
2020 const llvm::Triple &Triple,
2021 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002022 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002023 Arg *A;
2024 bool success = true;
2025 // Enable NEON by default.
2026 Features.push_back("+neon");
2027 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2028 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2029 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2030 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002031 else if (Args.hasArg(options::OPT_arch))
2032 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2033 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002034
2035 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2036 success =
2037 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2038 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2039 success =
2040 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002041 else if (Args.hasArg(options::OPT_arch))
2042 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2043 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002044
2045 if (!success)
2046 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002047
2048 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2049 Features.push_back("-fp-armv8");
2050 Features.push_back("-crypto");
2051 Features.push_back("-neon");
2052 }
Bradley Smith418c5932014-05-02 15:17:51 +00002053
2054 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002055 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002056 if (A->getOption().matches(options::OPT_mcrc))
2057 Features.push_back("+crc");
2058 else
2059 Features.push_back("-crc");
2060 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002061
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002062 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2063 options::OPT_munaligned_access))
2064 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2065 Features.push_back("+strict-align");
2066
Akira Hatanaka92500472015-07-27 19:29:04 +00002067 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002068 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002069}
2070
2071static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002072 const ArgList &Args, ArgStringList &CmdArgs,
2073 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002074 std::vector<const char *> Features;
2075 switch (Triple.getArch()) {
2076 default:
2077 break;
2078 case llvm::Triple::mips:
2079 case llvm::Triple::mipsel:
2080 case llvm::Triple::mips64:
2081 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002082 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002083 break;
2084
2085 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002086 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002087 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002088 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002089 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002090 break;
2091
2092 case llvm::Triple::ppc:
2093 case llvm::Triple::ppc64:
2094 case llvm::Triple::ppc64le:
2095 getPPCTargetFeatures(Args, Features);
2096 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002097 case llvm::Triple::systemz:
2098 getSystemZTargetFeatures(Args, Features);
2099 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002100 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002101 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002102 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002103 break;
2104 case llvm::Triple::x86:
2105 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002106 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002107 break;
2108 }
Rafael Espindola43964802013-08-21 17:34:32 +00002109
2110 // Find the last of each feature.
2111 llvm::StringMap<unsigned> LastOpt;
2112 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2113 const char *Name = Features[I];
2114 assert(Name[0] == '-' || Name[0] == '+');
2115 LastOpt[Name + 1] = I;
2116 }
2117
2118 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2119 // If this feature was overridden, ignore it.
2120 const char *Name = Features[I];
2121 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2122 assert(LastI != LastOpt.end());
2123 unsigned Last = LastI->second;
2124 if (Last != I)
2125 continue;
2126
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002127 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002128 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002129 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002130}
2131
David Majnemerae394812014-12-09 00:12:30 +00002132static bool
2133shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2134 const llvm::Triple &Triple) {
2135 // We use the zero-cost exception tables for Objective-C if the non-fragile
2136 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2137 // later.
2138 if (runtime.isNonFragile())
2139 return true;
2140
2141 if (!Triple.isMacOSX())
2142 return false;
2143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002144 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002145 (Triple.getArch() == llvm::Triple::x86_64 ||
2146 Triple.getArch() == llvm::Triple::arm));
2147}
2148
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002149/// Adds exception related arguments to the driver command arguments. There's a
2150/// master flag, -fexceptions and also language specific flags to enable/disable
2151/// C++ and Objective-C exceptions. This makes it possible to for example
2152/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002153static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002154 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002155 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002156 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002157 const Driver &D = TC.getDriver();
2158 const llvm::Triple &Triple = TC.getTriple();
2159
Chad Rosier4fab82c2012-03-26 22:04:46 +00002160 if (KernelOrKext) {
2161 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2162 // arguments now to avoid warnings about unused arguments.
2163 Args.ClaimAllArgs(options::OPT_fexceptions);
2164 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2165 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2166 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2167 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2168 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002169 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002170 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002171
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002172 // See if the user explicitly enabled exceptions.
2173 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2174 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002175
David Majnemerae394812014-12-09 00:12:30 +00002176 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2177 // is not necessarily sensible, but follows GCC.
2178 if (types::isObjC(InputType) &&
2179 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002180 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002181 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002182
David Majnemerae394812014-12-09 00:12:30 +00002183 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002184 }
2185
2186 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002187 // Disable C++ EH by default on XCore, PS4, and MSVC.
2188 // FIXME: Remove MSVC from this list once things work.
2189 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2190 !Triple.isPS4CPU() &&
2191 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002192 Arg *ExceptionArg = Args.getLastArg(
2193 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2194 options::OPT_fexceptions, options::OPT_fno_exceptions);
2195 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002196 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002197 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2198 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002199
2200 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002201 if (Triple.isPS4CPU()) {
2202 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2203 assert(ExceptionArg &&
2204 "On the PS4 exceptions should only be enabled if passing "
2205 "an argument");
2206 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2207 const Arg *RTTIArg = TC.getRTTIArg();
2208 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2209 D.Diag(diag::err_drv_argument_not_allowed_with)
2210 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2211 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2212 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2213 } else
2214 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2215
Anders Carlssone96ab552011-02-28 02:27:16 +00002216 CmdArgs.push_back("-fcxx-exceptions");
2217
David Majnemer8de68642014-12-05 08:11:58 +00002218 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002219 }
2220 }
2221
David Majnemer8de68642014-12-05 08:11:58 +00002222 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002223 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002224}
2225
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002226static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002227 bool Default = true;
2228 if (TC.getTriple().isOSDarwin()) {
2229 // The native darwin assembler doesn't support the linker_option directives,
2230 // so we disable them if we think the .s file will be passed to it.
2231 Default = TC.useIntegratedAs();
2232 }
2233 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2234 Default);
2235}
2236
Ted Kremenek62093662013-03-12 17:02:12 +00002237static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2238 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002239 bool UseDwarfDirectory =
2240 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2241 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002242 return !UseDwarfDirectory;
2243}
2244
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002245/// \brief Check whether the given input tree contains any compilation actions.
2246static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002247 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002248 return true;
2249
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002250 for (const auto &Act : *A)
2251 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002252 return true;
2253
2254 return false;
2255}
2256
2257/// \brief Check if -relax-all should be passed to the internal assembler.
2258/// This is done by default when compiling non-assembler source with -O0.
2259static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2260 bool RelaxDefault = true;
2261
2262 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2263 RelaxDefault = A->getOption().matches(options::OPT_O0);
2264
2265 if (RelaxDefault) {
2266 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002267 for (const auto &Act : C.getActions()) {
2268 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002269 RelaxDefault = true;
2270 break;
2271 }
2272 }
2273 }
2274
2275 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002276 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002277}
2278
David Blaikie9260ed62013-07-25 21:19:01 +00002279static void CollectArgsForIntegratedAssembler(Compilation &C,
2280 const ArgList &Args,
2281 ArgStringList &CmdArgs,
2282 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002283 if (UseRelaxAll(C, Args))
2284 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286 // When passing -I arguments to the assembler we sometimes need to
2287 // unconditionally take the next argument. For example, when parsing
2288 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2289 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2290 // arg after parsing the '-I' arg.
2291 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002292
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002293 // When using an integrated assembler, translate -Wa, and -Xassembler
2294 // options.
2295 bool CompressDebugSections = false;
2296 for (const Arg *A :
2297 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2298 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002299
Renato Golin7c542b42015-07-27 23:44:45 +00002300 for (const StringRef Value : A->getValues()) {
2301 if (TakeNextArg) {
2302 CmdArgs.push_back(Value.data());
2303 TakeNextArg = false;
2304 continue;
2305 }
David Blaikie9260ed62013-07-25 21:19:01 +00002306
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002307 if (Value == "-force_cpusubtype_ALL") {
2308 // Do nothing, this is the default and we don't support anything else.
2309 } else if (Value == "-L") {
2310 CmdArgs.push_back("-msave-temp-labels");
2311 } else if (Value == "--fatal-warnings") {
2312 CmdArgs.push_back("-massembler-fatal-warnings");
2313 } else if (Value == "--noexecstack") {
2314 CmdArgs.push_back("-mnoexecstack");
2315 } else if (Value == "-compress-debug-sections" ||
2316 Value == "--compress-debug-sections") {
2317 CompressDebugSections = true;
2318 } else if (Value == "-nocompress-debug-sections" ||
2319 Value == "--nocompress-debug-sections") {
2320 CompressDebugSections = false;
2321 } else if (Value.startswith("-I")) {
2322 CmdArgs.push_back(Value.data());
2323 // We need to consume the next argument if the current arg is a plain
2324 // -I. The next arg will be the include directory.
2325 if (Value == "-I")
2326 TakeNextArg = true;
2327 } else if (Value.startswith("-gdwarf-")) {
2328 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002329 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2330 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2331 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002332 } else {
2333 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002334 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002335 }
2336 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002337 }
2338 if (CompressDebugSections) {
2339 if (llvm::zlib::isAvailable())
2340 CmdArgs.push_back("-compress-debug-sections");
2341 else
2342 D.Diag(diag::warn_debug_compression_unavailable);
2343 }
David Blaikie9260ed62013-07-25 21:19:01 +00002344}
2345
Renato Goline807c122014-01-31 11:47:28 +00002346// Until ARM libraries are build separately, we have them all in one library
2347static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002348 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002349 TC.getArch() == llvm::Triple::x86)
2350 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002351 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002352 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002353 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002354}
2355
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002356static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2357 // The runtimes are located in the OS-specific resource directory.
2358 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002359 const llvm::Triple &Triple = TC.getTriple();
2360 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002361 StringRef OSLibName =
2362 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002363 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002364 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002365}
2366
Peter Collingbourne581f4382015-07-02 01:48:12 +00002367SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2368 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002369 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2370 ? "-android"
2371 : "";
2372
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002373 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002374 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2375 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002376 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002377 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002378 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002379 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002380
2381 SmallString<128> Path = getCompilerRTLibDir(TC);
2382 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2383 Arch + Env + Suffix);
2384
2385 return Path;
2386}
2387
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002388// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002389// FIXME: Make sure we can also emit shared objects if they're requested
2390// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002391static void addClangRT(const ToolChain &TC, const ArgList &Args,
2392 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002393 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002394}
2395
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002396static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2397 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002398 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2399 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002400 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002401 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002402 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002403 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002404 Args.hasArg(options::OPT_fcreate_profile) ||
2405 Args.hasArg(options::OPT_coverage)))
2406 return;
2407
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002408 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002409}
2410
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002411namespace {
2412enum OpenMPRuntimeKind {
2413 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2414 /// without knowing what runtime to target.
2415 OMPRT_Unknown,
2416
2417 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2418 /// the default for Clang.
2419 OMPRT_OMP,
2420
2421 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2422 /// this runtime but can swallow the pragmas, and find and link against the
2423 /// runtime library itself.
2424 OMPRT_GOMP,
2425
Chandler Carruthc6625c62015-05-28 21:10:31 +00002426 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002427 /// OpenMP runtime. We support this mode for users with existing dependencies
2428 /// on this runtime library name.
2429 OMPRT_IOMP5
2430};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002431}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002432
2433/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002434static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2435 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002436 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2437
2438 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2439 if (A)
2440 RuntimeName = A->getValue();
2441
2442 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002443 .Case("libomp", OMPRT_OMP)
2444 .Case("libgomp", OMPRT_GOMP)
2445 .Case("libiomp5", OMPRT_IOMP5)
2446 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002447
2448 if (RT == OMPRT_Unknown) {
2449 if (A)
2450 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002451 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002452 else
2453 // FIXME: We could use a nicer diagnostic here.
2454 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2455 }
2456
2457 return RT;
2458}
2459
Alexey Samsonov52550342014-09-15 19:58:40 +00002460static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2461 ArgStringList &CmdArgs, StringRef Sanitizer,
2462 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002463 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002464 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002465 if (!IsShared)
2466 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002467 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002468 if (!IsShared)
2469 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002470}
2471
Alexey Samsonov52550342014-09-15 19:58:40 +00002472// Tries to use a file with the list of dynamic symbols that need to be exported
2473// from the runtime library. Returns true if the file was found.
2474static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2475 ArgStringList &CmdArgs,
2476 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002477 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2478 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2479 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002480 return true;
2481 }
2482 return false;
2483}
2484
2485static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2486 ArgStringList &CmdArgs) {
2487 // Force linking against the system libraries sanitizers depends on
2488 // (see PR15823 why this is necessary).
2489 CmdArgs.push_back("--no-as-needed");
2490 CmdArgs.push_back("-lpthread");
2491 CmdArgs.push_back("-lrt");
2492 CmdArgs.push_back("-lm");
2493 // There's no libdl on FreeBSD.
2494 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2495 CmdArgs.push_back("-ldl");
2496}
2497
2498static void
2499collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2500 SmallVectorImpl<StringRef> &SharedRuntimes,
2501 SmallVectorImpl<StringRef> &StaticRuntimes,
2502 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2503 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2504 // Collect shared runtimes.
2505 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2506 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002507 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002508
Alexey Samsonov52550342014-09-15 19:58:40 +00002509 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002510 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002511 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2512 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002513 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002514 }
2515 if (SanArgs.needsAsanRt()) {
2516 if (SanArgs.needsSharedAsanRt()) {
2517 HelperStaticRuntimes.push_back("asan-preinit");
2518 } else {
2519 StaticRuntimes.push_back("asan");
2520 if (SanArgs.linkCXXRuntimes())
2521 StaticRuntimes.push_back("asan_cxx");
2522 }
2523 }
2524 if (SanArgs.needsDfsanRt())
2525 StaticRuntimes.push_back("dfsan");
2526 if (SanArgs.needsLsanRt())
2527 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002528 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002529 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002530 if (SanArgs.linkCXXRuntimes())
2531 StaticRuntimes.push_back("msan_cxx");
2532 }
2533 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002534 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002535 if (SanArgs.linkCXXRuntimes())
2536 StaticRuntimes.push_back("tsan_cxx");
2537 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002538 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002539 StaticRuntimes.push_back("ubsan_standalone");
2540 if (SanArgs.linkCXXRuntimes())
2541 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002542 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002543 if (SanArgs.needsSafeStackRt())
2544 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002545}
2546
Alexey Samsonov52550342014-09-15 19:58:40 +00002547// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2548// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2549static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002550 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002551 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2552 HelperStaticRuntimes;
2553 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2554 HelperStaticRuntimes);
2555 for (auto RT : SharedRuntimes)
2556 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2557 for (auto RT : HelperStaticRuntimes)
2558 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2559 bool AddExportDynamic = false;
2560 for (auto RT : StaticRuntimes) {
2561 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2562 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2563 }
2564 // If there is a static runtime with no dynamic list, force all the symbols
2565 // to be dynamic to be sure we export sanitizer interface functions.
2566 if (AddExportDynamic)
2567 CmdArgs.push_back("-export-dynamic");
2568 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002569}
2570
Reid Kleckner86ea7702015-02-04 23:45:07 +00002571static bool areOptimizationsEnabled(const ArgList &Args) {
2572 // Find the last -O arg and see if it is non-zero.
2573 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2574 return !A->getOption().matches(options::OPT_O0);
2575 // Defaults to -O0.
2576 return false;
2577}
2578
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002579static bool shouldUseFramePointerForTarget(const ArgList &Args,
2580 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002581 // XCore never wants frame pointers, regardless of OS.
2582 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002583 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002584 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002585
2586 if (Triple.isOSLinux()) {
2587 switch (Triple.getArch()) {
2588 // Don't use a frame pointer on linux if optimizing for certain targets.
2589 case llvm::Triple::mips64:
2590 case llvm::Triple::mips64el:
2591 case llvm::Triple::mips:
2592 case llvm::Triple::mipsel:
2593 case llvm::Triple::systemz:
2594 case llvm::Triple::x86:
2595 case llvm::Triple::x86_64:
2596 return !areOptimizationsEnabled(Args);
2597 default:
2598 return true;
2599 }
2600 }
2601
2602 if (Triple.isOSWindows()) {
2603 switch (Triple.getArch()) {
2604 case llvm::Triple::x86:
2605 return !areOptimizationsEnabled(Args);
2606 default:
2607 // All other supported Windows ISAs use xdata unwind information, so frame
2608 // pointers are not generally useful.
2609 return false;
2610 }
2611 }
2612
2613 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002614}
2615
Rafael Espindola224dd632011-12-14 21:02:23 +00002616static bool shouldUseFramePointer(const ArgList &Args,
2617 const llvm::Triple &Triple) {
2618 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2619 options::OPT_fomit_frame_pointer))
2620 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2621
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002622 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002623}
2624
Eric Christopherb7d97e92013-04-03 01:58:53 +00002625static bool shouldUseLeafFramePointer(const ArgList &Args,
2626 const llvm::Triple &Triple) {
2627 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2628 options::OPT_momit_leaf_frame_pointer))
2629 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2630
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002631 if (Triple.isPS4CPU())
2632 return false;
2633
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002634 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002635}
2636
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002637/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002638static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002639 SmallString<128> cwd;
2640 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002641 CmdArgs.push_back("-fdebug-compilation-dir");
2642 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002643 }
2644}
2645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002646static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002647 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2648 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2649 SmallString<128> T(FinalOutput->getValue());
2650 llvm::sys::path::replace_extension(T, "dwo");
2651 return Args.MakeArgString(T);
2652 } else {
2653 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002654 SmallString<128> T(
2655 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002656 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002657 llvm::sys::path::replace_extension(F, "dwo");
2658 T += F;
2659 return Args.MakeArgString(F);
2660 }
2661}
2662
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002663static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2664 const JobAction &JA, const ArgList &Args,
2665 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002666 ArgStringList ExtractArgs;
2667 ExtractArgs.push_back("--extract-dwo");
2668
2669 ArgStringList StripArgs;
2670 StripArgs.push_back("--strip-dwo");
2671
2672 // Grabbing the output of the earlier compile step.
2673 StripArgs.push_back(Output.getFilename());
2674 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002675 ExtractArgs.push_back(OutFile);
2676
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002677 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002678 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002679
2680 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002681 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002682
2683 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002684 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002685}
2686
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002687/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002688/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2689static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002690 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002691 if (A->getOption().matches(options::OPT_O4) ||
2692 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002693 return true;
2694
2695 if (A->getOption().matches(options::OPT_O0))
2696 return false;
2697
2698 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2699
Rafael Espindola91780de2013-08-26 14:05:41 +00002700 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002701 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002702 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002703 return true;
2704
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002705 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002706 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002707 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002708
2709 unsigned OptLevel = 0;
2710 if (S.getAsInteger(10, OptLevel))
2711 return false;
2712
2713 return OptLevel > 1;
2714 }
2715
2716 return false;
2717}
2718
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002719/// Add -x lang to \p CmdArgs for \p Input.
2720static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2721 ArgStringList &CmdArgs) {
2722 // When using -verify-pch, we don't want to provide the type
2723 // 'precompiled-header' if it was inferred from the file extension
2724 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2725 return;
2726
2727 CmdArgs.push_back("-x");
2728 if (Args.hasArg(options::OPT_rewrite_objc))
2729 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2730 else
2731 CmdArgs.push_back(types::getTypeName(Input.getType()));
2732}
2733
David Majnemerc371ff02015-03-22 08:39:22 +00002734static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002735 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002736 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002737
2738 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002739 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002740
2741 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002742 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002743 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002744 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002745}
2746
Rafael Espindola577637a2015-01-03 00:06:04 +00002747// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002748// options that build systems might add but are unused when assembling or only
2749// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002750static void claimNoWarnArgs(const ArgList &Args) {
2751 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002752 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002753 Args.ClaimAllArgs(options::OPT_flto);
2754 Args.ClaimAllArgs(options::OPT_fno_lto);
2755}
2756
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002757static void appendUserToPath(SmallVectorImpl<char> &Result) {
2758#ifdef LLVM_ON_UNIX
2759 const char *Username = getenv("LOGNAME");
2760#else
2761 const char *Username = getenv("USERNAME");
2762#endif
2763 if (Username) {
2764 // Validate that LoginName can be used in a path, and get its length.
2765 size_t Len = 0;
2766 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002767 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002768 Username = nullptr;
2769 break;
2770 }
2771 }
2772
2773 if (Username && Len > 0) {
2774 Result.append(Username, Username + Len);
2775 return;
2776 }
2777 }
2778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002779// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002780#ifdef LLVM_ON_UNIX
2781 std::string UID = llvm::utostr(getuid());
2782#else
2783 // FIXME: Windows seems to have an 'SID' that might work.
2784 std::string UID = "9999";
2785#endif
2786 Result.append(UID.begin(), UID.end());
2787}
2788
David Majnemere11d3732015-06-08 00:22:46 +00002789VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2790 const llvm::Triple &Triple,
2791 const llvm::opt::ArgList &Args,
2792 bool IsWindowsMSVC) {
2793 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2794 IsWindowsMSVC) ||
2795 Args.hasArg(options::OPT_fmsc_version) ||
2796 Args.hasArg(options::OPT_fms_compatibility_version)) {
2797 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2798 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002799 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002800
2801 if (MSCVersion && MSCompatibilityVersion) {
2802 if (D)
2803 D->Diag(diag::err_drv_argument_not_allowed_with)
2804 << MSCVersion->getAsString(Args)
2805 << MSCompatibilityVersion->getAsString(Args);
2806 return VersionTuple();
2807 }
2808
2809 if (MSCompatibilityVersion) {
2810 VersionTuple MSVT;
2811 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2812 D->Diag(diag::err_drv_invalid_value)
2813 << MSCompatibilityVersion->getAsString(Args)
2814 << MSCompatibilityVersion->getValue();
2815 return MSVT;
2816 }
2817
2818 if (MSCVersion) {
2819 unsigned Version = 0;
2820 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2821 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2822 << MSCVersion->getValue();
2823 return getMSCompatibilityVersion(Version);
2824 }
2825
2826 unsigned Major, Minor, Micro;
2827 Triple.getEnvironmentVersion(Major, Minor, Micro);
2828 if (Major || Minor || Micro)
2829 return VersionTuple(Major, Minor, Micro);
2830
2831 return VersionTuple(18);
2832 }
2833 return VersionTuple();
2834}
2835
Diego Novilloa0545962015-07-10 18:00:07 +00002836static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2837 const InputInfo &Output, const ArgList &Args,
2838 ArgStringList &CmdArgs) {
2839 auto *ProfileGenerateArg = Args.getLastArg(
2840 options::OPT_fprofile_instr_generate,
2841 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
2842 options::OPT_fprofile_generate_EQ);
2843
2844 auto *ProfileUseArg = Args.getLastArg(
2845 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
2846 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ);
2847
2848 if (ProfileGenerateArg && ProfileUseArg)
2849 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002850 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002851
2852 if (ProfileGenerateArg &&
2853 ProfileGenerateArg->getOption().matches(
2854 options::OPT_fprofile_instr_generate_EQ))
2855 ProfileGenerateArg->render(Args, CmdArgs);
2856 else if (ProfileGenerateArg &&
2857 ProfileGenerateArg->getOption().matches(
2858 options::OPT_fprofile_generate_EQ)) {
2859 SmallString<128> Path(ProfileGenerateArg->getValue());
2860 llvm::sys::path::append(Path, "default.profraw");
2861 CmdArgs.push_back(
2862 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2863 } else
2864 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2865
2866 if (ProfileUseArg &&
2867 ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2868 ProfileUseArg->render(Args, CmdArgs);
2869 else if (ProfileUseArg &&
2870 (ProfileUseArg->getOption().matches(options::OPT_fprofile_use_EQ) ||
2871 ProfileUseArg->getOption().matches(
2872 options::OPT_fprofile_instr_use))) {
2873 SmallString<128> Path(
2874 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2875 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2876 llvm::sys::path::append(Path, "default.profdata");
2877 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2878 }
2879
2880 if (Args.hasArg(options::OPT_ftest_coverage) ||
2881 Args.hasArg(options::OPT_coverage))
2882 CmdArgs.push_back("-femit-coverage-notes");
2883 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2884 false) ||
2885 Args.hasArg(options::OPT_coverage))
2886 CmdArgs.push_back("-femit-coverage-data");
2887
2888 if (Args.hasArg(options::OPT_fcoverage_mapping) && !ProfileGenerateArg)
2889 D.Diag(diag::err_drv_argument_only_allowed_with)
2890 << "-fcoverage-mapping"
2891 << "-fprofile-instr-generate";
2892
2893 if (Args.hasArg(options::OPT_fcoverage_mapping))
2894 CmdArgs.push_back("-fcoverage-mapping");
2895
2896 if (C.getArgs().hasArg(options::OPT_c) ||
2897 C.getArgs().hasArg(options::OPT_S)) {
2898 if (Output.isFilename()) {
2899 CmdArgs.push_back("-coverage-file");
2900 SmallString<128> CoverageFilename;
2901 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2902 CoverageFilename = FinalOutput->getValue();
2903 } else {
2904 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2905 }
2906 if (llvm::sys::path::is_relative(CoverageFilename)) {
2907 SmallString<128> Pwd;
2908 if (!llvm::sys::fs::current_path(Pwd)) {
2909 llvm::sys::path::append(Pwd, CoverageFilename);
2910 CoverageFilename.swap(Pwd);
2911 }
2912 }
2913 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2914 }
2915 }
2916}
2917
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002918void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002919 const InputInfo &Output, const InputInfoList &Inputs,
2920 const ArgList &Args, const char *LinkingOutput) const {
2921 bool KernelOrKext =
2922 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002923 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002924 ArgStringList CmdArgs;
2925
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002926 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002927 bool IsWindowsCygnus =
2928 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002929 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2930
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002931 // Check number of inputs for sanity. We need at least one input.
2932 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00002933 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002934 // CUDA compilation may have multiple inputs (source file + results of
2935 // device-side compilations). All other jobs are expected to have exactly one
2936 // input.
2937 bool IsCuda = types::isCuda(Input.getType());
2938 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00002939
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002940 // Invoke ourselves in -cc1 mode.
2941 //
2942 // FIXME: Implement custom jobs for internal actions.
2943 CmdArgs.push_back("-cc1");
2944
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002945 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002946 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002947 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002948 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002949
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002950 const llvm::Triple TT(TripleStr);
2951 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2952 TT.getArch() == llvm::Triple::thumb)) {
2953 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2954 unsigned Version;
2955 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2956 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002957 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2958 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002959 }
2960
Tim Northover336f1892014-03-29 13:16:12 +00002961 // Push all default warning arguments that are specific to
2962 // the given target. These come before user provided warning options
2963 // are provided.
2964 getToolChain().addClangWarningOptions(CmdArgs);
2965
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002966 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002967 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002968
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002969 if (isa<AnalyzeJobAction>(JA)) {
2970 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2971 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002972 } else if (isa<MigrateJobAction>(JA)) {
2973 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002974 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002975 if (Output.getType() == types::TY_Dependencies)
2976 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002977 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002978 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002979 if (Args.hasArg(options::OPT_rewrite_objc) &&
2980 !Args.hasArg(options::OPT_g_Group))
2981 CmdArgs.push_back("-P");
2982 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002983 } else if (isa<AssembleJobAction>(JA)) {
2984 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002985
David Blaikie9260ed62013-07-25 21:19:01 +00002986 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002987
2988 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002989 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002990 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002991 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002992 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002993
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002994 if (JA.getType() == types::TY_Nothing)
2995 CmdArgs.push_back("-fsyntax-only");
2996 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002997 CmdArgs.push_back("-emit-pch");
2998 else
2999 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003000 } else if (isa<VerifyPCHJobAction>(JA)) {
3001 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003002 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003003 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3004 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003005
Renato Golin7c542b42015-07-27 23:44:45 +00003006 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003007 CmdArgs.push_back("-flto");
3008 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003009 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003010 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003011 } else if (JA.getType() == types::TY_LLVM_IR ||
3012 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003013 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003014 } else if (JA.getType() == types::TY_LLVM_BC ||
3015 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003016 CmdArgs.push_back("-emit-llvm-bc");
3017 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003018 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003019 } else if (JA.getType() == types::TY_AST) {
3020 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003021 } else if (JA.getType() == types::TY_ModuleFile) {
3022 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003023 } else if (JA.getType() == types::TY_RewrittenObjC) {
3024 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003025 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003026 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3027 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003028 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003029 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003030 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003031 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003032
3033 // Preserve use-list order by default when emitting bitcode, so that
3034 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3035 // same result as running passes here. For LTO, we don't need to preserve
3036 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003037 if (JA.getType() == types::TY_LLVM_BC)
3038 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003039 }
3040
Justin Bognera88f0122014-06-20 22:59:50 +00003041 // We normally speed up the clang process a bit by skipping destructors at
3042 // exit, but when we're generating diagnostics we can rely on some of the
3043 // cleanup.
3044 if (!C.isForDiagnostics())
3045 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003047// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003048#ifdef NDEBUG
3049 CmdArgs.push_back("-disable-llvm-verifier");
3050#endif
3051
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003052 // Set the main file name, so that debug info works even with
3053 // -save-temps.
3054 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003055 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003056
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003057 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003058 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003059 if (Args.hasArg(options::OPT_static))
3060 CmdArgs.push_back("-static-define");
3061
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003062 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003063 // Enable region store model by default.
3064 CmdArgs.push_back("-analyzer-store=region");
3065
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003066 // Treat blocks as analysis entry points.
3067 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3068
Ted Kremenek49c79792011-03-24 00:28:47 +00003069 CmdArgs.push_back("-analyzer-eagerly-assume");
3070
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003071 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003072 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003073 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003074
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003075 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003076 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003077
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003078 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003079 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003080
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003081 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003082
Artem Belevichba558952015-05-06 18:20:23 +00003083 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003084 CmdArgs.push_back("-analyzer-checker=cplusplus");
3085
Nico Webere8e53112014-05-11 01:04:02 +00003086 // Enable the following experimental checkers for testing.
3087 CmdArgs.push_back(
3088 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003089 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3090 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003091 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003092 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3093 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003094 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003095
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003096 // Set the output format. The default is plist, for (lame) historical
3097 // reasons.
3098 CmdArgs.push_back("-analyzer-output");
3099 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003100 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003101 else
3102 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003103
Ted Kremenekfe449a22010-03-22 22:32:05 +00003104 // Disable the presentation of standard compiler warnings when
3105 // using --analyze. We only want to show static analyzer diagnostics
3106 // or frontend errors.
3107 CmdArgs.push_back("-w");
3108
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003109 // Add -Xanalyzer arguments when running as analyzer.
3110 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003111 }
3112
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003113 CheckCodeGenerationOptions(D, Args);
3114
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003115 bool PIE = getToolChain().isPIEDefault();
3116 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003117 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003118
Alexey Bataev40e75222014-01-28 06:30:35 +00003119 // Android-specific defaults for PIC/PIE
3120 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003121 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00003122 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003123 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00003124 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003125 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00003126 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00003127 case llvm::Triple::mips:
3128 case llvm::Triple::mipsel:
3129 case llvm::Triple::mips64:
3130 case llvm::Triple::mips64el:
3131 PIC = true; // "-fpic"
3132 break;
3133
3134 case llvm::Triple::x86:
3135 case llvm::Triple::x86_64:
3136 PIC = true; // "-fPIC"
3137 IsPICLevelTwo = true;
3138 break;
3139
3140 default:
3141 break;
3142 }
3143 }
3144
Brad Smith5b05db82014-06-24 19:51:29 +00003145 // OpenBSD-specific defaults for PIE
3146 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003147 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00003148 case llvm::Triple::mips64:
3149 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003150 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00003151 case llvm::Triple::x86:
3152 case llvm::Triple::x86_64:
3153 IsPICLevelTwo = false; // "-fpie"
3154 break;
3155
3156 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00003157 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00003158 case llvm::Triple::sparcv9:
3159 IsPICLevelTwo = true; // "-fPIE"
3160 break;
3161
3162 default:
3163 break;
3164 }
3165 }
3166
Alexey Samsonov090301e2013-04-09 12:28:19 +00003167 // For the PIC and PIE flag options, this logic is different from the
3168 // legacy logic in very old versions of GCC, as that logic was just
3169 // a bug no one had ever fixed. This logic is both more rational and
3170 // consistent with GCC's new logic now that the bugs are fixed. The last
3171 // argument relating to either PIC or PIE wins, and no other argument is
3172 // used. If the last argument is any flavor of the '-fno-...' arguments,
3173 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
3174 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003175 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3176 options::OPT_fpic, options::OPT_fno_pic,
3177 options::OPT_fPIE, options::OPT_fno_PIE,
3178 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00003179 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3180 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003181 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00003182 if (LastPICArg) {
3183 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003184 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3185 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3186 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003187 PIC =
3188 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3189 IsPICLevelTwo =
3190 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003191 } else {
3192 PIE = PIC = false;
3193 }
3194 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003195 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00003196
Nick Lewycky609dd662013-10-11 03:33:53 +00003197 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00003198 // specified while enabling PIC enabled level 1 PIC, just force it back to
3199 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
3200 // informal testing).
3201 if (PIC && getToolChain().getTriple().isOSDarwin())
3202 IsPICLevelTwo |= getToolChain().isPICDefault();
3203
Chandler Carruthc0c04552012-04-08 16:40:35 +00003204 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3205 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003206 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00003207 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003208 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003209 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003210 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003211
Chandler Carruth76a943b2012-11-19 03:52:03 +00003212 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3213 // This is a very special mode. It trumps the other modes, almost no one
3214 // uses it, and it isn't even valid on any OS but Darwin.
3215 if (!getToolChain().getTriple().isOSDarwin())
3216 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003217 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003218
3219 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3220
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003221 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003222 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003223
Chandler Carruth76a943b2012-11-19 03:52:03 +00003224 // Only a forced PIC mode can cause the actual compile to have PIC defines
3225 // etc., no flags are sufficient. This behavior was selected to closely
3226 // match that of llvm-gcc and Apple GCC before that.
3227 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3228 CmdArgs.push_back("-pic-level");
3229 CmdArgs.push_back("2");
3230 }
3231 } else {
3232 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3233 // handled in Clang's IRGen by the -pie-level flag.
3234 CmdArgs.push_back("-mrelocation-model");
3235 CmdArgs.push_back(PIC ? "pic" : "static");
3236
3237 if (PIC) {
3238 CmdArgs.push_back("-pic-level");
3239 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3240 if (PIE) {
3241 CmdArgs.push_back("-pie-level");
3242 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3243 }
3244 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003245 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003246
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003247 CmdArgs.push_back("-mthread-model");
3248 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3249 CmdArgs.push_back(A->getValue());
3250 else
3251 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3252
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003253 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3254
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003255 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3256 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003257 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003258
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003259 // LLVM Code Generator Options.
3260
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003261 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3262 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003263 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3264 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003265 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003266 CmdArgs.push_back(A->getValue());
3267 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003268 }
3269 }
3270
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003271 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3272 StringRef v = A->getValue();
3273 CmdArgs.push_back("-mllvm");
3274 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3275 A->claim();
3276 }
3277
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003278 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3279 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003280 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003281 }
3282
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003283 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3284 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003285 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003286 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003287 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003288 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3289 CmdArgs.push_back("-fpcc-struct-return");
3290 } else {
3291 assert(A->getOption().matches(options::OPT_freg_struct_return));
3292 CmdArgs.push_back("-freg-struct-return");
3293 }
3294 }
3295
Roman Divacky65b88cd2011-03-01 17:40:53 +00003296 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3297 CmdArgs.push_back("-mrtd");
3298
Rafael Espindola224dd632011-12-14 21:02:23 +00003299 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003300 CmdArgs.push_back("-mdisable-fp-elim");
3301 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3302 options::OPT_fno_zero_initialized_in_bss))
3303 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003304
3305 bool OFastEnabled = isOptimizationLevelFast(Args);
3306 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3307 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003308 OptSpecifier StrictAliasingAliasOption =
3309 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003310 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3311 // doesn't do any TBAA.
3312 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003313 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003314 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003315 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003316 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3317 options::OPT_fno_struct_path_tbaa))
3318 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003319 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3320 false))
3321 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003322 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3323 options::OPT_fno_optimize_sibling_calls))
3324 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003325
Eric Christopher006208c2013-04-04 06:29:47 +00003326 // Handle segmented stacks.
3327 if (Args.hasArg(options::OPT_fsplit_stack))
3328 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003329
3330 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3331 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003332 OptSpecifier FastMathAliasOption =
3333 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3334
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003335 // Handle various floating point optimization flags, mapping them to the
3336 // appropriate LLVM code generation flags. The pattern for all of these is to
3337 // default off the codegen optimizations, and if any flag enables them and no
3338 // flag disables them after the flag enabling them, enable the codegen
3339 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003340 if (Arg *A = Args.getLastArg(
3341 options::OPT_ffast_math, FastMathAliasOption,
3342 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3343 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3344 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003345 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3346 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003347 A->getOption().getID() != options::OPT_fhonor_infinities)
3348 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003349 if (Arg *A = Args.getLastArg(
3350 options::OPT_ffast_math, FastMathAliasOption,
3351 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3352 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3353 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003354 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3355 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003356 A->getOption().getID() != options::OPT_fhonor_nans)
3357 CmdArgs.push_back("-menable-no-nans");
3358
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003359 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3360 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003361 if (Arg *A =
3362 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3363 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3364 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003365 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3366 // However, turning *off* -ffast_math merely restores the toolchain default
3367 // (which may be false).
3368 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3369 A->getOption().getID() == options::OPT_ffast_math ||
3370 A->getOption().getID() == options::OPT_Ofast)
3371 MathErrno = false;
3372 else if (A->getOption().getID() == options::OPT_fmath_errno)
3373 MathErrno = true;
3374 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003375 if (MathErrno)
3376 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003377
3378 // There are several flags which require disabling very specific
3379 // optimizations. Any of these being disabled forces us to turn off the
3380 // entire set of LLVM optimizations, so collect them through all the flag
3381 // madness.
3382 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003383 if (Arg *A = Args.getLastArg(
3384 options::OPT_ffast_math, FastMathAliasOption,
3385 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3386 options::OPT_fno_unsafe_math_optimizations,
3387 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003388 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3389 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003390 A->getOption().getID() != options::OPT_fno_associative_math)
3391 AssociativeMath = true;
3392 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003393 if (Arg *A = Args.getLastArg(
3394 options::OPT_ffast_math, FastMathAliasOption,
3395 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3396 options::OPT_fno_unsafe_math_optimizations,
3397 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003398 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3399 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003400 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3401 ReciprocalMath = true;
3402 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003403 if (Arg *A = Args.getLastArg(
3404 options::OPT_ffast_math, FastMathAliasOption,
3405 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3406 options::OPT_fno_unsafe_math_optimizations,
3407 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003408 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3409 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003410 A->getOption().getID() != options::OPT_fsigned_zeros)
3411 SignedZeros = false;
3412 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003413 if (Arg *A = Args.getLastArg(
3414 options::OPT_ffast_math, FastMathAliasOption,
3415 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3416 options::OPT_fno_unsafe_math_optimizations,
3417 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003418 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3419 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003420 A->getOption().getID() != options::OPT_ftrapping_math)
3421 TrappingMath = false;
3422 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3423 !TrappingMath)
3424 CmdArgs.push_back("-menable-unsafe-fp-math");
3425
Sanjay Patel76c9e092015-01-23 16:40:50 +00003426 if (!SignedZeros)
3427 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003428
Sanjay Patel359b1052015-04-09 15:03:23 +00003429 if (ReciprocalMath)
3430 CmdArgs.push_back("-freciprocal-math");
3431
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003432 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003433 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003434 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003435 options::OPT_ffp_contract)) {
3436 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003437 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003438 if (Val == "fast" || Val == "on" || Val == "off") {
3439 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3440 } else {
3441 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003442 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003443 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003444 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3445 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003446 // If fast-math is set then set the fp-contract mode to fast.
3447 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3448 }
3449 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003450
Sanjay Patel2987c292015-06-11 14:53:41 +00003451 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003452
Bob Wilson6a039162012-07-19 03:52:53 +00003453 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3454 // and if we find them, tell the frontend to provide the appropriate
3455 // preprocessor macros. This is distinct from enabling any optimizations as
3456 // these options induce language changes which must survive serialization
3457 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003458 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3459 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003460 if (!A->getOption().matches(options::OPT_fno_fast_math))
3461 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003462 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3463 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003464 if (A->getOption().matches(options::OPT_ffinite_math_only))
3465 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003466
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003467 // Decide whether to use verbose asm. Verbose assembly is the default on
3468 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003469 bool IsIntegratedAssemblerDefault =
3470 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003471 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003472 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003473 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003474 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003475
Rafael Espindolab8a12932015-05-22 20:44:03 +00003476 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3477 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003478 CmdArgs.push_back("-no-integrated-as");
3479
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003480 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3481 CmdArgs.push_back("-mdebug-pass");
3482 CmdArgs.push_back("Structure");
3483 }
3484 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3485 CmdArgs.push_back("-mdebug-pass");
3486 CmdArgs.push_back("Arguments");
3487 }
3488
John McCall8517abc2010-02-19 02:45:38 +00003489 // Enable -mconstructor-aliases except on darwin, where we have to
3490 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003491 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003492 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003493
John McCall7ef5cb32011-03-18 02:56:14 +00003494 // Darwin's kernel doesn't support guard variables; just die if we
3495 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003496 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003497 CmdArgs.push_back("-fforbid-guard-variables");
3498
Douglas Gregordbe39272011-02-01 15:15:22 +00003499 if (Args.hasArg(options::OPT_mms_bitfields)) {
3500 CmdArgs.push_back("-mms-bitfields");
3501 }
John McCall8517abc2010-02-19 02:45:38 +00003502
Daniel Dunbar306945d2009-09-16 06:17:29 +00003503 // This is a coarse approximation of what llvm-gcc actually does, both
3504 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3505 // complicated ways.
3506 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003507 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3508 options::OPT_fno_asynchronous_unwind_tables,
3509 (getToolChain().IsUnwindTablesDefault() ||
3510 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3511 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003512 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3513 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003514 CmdArgs.push_back("-munwind-tables");
3515
Chandler Carruth05fb5852012-11-21 23:40:23 +00003516 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003517
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003518 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3519 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003520 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003521 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003522
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003523 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003524 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003525
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003526 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003527 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003528 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003529 }
3530
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003531 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003532 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003533 if (!CPU.empty()) {
3534 CmdArgs.push_back("-target-cpu");
3535 CmdArgs.push_back(Args.MakeArgString(CPU));
3536 }
3537
Rafael Espindolaeb265472013-08-21 21:59:03 +00003538 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3539 CmdArgs.push_back("-mfpmath");
3540 CmdArgs.push_back(A->getValue());
3541 }
3542
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003543 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003544 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003545
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003546 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003548 default:
3549 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003550
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003551 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003552 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003553 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003554 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003555 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003556 break;
3557
Tim Northover573cbee2014-05-24 12:52:07 +00003558 case llvm::Triple::aarch64:
3559 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003560 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003561 break;
3562
Eric Christopher0b26a612010-03-02 02:41:08 +00003563 case llvm::Triple::mips:
3564 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003565 case llvm::Triple::mips64:
3566 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003567 AddMIPSTargetArgs(Args, CmdArgs);
3568 break;
3569
Ulrich Weigand8afad612014-07-28 13:17:52 +00003570 case llvm::Triple::ppc:
3571 case llvm::Triple::ppc64:
3572 case llvm::Triple::ppc64le:
3573 AddPPCTargetArgs(Args, CmdArgs);
3574 break;
3575
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003576 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003577 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003578 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003579 AddSparcTargetArgs(Args, CmdArgs);
3580 break;
3581
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003582 case llvm::Triple::x86:
3583 case llvm::Triple::x86_64:
3584 AddX86TargetArgs(Args, CmdArgs);
3585 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003586
3587 case llvm::Triple::hexagon:
3588 AddHexagonTargetArgs(Args, CmdArgs);
3589 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003590 }
3591
Hans Wennborg75958c42013-08-08 00:17:41 +00003592 // Add clang-cl arguments.
3593 if (getToolChain().getDriver().IsCLMode())
3594 AddClangCLArgs(Args, CmdArgs);
3595
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003596 // Pass the linker version in use.
3597 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3598 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003599 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003600 }
3601
Eric Christopherb7d97e92013-04-03 01:58:53 +00003602 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003603 CmdArgs.push_back("-momit-leaf-frame-pointer");
3604
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003605 // Explicitly error on some things we know we don't support and can't just
3606 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003607 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003608 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3609 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003610 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003611 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003612 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3613 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003614 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003615 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003616 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003617 }
3618
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003619 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003620 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003621 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003622 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003623 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3624 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003625 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003626 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003627 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003628
Chad Rosierbe10f982011-08-02 17:58:04 +00003629 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003630 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003631 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3632 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003633 }
3634
Manman Ren17bdb0f2013-11-20 20:22:14 +00003635 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3636 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003637 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003638 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003639 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3640 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003641 // FIXME: we should support specifying dwarf version with
3642 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003643 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003644 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003645 const llvm::Triple &Triple = getToolChain().getTriple();
3646 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003647 Triple.getOS() == llvm::Triple::FreeBSD ||
3648 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003649 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003650 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003651 CmdArgs.push_back("-gdwarf-2");
3652 else if (A->getOption().matches(options::OPT_gdwarf_3))
3653 CmdArgs.push_back("-gdwarf-3");
3654 else if (A->getOption().matches(options::OPT_gdwarf_4))
3655 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003656 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003657 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003658 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003659 const llvm::Triple &Triple = getToolChain().getTriple();
3660 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003661 Triple.getOS() == llvm::Triple::FreeBSD ||
3662 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003663 CmdArgs.push_back("-gdwarf-2");
3664 else
3665 CmdArgs.push_back("-g");
3666 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003667 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003668
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003669 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3670 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003671 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3672 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003673 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003674
Eric Christopher138c32b2013-09-13 22:37:55 +00003675 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003676 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3677 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003678 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003679 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003680 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003681 CmdArgs.push_back("-g");
3682 CmdArgs.push_back("-backend-option");
3683 CmdArgs.push_back("-split-dwarf=Enable");
3684 }
3685
Eric Christopher138c32b2013-09-13 22:37:55 +00003686 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3687 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3688 CmdArgs.push_back("-backend-option");
3689 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3690 }
Eric Christophereec89c22013-06-18 00:03:50 +00003691
Eric Christopher0d403d22014-02-14 01:27:03 +00003692 // -gdwarf-aranges turns on the emission of the aranges section in the
3693 // backend.
3694 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3695 CmdArgs.push_back("-backend-option");
3696 CmdArgs.push_back("-generate-arange-section");
3697 }
3698
David Blaikief36d9ba2014-01-27 18:52:43 +00003699 if (Args.hasFlag(options::OPT_fdebug_types_section,
3700 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003701 CmdArgs.push_back("-backend-option");
3702 CmdArgs.push_back("-generate-type-units");
3703 }
Eric Christophereec89c22013-06-18 00:03:50 +00003704
Ed Schouten6e576152015-03-26 17:50:28 +00003705 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3706 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3707
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003708 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003709 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003710 CmdArgs.push_back("-ffunction-sections");
3711 }
3712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003713 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3714 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003715 CmdArgs.push_back("-fdata-sections");
3716 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003717
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003718 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003719 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003720 CmdArgs.push_back("-fno-unique-section-names");
3721
Chris Lattner3c77a352010-06-22 00:03:40 +00003722 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3723
Diego Novilloa0545962015-07-10 18:00:07 +00003724 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003725
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003726 // Pass options for controlling the default header search paths.
3727 if (Args.hasArg(options::OPT_nostdinc)) {
3728 CmdArgs.push_back("-nostdsysteminc");
3729 CmdArgs.push_back("-nobuiltininc");
3730 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003731 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003732 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003733 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3734 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3735 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003736
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003737 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003738 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003739 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003740
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003741 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3742
Ted Kremenekf7639e12012-03-06 20:06:33 +00003743 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003744 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003745 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003746 options::OPT_ccc_arcmt_modify,
3747 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003748 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003749 switch (A->getOption().getID()) {
3750 default:
3751 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003752 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003753 CmdArgs.push_back("-arcmt-check");
3754 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003755 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003756 CmdArgs.push_back("-arcmt-modify");
3757 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003758 case options::OPT_ccc_arcmt_migrate:
3759 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003760 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003761 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003762
3763 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3764 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003765 break;
John McCalld70fb982011-06-15 23:25:17 +00003766 }
3767 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003768 } else {
3769 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3770 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3771 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003772 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003773
Ted Kremenekf7639e12012-03-06 20:06:33 +00003774 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3775 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003776 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3777 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003778 }
3779 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003780 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003781
3782 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003783 options::OPT_objcmt_migrate_subscripting,
3784 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003785 // None specified, means enable them all.
3786 CmdArgs.push_back("-objcmt-migrate-literals");
3787 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003788 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003789 } else {
3790 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3791 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003792 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003793 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003794 } else {
3795 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3796 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3797 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3798 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3799 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3800 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003801 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003802 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3803 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3804 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3805 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3806 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3807 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3808 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003809 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003810 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003811 }
3812
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003813 // Add preprocessing options like -I, -D, etc. if we are using the
3814 // preprocessor.
3815 //
3816 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003817 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003818 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003819
Rafael Espindolaa7431922011-07-21 23:40:37 +00003820 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3821 // that "The compiler can only warn and ignore the option if not recognized".
3822 // When building with ccache, it will pass -D options to clang even on
3823 // preprocessed inputs and configure concludes that -fPIC is not supported.
3824 Args.ClaimAllArgs(options::OPT_D);
3825
Alp Toker7874bdc2013-11-15 20:40:58 +00003826 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003827 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3828 if (A->getOption().matches(options::OPT_O4)) {
3829 CmdArgs.push_back("-O3");
3830 D.Diag(diag::warn_O4_is_O3);
3831 } else {
3832 A->render(Args, CmdArgs);
3833 }
3834 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003835
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003836 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003837 for (const Arg *A :
3838 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3839 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003840 }
3841
Rafael Espindola577637a2015-01-03 00:06:04 +00003842 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003843
Richard Smith3be1cb22014-08-07 00:24:21 +00003844 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003845 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003846 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3847 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003848 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003849 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003850
3851 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003852 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003853 //
3854 // If a std is supplied, only add -trigraphs if it follows the
3855 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003856 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003857 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3858 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003859 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003860 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003861 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003862 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003863 else
3864 Std->render(Args, CmdArgs);
3865
Nico Weber00721502014-12-23 22:32:37 +00003866 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003867 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003868 options::OPT_ftrigraphs,
3869 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003870 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003871 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003872 } else {
3873 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003874 //
3875 // FIXME: Clang doesn't correctly handle -std= when the input language
3876 // doesn't match. For the time being just ignore this for C++ inputs;
3877 // eventually we want to do all the standard defaulting here instead of
3878 // splitting it between the driver and clang -cc1.
3879 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003880 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3881 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003882 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003883 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003884
Nico Weber00721502014-12-23 22:32:37 +00003885 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3886 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003887 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003888
Richard Smith282b4492013-09-04 22:50:31 +00003889 // GCC's behavior for -Wwrite-strings is a bit strange:
3890 // * In C, this "warning flag" changes the types of string literals from
3891 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3892 // for the discarded qualifier.
3893 // * In C++, this is just a normal warning flag.
3894 //
3895 // Implementing this warning correctly in C is hard, so we follow GCC's
3896 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3897 // a non-const char* in C, rather than using this crude hack.
3898 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003899 // FIXME: This should behave just like a warning flag, and thus should also
3900 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3901 Arg *WriteStrings =
3902 Args.getLastArg(options::OPT_Wwrite_strings,
3903 options::OPT_Wno_write_strings, options::OPT_w);
3904 if (WriteStrings &&
3905 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003906 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003907 }
3908
Chandler Carruth61fbf622011-04-23 09:27:53 +00003909 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003910 // during C++ compilation, which it is by default. GCC keeps this define even
3911 // in the presence of '-w', match this behavior bug-for-bug.
3912 if (types::isCXX(InputType) &&
3913 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3914 true)) {
3915 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003916 }
3917
Chandler Carruthe0391482010-05-22 02:21:53 +00003918 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3919 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3920 if (Asm->getOption().matches(options::OPT_fasm))
3921 CmdArgs.push_back("-fgnu-keywords");
3922 else
3923 CmdArgs.push_back("-fno-gnu-keywords");
3924 }
3925
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003926 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3927 CmdArgs.push_back("-fno-dwarf-directory-asm");
3928
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003929 if (ShouldDisableAutolink(Args, getToolChain()))
3930 CmdArgs.push_back("-fno-autolink");
3931
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003932 // Add in -fdebug-compilation-dir if necessary.
3933 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003934
Richard Smith9a568822011-11-21 19:36:32 +00003935 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3936 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003937 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003938 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003939 }
3940
Richard Smith79c927b2013-11-06 19:31:51 +00003941 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3942 CmdArgs.push_back("-foperator-arrow-depth");
3943 CmdArgs.push_back(A->getValue());
3944 }
3945
Richard Smith9a568822011-11-21 19:36:32 +00003946 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3947 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003948 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003949 }
3950
Richard Smitha3d3bd22013-05-08 02:12:03 +00003951 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3952 CmdArgs.push_back("-fconstexpr-steps");
3953 CmdArgs.push_back(A->getValue());
3954 }
3955
Richard Smithb3a14522013-02-22 01:59:51 +00003956 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3957 CmdArgs.push_back("-fbracket-depth");
3958 CmdArgs.push_back(A->getValue());
3959 }
3960
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003961 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3962 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003963 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003964 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003965 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3966 } else
3967 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003968 }
3969
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003970 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003971 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003972
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003973 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3974 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003975 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003976 }
David Chisnall5778fce2009-08-31 16:41:57 +00003977
Chris Lattnere23003d2010-01-09 21:54:33 +00003978 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3979 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003980 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003981 }
3982
Chris Lattnerb35583d2010-04-07 20:49:23 +00003983 CmdArgs.push_back("-ferror-limit");
3984 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003985 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003986 else
3987 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003988
Chandler Carrutha77a7272010-05-06 04:55:18 +00003989 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3990 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003991 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003992 }
3993
3994 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3995 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003996 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003997 }
3998
Richard Smithf6f003a2011-12-16 19:06:07 +00003999 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4000 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004001 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004002 }
4003
Nick Lewycky24653262014-12-16 21:39:02 +00004004 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4005 CmdArgs.push_back("-fspell-checking-limit");
4006 CmdArgs.push_back(A->getValue());
4007 }
4008
Daniel Dunbar2c978472009-11-04 06:24:47 +00004009 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004010 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004011 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004012 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004013 } else {
4014 // If -fmessage-length=N was not specified, determine whether this is a
4015 // terminal and, if so, implicitly define -fmessage-length appropriately.
4016 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004017 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004018 }
4019
John McCallb4a99d32013-02-19 01:57:35 +00004020 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4021 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4022 options::OPT_fvisibility_ms_compat)) {
4023 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4024 CmdArgs.push_back("-fvisibility");
4025 CmdArgs.push_back(A->getValue());
4026 } else {
4027 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4028 CmdArgs.push_back("-fvisibility");
4029 CmdArgs.push_back("hidden");
4030 CmdArgs.push_back("-ftype-visibility");
4031 CmdArgs.push_back("default");
4032 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004033 }
4034
Douglas Gregor08329632010-06-15 17:05:35 +00004035 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004036
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004037 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4038
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004039 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004040 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4041 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004042 CmdArgs.push_back("-ffreestanding");
4043
Daniel Dunbare357d562009-12-03 18:42:11 +00004044 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004045 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004046 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004047 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4048 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004049 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004050 // Emulated TLS is enabled by default on Android, and can be enabled manually
4051 // with -femulated-tls.
4052 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4053 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4054 EmulatedTLSDefault))
4055 CmdArgs.push_back("-femulated-tls");
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004056 // AltiVec language extensions aren't relevant for assembling.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004057 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm)
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004058 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00004059 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4060 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004061
Alexey Bataevdb390212015-05-20 04:24:19 +00004062 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004063 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4064 options::OPT_fno_openmp, false))
4065 switch (getOpenMPRuntime(getToolChain(), Args)) {
4066 case OMPRT_OMP:
4067 case OMPRT_IOMP5:
4068 // Clang can generate useful OpenMP code for these two runtime libraries.
4069 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004070
4071 // If no option regarding the use of TLS in OpenMP codegeneration is
4072 // given, decide a default based on the target. Otherwise rely on the
4073 // options and pass the right information to the frontend.
4074 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4075 options::OPT_fnoopenmp_use_tls,
4076 getToolChain().getArch() == llvm::Triple::ppc ||
4077 getToolChain().getArch() == llvm::Triple::ppc64 ||
4078 getToolChain().getArch() == llvm::Triple::ppc64le))
4079 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004080 break;
4081 default:
4082 // By default, if Clang doesn't know how to generate useful OpenMP code
4083 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4084 // down to the actual compilation.
4085 // FIXME: It would be better to have a mode which *only* omits IR
4086 // generation based on the OpenMP support so that we get consistent
4087 // semantic analysis, etc.
4088 break;
4089 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004090
Peter Collingbourne32701642013-11-01 18:16:25 +00004091 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004092 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004093
Eric Christopher459d2712013-02-19 06:16:53 +00004094 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004095 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4096 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4097 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4098 Arch == llvm::Triple::ppc64le))
4099 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4100 << "ppc/ppc64/ppc64le";
4101 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004102
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004103 if (getToolChain().SupportsProfiling())
4104 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004105
4106 // -flax-vector-conversions is default.
4107 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4108 options::OPT_fno_lax_vector_conversions))
4109 CmdArgs.push_back("-fno-lax-vector-conversions");
4110
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004111 if (Args.getLastArg(options::OPT_fapple_kext))
4112 CmdArgs.push_back("-fapple-kext");
4113
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004114 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004115 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004116 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004117 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4118 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004119
4120 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4121 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004122 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004123 }
4124
Bob Wilson14adb362012-02-03 06:27:22 +00004125 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004126
Chandler Carruth6e501032011-03-27 00:04:55 +00004127 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4128 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004129 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004130 if (A->getOption().matches(options::OPT_fwrapv))
4131 CmdArgs.push_back("-fwrapv");
4132 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4133 options::OPT_fno_strict_overflow)) {
4134 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4135 CmdArgs.push_back("-fwrapv");
4136 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004137
4138 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4139 options::OPT_fno_reroll_loops))
4140 if (A->getOption().matches(options::OPT_freroll_loops))
4141 CmdArgs.push_back("-freroll-loops");
4142
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004143 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004144 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4145 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004146
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004147 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4148
Daniel Dunbar4930e332009-11-17 08:07:36 +00004149 // -stack-protector=0 is default.
4150 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004151 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4152 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4153 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4154 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4155 Args.ClaimAllArgs(options::OPT_fstack_protector);
4156 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004157 options::OPT_fstack_protector_all,
4158 options::OPT_fstack_protector_strong,
4159 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004160 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004161 StackProtectorLevel = std::max<unsigned>(
4162 LangOptions::SSPOn,
4163 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004164 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004165 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004166 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004167 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004168 } else {
4169 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004170 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004171 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004172 if (StackProtectorLevel) {
4173 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004174 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004175 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004176
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004177 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004178 for (const Arg *A : Args.filtered(options::OPT__param)) {
4179 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004180 if (Str.startswith("ssp-buffer-size=")) {
4181 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004182 CmdArgs.push_back("-stack-protector-buffer-size");
4183 // FIXME: Verify the argument is a valid integer.
4184 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004185 }
Sean Silva14facf32015-06-09 01:57:17 +00004186 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004187 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004188 }
4189
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004190 // Translate -mstackrealign
4191 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4192 false)) {
4193 CmdArgs.push_back("-backend-option");
4194 CmdArgs.push_back("-force-align-stack");
4195 }
4196 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004197 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004198 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4199 }
4200
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004201 if (Args.hasArg(options::OPT_mstack_alignment)) {
4202 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4203 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004204 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004205
Hans Wennborg77dc2362015-01-20 19:45:50 +00004206 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4207 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4208
4209 if (!Size.empty())
4210 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4211 else
4212 CmdArgs.push_back("-mstack-probe-size=0");
4213 }
4214
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004215 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4216 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004217 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4218
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004219 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4220 options::OPT_mno_restrict_it)) {
4221 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4222 CmdArgs.push_back("-backend-option");
4223 CmdArgs.push_back("-arm-restrict-it");
4224 } else {
4225 CmdArgs.push_back("-backend-option");
4226 CmdArgs.push_back("-arm-no-restrict-it");
4227 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004228 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4229 TT.getArch() == llvm::Triple::thumb)) {
4230 // Windows on ARM expects restricted IT blocks
4231 CmdArgs.push_back("-backend-option");
4232 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004233 }
4234
Daniel Dunbard18049a2009-04-07 21:16:11 +00004235 // Forward -f options with positive and negative forms; we translate
4236 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004237 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4238 StringRef fname = A->getValue();
4239 if (!llvm::sys::fs::exists(fname))
4240 D.Diag(diag::err_drv_no_such_file) << fname;
4241 else
4242 A->render(Args, CmdArgs);
4243 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004244
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004245 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004246 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004247 CmdArgs.push_back("-fapple-kext");
4248 if (!Args.hasArg(options::OPT_fbuiltin))
4249 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004250 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004251 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004252 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004253 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004254 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004255
Nuno Lopes13c88c72009-12-16 16:59:22 +00004256 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4257 options::OPT_fno_assume_sane_operator_new))
4258 CmdArgs.push_back("-fno-assume-sane-operator-new");
4259
Daniel Dunbar4930e332009-11-17 08:07:36 +00004260 // -fblocks=0 is default.
4261 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004262 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004263 (Args.hasArg(options::OPT_fgnu_runtime) &&
4264 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4265 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004266 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004267
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004268 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004269 !getToolChain().hasBlocksRuntime())
4270 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004271 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004272
Richard Smith47972af2015-06-16 00:08:24 +00004273 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004274 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004275 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004276 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004277 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004278 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4279 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004280 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004281 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004282 HaveModules = true;
4283 }
4284 }
4285
Richard Smith47972af2015-06-16 00:08:24 +00004286 // -fmodule-maps enables implicit reading of module map files. By default,
4287 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004288 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4289 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004290 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004291 }
4292
Daniel Jasperac42b752013-10-21 06:34:34 +00004293 // -fmodules-decluse checks that modules used are declared so (off by
4294 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004295 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004296 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004297 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004298 }
4299
Daniel Jasper962b38e2014-04-11 11:47:45 +00004300 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4301 // all #included headers are part of modules.
4302 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004303 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004304 CmdArgs.push_back("-fmodules-strict-decluse");
4305 }
4306
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004307 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4308 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4309 options::OPT_fno_implicit_modules)) {
4310 CmdArgs.push_back("-fno-implicit-modules");
4311 }
4312
Daniel Jasperac42b752013-10-21 06:34:34 +00004313 // -fmodule-name specifies the module that is currently being built (or
4314 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004315 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004316
Richard Smith9887d792014-10-17 01:42:53 +00004317 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004318 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004319 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004320
Richard Smithe842a472014-10-22 02:05:46 +00004321 // -fmodule-file can be used to specify files containing precompiled modules.
4322 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4323
4324 // -fmodule-cache-path specifies where our implicitly-built module files
4325 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004326 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004327 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004328 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004329 if (HaveModules) {
4330 if (C.isForDiagnostics()) {
4331 // When generating crash reports, we want to emit the modules along with
4332 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004333 Path = Output.getFilename();
4334 llvm::sys::path::replace_extension(Path, ".cache");
4335 llvm::sys::path::append(Path, "modules");
4336 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004337 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004338 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004339 llvm::sys::path::append(Path, "org.llvm.clang.");
4340 appendUserToPath(Path);
4341 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004342 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004343 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004344 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4345 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004346 }
4347
4348 // When building modules and generating crashdumps, we need to dump a module
4349 // dependency VFS alongside the output.
4350 if (HaveModules && C.isForDiagnostics()) {
4351 SmallString<128> VFSDir(Output.getFilename());
4352 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004353 // Add the cache directory as a temp so the crash diagnostics pick it up.
4354 C.addTempFile(Args.MakeArgString(VFSDir));
4355
Justin Bognera88f0122014-06-20 22:59:50 +00004356 llvm::sys::path::append(VFSDir, "vfs");
4357 CmdArgs.push_back("-module-dependency-dir");
4358 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004359 }
4360
Richard Smith9887d792014-10-17 01:42:53 +00004361 if (HaveModules)
4362 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004363
Douglas Gregor35b04d62013-02-07 19:01:24 +00004364 // Pass through all -fmodules-ignore-macro arguments.
4365 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004366 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4367 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004368
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004369 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4370
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004371 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4372 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4373 D.Diag(diag::err_drv_argument_not_allowed_with)
4374 << A->getAsString(Args) << "-fbuild-session-timestamp";
4375
4376 llvm::sys::fs::file_status Status;
4377 if (llvm::sys::fs::status(A->getValue(), Status))
4378 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004379 CmdArgs.push_back(Args.MakeArgString(
4380 "-fbuild-session-timestamp=" +
4381 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004382 }
4383
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004384 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004385 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4386 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004387 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4388
4389 Args.AddLastArg(CmdArgs,
4390 options::OPT_fmodules_validate_once_per_build_session);
4391 }
4392
Ben Langmuirdcf73862014-03-12 00:06:17 +00004393 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4394
John McCalldfea9982010-04-09 19:12:06 +00004395 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004396 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004397 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004398 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004399
Anders Carlssond470fef2010-11-21 00:09:52 +00004400 // -felide-constructors is the default.
4401 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004402 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004403 CmdArgs.push_back("-fno-elide-constructors");
4404
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004405 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004406
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004407 if (KernelOrKext || (types::isCXX(InputType) &&
4408 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4409 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004410 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004411
Tony Linthicum76329bf2011-12-12 21:14:55 +00004412 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004413 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4414 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004415 CmdArgs.push_back("-fshort-enums");
4416
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004417 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004418 if (Arg *A = Args.getLastArg(
4419 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4420 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4421 if (A->getOption().matches(options::OPT_funsigned_char) ||
4422 A->getOption().matches(options::OPT_fno_signed_char)) {
4423 CmdArgs.push_back("-fno-signed-char");
4424 }
4425 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004426 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004427 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004428
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004429 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004430 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4431 options::OPT_fno_use_cxa_atexit,
4432 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004433 getToolChain().getArch() != llvm::Triple::hexagon &&
4434 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004435 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004436 CmdArgs.push_back("-fno-use-cxa-atexit");
4437
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004438 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004439 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004440 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004441 CmdArgs.push_back("-fms-extensions");
4442
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004443 // -fno-use-line-directives is default.
4444 if (Args.hasFlag(options::OPT_fuse_line_directives,
4445 options::OPT_fno_use_line_directives, false))
4446 CmdArgs.push_back("-fuse-line-directives");
4447
Francois Pichet1b4f1632011-09-17 04:32:15 +00004448 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004449 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004450 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004451 (IsWindowsMSVC &&
4452 Args.hasFlag(options::OPT_fms_extensions,
4453 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004454 CmdArgs.push_back("-fms-compatibility");
4455
David Majnemerc371ff02015-03-22 08:39:22 +00004456 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004457 VersionTuple MSVT = visualstudio::getMSVCVersion(
4458 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4459 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004460 CmdArgs.push_back(
4461 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004462
David Majnemer8db91762015-05-18 04:49:30 +00004463 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4464 if (ImplyVCPPCXXVer) {
4465 if (IsMSVC2015Compatible)
4466 CmdArgs.push_back("-std=c++14");
4467 else
4468 CmdArgs.push_back("-std=c++11");
4469 }
4470
Eric Christopher5ecce122013-02-18 00:38:31 +00004471 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004472 if (Args.hasFlag(options::OPT_fborland_extensions,
4473 options::OPT_fno_borland_extensions, false))
4474 CmdArgs.push_back("-fborland-extensions");
4475
David Majnemerc371ff02015-03-22 08:39:22 +00004476 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4477 // than 19.
4478 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4479 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004480 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004481 CmdArgs.push_back("-fno-threadsafe-statics");
4482
Francois Pichet02744872011-09-01 16:38:08 +00004483 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4484 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004485 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004486 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004487 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004488
Chandler Carruthe03aa552010-04-17 20:17:31 +00004489 // -fgnu-keywords default varies depending on language; only pass if
4490 // specified.
4491 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004492 options::OPT_fno_gnu_keywords))
4493 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004494
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004495 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004496 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004497 CmdArgs.push_back("-fgnu89-inline");
4498
Chad Rosier9c76d242012-03-15 22:31:42 +00004499 if (Args.hasArg(options::OPT_fno_inline))
4500 CmdArgs.push_back("-fno-inline");
4501
Chad Rosier64d6be92012-03-06 21:17:19 +00004502 if (Args.hasArg(options::OPT_fno_inline_functions))
4503 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004504
John McCall5fb5df92012-06-20 06:18:46 +00004505 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004506
John McCall5fb5df92012-06-20 06:18:46 +00004507 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004508 // legacy is the default. Except for deployment taget of 10.5,
4509 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4510 // gets ignored silently.
4511 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004512 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4513 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004514 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004515 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004516 if (getToolChain().UseObjCMixedDispatch())
4517 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4518 else
4519 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4520 }
4521 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004522
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004523 // When ObjectiveC legacy runtime is in effect on MacOSX,
4524 // turn on the option to do Array/Dictionary subscripting
4525 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004526 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004527 getToolChain().getTriple().isMacOSX() &&
4528 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4529 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004530 objcRuntime.isNeXTFamily())
4531 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004532
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004533 // -fencode-extended-block-signature=1 is default.
4534 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4535 CmdArgs.push_back("-fencode-extended-block-signature");
4536 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004537
John McCall24fc0de2011-07-06 00:26:06 +00004538 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4539 // NOTE: This logic is duplicated in ToolChains.cpp.
4540 bool ARC = isObjCAutoRefCount(Args);
4541 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004542 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004543
John McCall24fc0de2011-07-06 00:26:06 +00004544 CmdArgs.push_back("-fobjc-arc");
4545
Chandler Carruth491db322011-11-04 07:34:47 +00004546 // FIXME: It seems like this entire block, and several around it should be
4547 // wrapped in isObjC, but for now we just use it here as this is where it
4548 // was being used previously.
4549 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4550 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4551 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4552 else
4553 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4554 }
4555
John McCall24fc0de2011-07-06 00:26:06 +00004556 // Allow the user to enable full exceptions code emission.
4557 // We define off for Objective-CC, on for Objective-C++.
4558 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4559 options::OPT_fno_objc_arc_exceptions,
4560 /*default*/ types::isCXX(InputType)))
4561 CmdArgs.push_back("-fobjc-arc-exceptions");
4562 }
4563
4564 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4565 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004566 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004567 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004568
John McCall24fc0de2011-07-06 00:26:06 +00004569 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4570 // takes precedence.
4571 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4572 if (!GCArg)
4573 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4574 if (GCArg) {
4575 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004576 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004577 } else if (getToolChain().SupportsObjCGC()) {
4578 GCArg->render(Args, CmdArgs);
4579 } else {
4580 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004581 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004582 }
4583 }
4584
Bob Wilsonb111ec92015-03-02 19:01:14 +00004585 if (Args.hasFlag(options::OPT_fapplication_extension,
4586 options::OPT_fno_application_extension, false))
4587 CmdArgs.push_back("-fapplication-extension");
4588
Reid Klecknerc542d372014-06-27 17:02:02 +00004589 // Handle GCC-style exception args.
4590 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004591 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4592 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004593
4594 if (getToolChain().UseSjLjExceptions())
4595 CmdArgs.push_back("-fsjlj-exceptions");
4596
4597 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004598 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4599 options::OPT_fno_assume_sane_operator_new))
4600 CmdArgs.push_back("-fno-assume-sane-operator-new");
4601
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004602 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4603 // most platforms.
4604 if (Args.hasFlag(options::OPT_fsized_deallocation,
4605 options::OPT_fno_sized_deallocation, false))
4606 CmdArgs.push_back("-fsized-deallocation");
4607
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004608 // -fconstant-cfstrings is default, and may be subject to argument translation
4609 // on Darwin.
4610 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4611 options::OPT_fno_constant_cfstrings) ||
4612 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4613 options::OPT_mno_constant_cfstrings))
4614 CmdArgs.push_back("-fno-constant-cfstrings");
4615
John Thompsoned4e2952009-11-05 20:14:16 +00004616 // -fshort-wchar default varies depending on platform; only
4617 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004618 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4619 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004620 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004621
Hans Wennborg28c96312013-07-31 23:39:13 +00004622 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004623 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004624 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004625 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004626
Daniel Dunbar096ed292011-10-05 21:04:55 +00004627 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4628 // -fno-pack-struct doesn't apply to -fpack-struct=.
4629 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004630 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004631 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004632 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004633 } else if (Args.hasFlag(options::OPT_fpack_struct,
4634 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004635 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004636 }
4637
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004638 // Handle -fmax-type-align=N and -fno-type-align
4639 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4640 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4641 if (!SkipMaxTypeAlign) {
4642 std::string MaxTypeAlignStr = "-fmax-type-align=";
4643 MaxTypeAlignStr += A->getValue();
4644 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4645 }
4646 } else if (getToolChain().getTriple().isOSDarwin()) {
4647 if (!SkipMaxTypeAlign) {
4648 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4649 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4650 }
4651 }
4652
Robert Lytton0e076492013-08-13 09:43:10 +00004653 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004654 if (!Args.hasArg(options::OPT_fcommon))
4655 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004656 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004657 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004658
Daniel Dunbard18049a2009-04-07 21:16:11 +00004659 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004660 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004661 CmdArgs.push_back("-fno-common");
4662
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004663 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004664 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004665 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004666 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004667 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004668 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004669
Daniel Dunbar6358d682010-10-15 22:30:42 +00004670 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004671 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004672 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004673 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004674
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004675 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004676 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4677 StringRef value = inputCharset->getValue();
4678 if (value != "UTF-8")
4679 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4680 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004681 }
4682
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004683 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004684 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4685 StringRef value = execCharset->getValue();
4686 if (value != "UTF-8")
4687 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4688 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004689 }
4690
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004691 // -fcaret-diagnostics is default.
4692 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4693 options::OPT_fno_caret_diagnostics, true))
4694 CmdArgs.push_back("-fno-caret-diagnostics");
4695
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004696 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004697 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004698 options::OPT_fno_diagnostics_fixit_info))
4699 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004700
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004701 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004702 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004703 options::OPT_fno_diagnostics_show_option))
4704 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004705
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004706 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004707 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004708 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004709 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004710 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004712 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004713 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004714 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004715 }
4716
Chandler Carruthb6766f02011-03-27 01:50:55 +00004717 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004718 options::OPT_fdiagnostics_show_note_include_stack,
4719 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004720 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004721 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004722 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4723 else
4724 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4725 }
4726
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004727 // Color diagnostics are the default, unless the terminal doesn't support
4728 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004729 // Support both clang's -f[no-]color-diagnostics and gcc's
4730 // -f[no-]diagnostics-colors[=never|always|auto].
4731 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004732 for (const auto &Arg : Args) {
4733 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004734 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4735 !O.matches(options::OPT_fdiagnostics_color) &&
4736 !O.matches(options::OPT_fno_color_diagnostics) &&
4737 !O.matches(options::OPT_fno_diagnostics_color) &&
4738 !O.matches(options::OPT_fdiagnostics_color_EQ))
4739 continue;
4740
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004741 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004742 if (O.matches(options::OPT_fcolor_diagnostics) ||
4743 O.matches(options::OPT_fdiagnostics_color)) {
4744 ShowColors = Colors_On;
4745 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4746 O.matches(options::OPT_fno_diagnostics_color)) {
4747 ShowColors = Colors_Off;
4748 } else {
4749 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004750 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004751 if (value == "always")
4752 ShowColors = Colors_On;
4753 else if (value == "never")
4754 ShowColors = Colors_Off;
4755 else if (value == "auto")
4756 ShowColors = Colors_Auto;
4757 else
4758 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004759 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004760 }
4761 }
4762 if (ShowColors == Colors_On ||
4763 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004764 CmdArgs.push_back("-fcolor-diagnostics");
4765
Nico Rieck7857d462013-09-11 00:38:02 +00004766 if (Args.hasArg(options::OPT_fansi_escape_codes))
4767 CmdArgs.push_back("-fansi-escape-codes");
4768
Daniel Dunbardb097022009-06-08 21:13:54 +00004769 if (!Args.hasFlag(options::OPT_fshow_source_location,
4770 options::OPT_fno_show_source_location))
4771 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004772
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004773 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004774 true))
4775 CmdArgs.push_back("-fno-show-column");
4776
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004777 if (!Args.hasFlag(options::OPT_fspell_checking,
4778 options::OPT_fno_spell_checking))
4779 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004780
Chad Rosierc8e56e82012-12-05 21:08:21 +00004781 // -fno-asm-blocks is default.
4782 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4783 false))
4784 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004785
Steven Wucb0d13f2015-01-16 23:05:28 +00004786 // -fgnu-inline-asm is default.
4787 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4788 options::OPT_fno_gnu_inline_asm, true))
4789 CmdArgs.push_back("-fno-gnu-inline-asm");
4790
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004791 // Enable vectorization per default according to the optimization level
4792 // selected. For optimization levels that want vectorization we use the alias
4793 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004794 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004795 OptSpecifier VectorizeAliasOption =
4796 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004797 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004798 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004799 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004800
Chad Rosier136d67d2014-04-28 19:30:57 +00004801 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004802 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004803 OptSpecifier SLPVectAliasOption =
4804 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004805 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004806 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004807 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004808
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004809 // -fno-slp-vectorize-aggressive is default.
4810 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004811 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004812 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004813
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004814 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4815 A->render(Args, CmdArgs);
4816
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004817 // -fdollars-in-identifiers default varies depending on platform and
4818 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004819 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004820 options::OPT_fno_dollars_in_identifiers)) {
4821 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004822 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004823 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004824 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004825 }
4826
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004827 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4828 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004829 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004830 options::OPT_fno_unit_at_a_time)) {
4831 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004832 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004833 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004834
Eli Friedman055c9702011-11-02 01:53:16 +00004835 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4836 options::OPT_fno_apple_pragma_pack, false))
4837 CmdArgs.push_back("-fapple-pragma-pack");
4838
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004839 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004840 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4841 // by default.
4842 if (getToolChain().getArch() == llvm::Triple::le32) {
4843 CmdArgs.push_back("-fno-math-builtin");
4844 }
4845
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004846// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4847//
4848// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004849#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004850 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004851 (getToolChain().getArch() == llvm::Triple::arm ||
4852 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004853 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4854 CmdArgs.push_back("-fno-builtin-strcat");
4855 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4856 CmdArgs.push_back("-fno-builtin-strcpy");
4857 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004858#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004859
Justin Bognera88f0122014-06-20 22:59:50 +00004860 // Enable rewrite includes if the user's asked for it or if we're generating
4861 // diagnostics.
4862 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4863 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004864 if (Args.hasFlag(options::OPT_frewrite_includes,
4865 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004866 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004867 CmdArgs.push_back("-frewrite-includes");
4868
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004869 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004870 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004871 options::OPT_traditional_cpp)) {
4872 if (isa<PreprocessJobAction>(JA))
4873 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004874 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004875 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004876 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004877
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004878 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004879 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004880
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004881 // Handle serialized diagnostics.
4882 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4883 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004884 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004885 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004886
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004887 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4888 CmdArgs.push_back("-fretain-comments-from-system-headers");
4889
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004890 // Forward -fcomment-block-commands to -cc1.
4891 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004892 // Forward -fparse-all-comments to -cc1.
4893 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004894
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004895 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4896 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004897 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004898 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4899 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004900
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004901 // We translate this by hand to the -cc1 argument, since nightly test uses
4902 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004903 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004904 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004905 } else
Sean Silva14facf32015-06-09 01:57:17 +00004906 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004907 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004908
Bob Wilson23a55f12014-12-21 07:00:00 +00004909 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004910 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4911 // by the frontend.
4912 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4913 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004914
Daniel Dunbard67a3222009-03-30 06:36:42 +00004915 if (Output.getType() == types::TY_Dependencies) {
4916 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004917 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004918 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004919 CmdArgs.push_back(Output.getFilename());
4920 } else {
4921 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004922 }
4923
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004924 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004925
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004926 if (Input.isFilename())
4927 CmdArgs.push_back(Input.getFilename());
4928 else
4929 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004930
Chris Lattnere9d7d782009-11-03 19:50:27 +00004931 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4932
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004933 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004934
4935 // Optionally embed the -cc1 level arguments into the debug info, for build
4936 // analysis.
4937 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004938 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004939 for (const auto &Arg : Args)
4940 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004941
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004942 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004943 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004944 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004945 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004946 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004947 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004948 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004949 }
4950 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004951 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004952 }
4953
Eric Christopherd3804002013-02-22 20:12:52 +00004954 // Add the split debug info name to the command lines here so we
4955 // can propagate it to the backend.
4956 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004957 getToolChain().getTriple().isOSLinux() &&
4958 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4959 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004960 const char *SplitDwarfOut;
4961 if (SplitDwarf) {
4962 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004963 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004964 CmdArgs.push_back(SplitDwarfOut);
4965 }
4966
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004967 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
4968 // Include them with -fcuda-include-gpubinary.
4969 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00004970 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004971 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00004972 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004973 }
4974
Eric Christopherd3804002013-02-22 20:12:52 +00004975 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004976 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004977 Output.getType() == types::TY_Object &&
4978 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004979 auto CLCommand =
4980 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00004981 C.addCommand(llvm::make_unique<FallbackCommand>(
4982 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004983 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00004984 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004985 }
4986
Eric Christopherf1545832013-02-22 23:50:16 +00004987 // Handle the debug info splitting at object creation time if we're
4988 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004989 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004990 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004991 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004992
Roman Divacky178e01602011-02-10 16:52:03 +00004993 if (Arg *A = Args.getLastArg(options::OPT_pg))
4994 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004995 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
4996 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004997
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004998 // Claim some arguments which clang supports automatically.
4999
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005000 // -fpch-preprocess is used with gcc to add a special marker in the output to
5001 // include the PCH file. Clang's PTH solution is completely transparent, so we
5002 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005003 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005004
Daniel Dunbar17731772009-03-23 19:03:36 +00005005 // Claim some arguments which clang doesn't support, but we don't
5006 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005007 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5008 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005009
Rafael Espindolab0092d72013-09-04 19:37:35 +00005010 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005011 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005012}
5013
John McCall5fb5df92012-06-20 06:18:46 +00005014/// Add options related to the Objective-C runtime/ABI.
5015///
5016/// Returns true if the runtime is non-fragile.
5017ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5018 ArgStringList &cmdArgs,
5019 RewriteKind rewriteKind) const {
5020 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005021 Arg *runtimeArg =
5022 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5023 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005024
5025 // Just forward -fobjc-runtime= to the frontend. This supercedes
5026 // options about fragility.
5027 if (runtimeArg &&
5028 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5029 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005030 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005031 if (runtime.tryParse(value)) {
5032 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005033 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005034 }
5035
5036 runtimeArg->render(args, cmdArgs);
5037 return runtime;
5038 }
5039
5040 // Otherwise, we'll need the ABI "version". Version numbers are
5041 // slightly confusing for historical reasons:
5042 // 1 - Traditional "fragile" ABI
5043 // 2 - Non-fragile ABI, version 1
5044 // 3 - Non-fragile ABI, version 2
5045 unsigned objcABIVersion = 1;
5046 // If -fobjc-abi-version= is present, use that to set the version.
5047 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005048 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005049 if (value == "1")
5050 objcABIVersion = 1;
5051 else if (value == "2")
5052 objcABIVersion = 2;
5053 else if (value == "3")
5054 objcABIVersion = 3;
5055 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005056 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005057 } else {
5058 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005059 bool nonFragileABIIsDefault =
5060 (rewriteKind == RK_NonFragile ||
5061 (rewriteKind == RK_None &&
5062 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005063 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5064 options::OPT_fno_objc_nonfragile_abi,
5065 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005066// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005067#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5068 unsigned nonFragileABIVersion = 1;
5069#else
5070 unsigned nonFragileABIVersion = 2;
5071#endif
5072
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005073 if (Arg *abiArg =
5074 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005075 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005076 if (value == "1")
5077 nonFragileABIVersion = 1;
5078 else if (value == "2")
5079 nonFragileABIVersion = 2;
5080 else
5081 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005082 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005083 }
5084
5085 objcABIVersion = 1 + nonFragileABIVersion;
5086 } else {
5087 objcABIVersion = 1;
5088 }
5089 }
5090
5091 // We don't actually care about the ABI version other than whether
5092 // it's non-fragile.
5093 bool isNonFragile = objcABIVersion != 1;
5094
5095 // If we have no runtime argument, ask the toolchain for its default runtime.
5096 // However, the rewriter only really supports the Mac runtime, so assume that.
5097 ObjCRuntime runtime;
5098 if (!runtimeArg) {
5099 switch (rewriteKind) {
5100 case RK_None:
5101 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5102 break;
5103 case RK_Fragile:
5104 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5105 break;
5106 case RK_NonFragile:
5107 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5108 break;
5109 }
5110
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005111 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005112 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5113 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005114 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005115 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5116
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005117 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005118 } else {
5119 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5120 }
5121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005122 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005123 } else {
5124 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005125 // Legacy behaviour is to target the gnustep runtime if we are i
5126 // non-fragile mode or the GCC runtime in fragile mode.
5127 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005128 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005129 else
5130 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005131 }
5132
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005133 cmdArgs.push_back(
5134 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005135 return runtime;
5136}
5137
Reid Klecknerc542d372014-06-27 17:02:02 +00005138static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5139 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5140 I += HaveDash;
5141 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005142}
Reid Klecknerc542d372014-06-27 17:02:02 +00005143
5144struct EHFlags {
5145 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5146 bool Synch;
5147 bool Asynch;
5148 bool NoExceptC;
5149};
5150
5151/// /EH controls whether to run destructor cleanups when exceptions are
5152/// thrown. There are three modifiers:
5153/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5154/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5155/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5156/// - c: Assume that extern "C" functions are implicitly noexcept. This
5157/// modifier is an optimization, so we ignore it for now.
5158/// The default is /EHs-c-, meaning cleanups are disabled.
5159static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5160 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005161
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005162 std::vector<std::string> EHArgs =
5163 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005164 for (auto EHVal : EHArgs) {
5165 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5166 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005167 case 'a':
5168 EH.Asynch = maybeConsumeDash(EHVal, I);
5169 continue;
5170 case 'c':
5171 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5172 continue;
5173 case 's':
5174 EH.Synch = maybeConsumeDash(EHVal, I);
5175 continue;
5176 default:
5177 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005178 }
5179 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5180 break;
5181 }
5182 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005183
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005184 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5185 // can use -Xclang to manually enable C++ EH until then.
5186 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005187
Reid Klecknerc542d372014-06-27 17:02:02 +00005188 return EH;
5189}
5190
Hans Wennborg75958c42013-08-08 00:17:41 +00005191void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5192 unsigned RTOptionID = options::OPT__SLASH_MT;
5193
Hans Wennborgf1a74252013-09-10 20:18:04 +00005194 if (Args.hasArg(options::OPT__SLASH_LDd))
5195 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5196 // but defining _DEBUG is sticky.
5197 RTOptionID = options::OPT__SLASH_MTd;
5198
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005199 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005200 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005201
David Majnemere2afb472015-07-24 06:49:13 +00005202 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005203 switch (RTOptionID) {
5204 case options::OPT__SLASH_MD:
5205 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005206 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005207 CmdArgs.push_back("-D_MT");
5208 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005209 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005210 break;
5211 case options::OPT__SLASH_MDd:
5212 CmdArgs.push_back("-D_DEBUG");
5213 CmdArgs.push_back("-D_MT");
5214 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005215 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005216 break;
5217 case options::OPT__SLASH_MT:
5218 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005219 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005221 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005222 break;
5223 case options::OPT__SLASH_MTd:
5224 CmdArgs.push_back("-D_DEBUG");
5225 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005226 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005227 break;
5228 default:
5229 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005230 }
5231
David Majnemere2afb472015-07-24 06:49:13 +00005232 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5233 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5234 } else {
5235 CmdArgs.push_back(FlagForCRT.data());
5236
5237 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5238 // users want. The /Za flag to cl.exe turns this off, but it's not
5239 // implemented in clang.
5240 CmdArgs.push_back("--dependent-lib=oldnames");
5241 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005242
Hans Wennborg8858a032014-07-21 23:42:07 +00005243 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5244 // would produce interleaved output, so ignore /showIncludes in such cases.
5245 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5246 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5247 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005248
David Majnemerf6072342014-07-01 22:24:56 +00005249 // This controls whether or not we emit RTTI data for polymorphic types.
5250 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5251 /*default=*/false))
5252 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005253
Reid Klecknerc542d372014-06-27 17:02:02 +00005254 const Driver &D = getToolChain().getDriver();
5255 EHFlags EH = parseClangCLEHFlags(D, Args);
5256 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005257 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005258 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005259 CmdArgs.push_back("-fexceptions");
5260 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005261
Hans Wennborge50cec32014-06-13 20:59:54 +00005262 // /EP should expand to -E -P.
5263 if (Args.hasArg(options::OPT__SLASH_EP)) {
5264 CmdArgs.push_back("-E");
5265 CmdArgs.push_back("-P");
5266 }
5267
David Majnemera5b195a2015-02-14 01:35:12 +00005268 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005269 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5270 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005271 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5272 else
5273 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5274
5275 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5276 VolatileOptionID = A->getOption().getID();
5277
5278 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5279 CmdArgs.push_back("-fms-volatile");
5280
David Majnemer86c318f2014-02-11 21:05:00 +00005281 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5282 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5283 if (MostGeneralArg && BestCaseArg)
5284 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5285 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5286
5287 if (MostGeneralArg) {
5288 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5289 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5290 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5291
5292 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5293 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5294 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5295 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5296 << FirstConflict->getAsString(Args)
5297 << SecondConflict->getAsString(Args);
5298
5299 if (SingleArg)
5300 CmdArgs.push_back("-fms-memptr-rep=single");
5301 else if (MultipleArg)
5302 CmdArgs.push_back("-fms-memptr-rep=multiple");
5303 else
5304 CmdArgs.push_back("-fms-memptr-rep=virtual");
5305 }
5306
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005307 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5308 A->render(Args, CmdArgs);
5309
Hans Wennborg81f74482013-09-10 01:07:07 +00005310 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5311 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005312 if (Args.hasArg(options::OPT__SLASH_fallback))
5313 CmdArgs.push_back("msvc-fallback");
5314 else
5315 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005316 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005317}
5318
Douglas Katzman95354292015-06-23 20:42:09 +00005319visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005320 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005321 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005322 return CLFallback.get();
5323}
5324
Daniel Sanders7f933f42015-01-30 17:35:23 +00005325void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5326 ArgStringList &CmdArgs) const {
5327 StringRef CPUName;
5328 StringRef ABIName;
5329 const llvm::Triple &Triple = getToolChain().getTriple();
5330 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5331
5332 CmdArgs.push_back("-target-abi");
5333 CmdArgs.push_back(ABIName.data());
5334}
5335
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005336void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005337 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005338 const ArgList &Args,
5339 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005340 ArgStringList CmdArgs;
5341
5342 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5343 const InputInfo &Input = Inputs[0];
5344
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005345 // Don't warn about "clang -w -c foo.s"
5346 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005347 // and "clang -emit-llvm -c foo.s"
5348 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005349
Rafael Espindola577637a2015-01-03 00:06:04 +00005350 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005351
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005352 // Invoke ourselves in -cc1as mode.
5353 //
5354 // FIXME: Implement custom jobs for internal actions.
5355 CmdArgs.push_back("-cc1as");
5356
5357 // Add the "effective" target triple.
5358 CmdArgs.push_back("-triple");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005359 std::string TripleStr =
5360 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005361 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5362
5363 // Set the output mode, we currently only expect to be used as a real
5364 // assembler.
5365 CmdArgs.push_back("-filetype");
5366 CmdArgs.push_back("obj");
5367
Eric Christopher45f2e712012-12-18 00:31:10 +00005368 // Set the main file name, so that debug info works even with
5369 // -save-temps or preprocessed assembly.
5370 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005371 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005372
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005373 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005374 const llvm::Triple Triple(TripleStr);
Renato Golin7c542b42015-07-27 23:44:45 +00005375 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005376 if (!CPU.empty()) {
5377 CmdArgs.push_back("-target-cpu");
5378 CmdArgs.push_back(Args.MakeArgString(CPU));
5379 }
5380
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005381 // Add the target features
5382 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005383 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005384
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005385 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005386 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005387
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005388 // Pass along any -I options so we get proper .include search paths.
5389 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5390
Eric Christopherfc3ee562012-01-10 00:38:01 +00005391 // Determine the original source input.
5392 const Action *SourceAction = &JA;
5393 while (SourceAction->getKind() != Action::InputClass) {
5394 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5395 SourceAction = SourceAction->getInputs()[0];
5396 }
5397
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005398 // Forward -g and handle debug info related flags, assuming we are dealing
5399 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005400 if (SourceAction->getType() == types::TY_Asm ||
5401 SourceAction->getType() == types::TY_PP_Asm) {
5402 Args.ClaimAllArgs(options::OPT_g_Group);
5403 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5404 if (!A->getOption().matches(options::OPT_g0))
5405 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005406
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005407 if (Args.hasArg(options::OPT_gdwarf_2))
5408 CmdArgs.push_back("-gdwarf-2");
5409 if (Args.hasArg(options::OPT_gdwarf_3))
5410 CmdArgs.push_back("-gdwarf-3");
5411 if (Args.hasArg(options::OPT_gdwarf_4))
5412 CmdArgs.push_back("-gdwarf-4");
5413
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005414 // Add the -fdebug-compilation-dir flag if needed.
5415 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005416
5417 // Set the AT_producer to the clang version when using the integrated
5418 // assembler on assembly source files.
5419 CmdArgs.push_back("-dwarf-debug-producer");
5420 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005421
5422 // And pass along -I options
5423 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005424 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005425
5426 // Optionally embed the -cc1as level arguments into the debug info, for build
5427 // analysis.
5428 if (getToolChain().UseDwarfDebugFlags()) {
5429 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005430 for (const auto &Arg : Args)
5431 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005432
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005433 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005434 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5435 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005436 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005437 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005438 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005439 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005440 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005441 }
5442 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005443 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005444 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005445
5446 // FIXME: Add -static support, once we have it.
5447
Daniel Sanders7f933f42015-01-30 17:35:23 +00005448 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005449 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005450 default:
5451 break;
5452
5453 case llvm::Triple::mips:
5454 case llvm::Triple::mipsel:
5455 case llvm::Triple::mips64:
5456 case llvm::Triple::mips64el:
5457 AddMIPSTargetArgs(Args, CmdArgs);
5458 break;
5459 }
5460
David Blaikie372d9502014-01-17 03:17:40 +00005461 // Consume all the warning flags. Usually this would be handled more
5462 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5463 // doesn't handle that so rather than warning about unused flags that are
5464 // actually used, we'll lie by omission instead.
5465 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005466 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5467 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005468
David Blaikie9260ed62013-07-25 21:19:01 +00005469 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5470 getToolChain().getDriver());
5471
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005472 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005473
5474 assert(Output.isFilename() && "Unexpected lipo output.");
5475 CmdArgs.push_back("-o");
5476 CmdArgs.push_back(Output.getFilename());
5477
Daniel Dunbarb440f562010-08-02 02:38:21 +00005478 assert(Input.isFilename() && "Invalid input.");
5479 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005480
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005481 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005482 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005483
5484 // Handle the debug info splitting at object creation time if we're
5485 // creating an object.
5486 // TODO: Currently only works on linux with newer objcopy.
5487 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005488 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005489 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005490 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005491}
5492
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005493void GnuTool::anchor() {}
5494
Daniel Dunbara3246a02009-03-18 08:07:30 +00005495void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005496 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005497 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005498 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005499 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005500 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005501
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005502 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005503 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005504 // Don't forward any -g arguments to assembly steps.
5505 if (isa<AssembleJobAction>(JA) &&
5506 A->getOption().matches(options::OPT_g_Group))
5507 continue;
5508
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005509 // Don't forward any -W arguments to assembly and link steps.
5510 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5511 A->getOption().matches(options::OPT_W_Group))
5512 continue;
5513
Daniel Dunbar2da02722009-03-19 07:55:12 +00005514 // It is unfortunate that we have to claim here, as this means
5515 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005516 // platforms using a generic gcc, even if we are just using gcc
5517 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005518 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005519 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005520 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005521 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005522
Daniel Dunbar4e295052010-01-25 22:35:08 +00005523 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005524
5525 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005526 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005527 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005528 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005529 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005530 }
5531
Daniel Dunbar5716d872009-05-02 21:41:52 +00005532 // Try to force gcc to match the tool chain we want, if we recognize
5533 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005534 //
5535 // FIXME: The triple class should directly provide the information we want
5536 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005537 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005538 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005539 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005540 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5541 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005542 CmdArgs.push_back("-m64");
5543
Daniel Dunbarb440f562010-08-02 02:38:21 +00005544 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005545 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005546 CmdArgs.push_back(Output.getFilename());
5547 } else {
5548 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005549 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005550 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005551
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005552 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005553
5554 // Only pass -x if gcc will understand it; otherwise hope gcc
5555 // understands the suffix correctly. The main use case this would go
5556 // wrong in is for linker inputs if they happened to have an odd
5557 // suffix; really the only way to get this to happen is a command
5558 // like '-x foobar a.c' which will treat a.c like a linker input.
5559 //
5560 // FIXME: For the linker case specifically, can we safely convert
5561 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005562 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005563 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005564 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5565 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005566 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005567 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005568 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005569 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005570 else if (II.getType() == types::TY_ModuleFile)
5571 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005572 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005573
Daniel Dunbara3246a02009-03-18 08:07:30 +00005574 if (types::canTypeBeUserSpecified(II.getType())) {
5575 CmdArgs.push_back("-x");
5576 CmdArgs.push_back(types::getTypeName(II.getType()));
5577 }
5578
Daniel Dunbarb440f562010-08-02 02:38:21 +00005579 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005580 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005581 else {
5582 const Arg &A = II.getInputArg();
5583
5584 // Reverse translate some rewritten options.
5585 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5586 CmdArgs.push_back("-lstdc++");
5587 continue;
5588 }
5589
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005590 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005591 A.render(Args, CmdArgs);
5592 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005593 }
5594
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005595 const std::string customGCCName = D.getCCCGenericGCCName();
5596 const char *GCCName;
5597 if (!customGCCName.empty())
5598 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005599 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005600 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005601 } else
5602 GCCName = "gcc";
5603
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005604 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005605 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005606}
5607
Douglas Katzman95354292015-06-23 20:42:09 +00005608void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5609 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005610 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005611}
5612
Douglas Katzman95354292015-06-23 20:42:09 +00005613void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5614 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005615 const Driver &D = getToolChain().getDriver();
5616
Eric Christophercc7ff502015-01-29 00:56:17 +00005617 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005618 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005619 case types::TY_LLVM_IR:
5620 case types::TY_LTO_IR:
5621 case types::TY_LLVM_BC:
5622 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005623 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005624 break;
5625 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005626 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005627 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005628 case types::TY_Nothing:
5629 CmdArgs.push_back("-fsyntax-only");
5630 break;
5631 default:
5632 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005633 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005634}
5635
Douglas Katzman95354292015-06-23 20:42:09 +00005636void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5637 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005638 // The types are (hopefully) good enough.
5639}
5640
Tony Linthicum76329bf2011-12-12 21:14:55 +00005641// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005642void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5643 ArgStringList &CmdArgs) const {}
5644void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5645 const InputInfo &Output,
5646 const InputInfoList &Inputs,
5647 const ArgList &Args,
5648 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005649 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005650
5651 const Driver &D = getToolChain().getDriver();
5652 ArgStringList CmdArgs;
5653
5654 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005655 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005656 CmdArgs.push_back(Args.MakeArgString(MarchString));
5657
5658 RenderExtraToolArgs(JA, CmdArgs);
5659
5660 if (Output.isFilename()) {
5661 CmdArgs.push_back("-o");
5662 CmdArgs.push_back(Output.getFilename());
5663 } else {
5664 assert(Output.isNothing() && "Unexpected output");
5665 CmdArgs.push_back("-fsyntax-only");
5666 }
5667
Douglas Katzman54366072015-07-27 16:53:08 +00005668 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005669 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005670
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005671 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005672
Tony Linthicum76329bf2011-12-12 21:14:55 +00005673 // Only pass -x if gcc will understand it; otherwise hope gcc
5674 // understands the suffix correctly. The main use case this would go
5675 // wrong in is for linker inputs if they happened to have an odd
5676 // suffix; really the only way to get this to happen is a command
5677 // like '-x foobar a.c' which will treat a.c like a linker input.
5678 //
5679 // FIXME: For the linker case specifically, can we safely convert
5680 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005681 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005682 // Don't try to pass LLVM or AST inputs to a generic gcc.
5683 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5684 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5685 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005686 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005687 else if (II.getType() == types::TY_AST)
5688 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005689 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005690 else if (II.getType() == types::TY_ModuleFile)
5691 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005692 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005693
5694 if (II.isFilename())
5695 CmdArgs.push_back(II.getFilename());
5696 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005697 // Don't render as input, we need gcc to do the translations.
5698 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005699 II.getInputArg().render(Args, CmdArgs);
5700 }
5701
5702 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005703 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005704 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005705}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005706
Douglas Katzman95354292015-06-23 20:42:09 +00005707void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5708 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005709 // The types are (hopefully) good enough.
5710}
5711
Douglas Katzman54366072015-07-27 16:53:08 +00005712static void
5713constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5714 const toolchains::HexagonToolChain &ToolChain,
5715 const InputInfo &Output, const InputInfoList &Inputs,
5716 const ArgList &Args, ArgStringList &CmdArgs,
5717 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005718
Matthew Curtise689b052012-12-06 15:46:07 +00005719 const Driver &D = ToolChain.getDriver();
5720
Matthew Curtise689b052012-12-06 15:46:07 +00005721 //----------------------------------------------------------------------------
5722 //
5723 //----------------------------------------------------------------------------
5724 bool hasStaticArg = Args.hasArg(options::OPT_static);
5725 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005726 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005727 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5728 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5729 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005730 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005731 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005732
Matthew Curtise689b052012-12-06 15:46:07 +00005733 //----------------------------------------------------------------------------
5734 // Silence warnings for various options
5735 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005736
Matthew Curtise689b052012-12-06 15:46:07 +00005737 Args.ClaimAllArgs(options::OPT_g_Group);
5738 Args.ClaimAllArgs(options::OPT_emit_llvm);
5739 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5740 // handled somewhere else.
5741 Args.ClaimAllArgs(options::OPT_static_libgcc);
5742
5743 //----------------------------------------------------------------------------
5744 //
5745 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005746 for (const auto &Opt : ToolChain.ExtraOpts)
5747 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005748
Douglas Katzman54366072015-07-27 16:53:08 +00005749 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005750 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005751
Matthew Curtise689b052012-12-06 15:46:07 +00005752 if (buildingLib) {
5753 CmdArgs.push_back("-shared");
5754 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5755 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005756 }
5757
Matthew Curtise689b052012-12-06 15:46:07 +00005758 if (hasStaticArg)
5759 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005760
Matthew Curtise8f80a12012-12-06 17:49:03 +00005761 if (buildPIE && !buildingLib)
5762 CmdArgs.push_back("-pie");
5763
Douglas Katzman54366072015-07-27 16:53:08 +00005764 if (const char *v =
5765 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005766 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005767 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005768 }
5769
Matthew Curtise689b052012-12-06 15:46:07 +00005770 //----------------------------------------------------------------------------
5771 //
5772 //----------------------------------------------------------------------------
5773 CmdArgs.push_back("-o");
5774 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005775
Matthew Curtise689b052012-12-06 15:46:07 +00005776 const std::string MarchSuffix = "/" + MarchString;
5777 const std::string G0Suffix = "/G0";
5778 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005779 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005780 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005781 const std::string StartFilesDir =
5782 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005783
5784 //----------------------------------------------------------------------------
5785 // moslib
5786 //----------------------------------------------------------------------------
5787 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005788 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005789
Sean Silva14facf32015-06-09 01:57:17 +00005790 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5791 A->claim();
5792 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005793 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005794 }
Matthew Curtise689b052012-12-06 15:46:07 +00005795 if (oslibs.empty()) {
5796 oslibs.push_back("standalone");
5797 hasStandalone = true;
5798 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005799
Matthew Curtise689b052012-12-06 15:46:07 +00005800 //----------------------------------------------------------------------------
5801 // Start Files
5802 //----------------------------------------------------------------------------
5803 if (incStdLib && incStartFiles) {
5804
5805 if (!buildingLib) {
5806 if (hasStandalone) {
5807 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005808 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005809 }
5810 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5811 }
5812 std::string initObj = useShared ? "/initS.o" : "/init.o";
5813 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5814 }
5815
5816 //----------------------------------------------------------------------------
5817 // Library Search Paths
5818 //----------------------------------------------------------------------------
5819 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005820 for (const auto &LibPath : LibPaths)
5821 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005822
5823 //----------------------------------------------------------------------------
5824 //
5825 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005826 Args.AddAllArgs(CmdArgs,
5827 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5828 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005829
5830 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5831
5832 //----------------------------------------------------------------------------
5833 // Libraries
5834 //----------------------------------------------------------------------------
5835 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005836 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005837 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5838 CmdArgs.push_back("-lm");
5839 }
5840
5841 CmdArgs.push_back("--start-group");
5842
5843 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005844 for (const std::string &Lib : oslibs)
5845 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005846 CmdArgs.push_back("-lc");
5847 }
5848 CmdArgs.push_back("-lgcc");
5849
5850 CmdArgs.push_back("--end-group");
5851 }
5852
5853 //----------------------------------------------------------------------------
5854 // End files
5855 //----------------------------------------------------------------------------
5856 if (incStdLib && incStartFiles) {
5857 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5858 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5859 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005860}
5861
Douglas Katzman95354292015-06-23 20:42:09 +00005862void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5863 const InputInfo &Output,
5864 const InputInfoList &Inputs,
5865 const ArgList &Args,
5866 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005867
Douglas Katzman54366072015-07-27 16:53:08 +00005868 const toolchains::HexagonToolChain &ToolChain =
5869 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005870
5871 ArgStringList CmdArgs;
5872 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5873 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005874
5875 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005876 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005877 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005878}
5879// Hexagon tools end.
5880
Tom Stellard8fa33092015-07-18 01:49:05 +00005881void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5882 const InputInfo &Output,
5883 const InputInfoList &Inputs,
5884 const ArgList &Args,
5885 const char *LinkingOutput) const {
5886
5887 std::string Linker = getToolChain().GetProgramPath(getShortName());
5888 ArgStringList CmdArgs;
5889 CmdArgs.push_back("-flavor");
5890 CmdArgs.push_back("gnu");
5891 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00005892 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00005893 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5894 CmdArgs.push_back("-o");
5895 CmdArgs.push_back(Output.getFilename());
5896 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5897 CmdArgs, Inputs));
5898}
5899// AMDGPU tools end.
5900
Renato Golin7c542b42015-07-27 23:44:45 +00005901const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005902 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00005903 if (!Arch.empty())
5904 MArch = Arch;
5905 else
Bernard Ogden31561762013-12-12 13:27:11 +00005906 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005907 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005908
5909 // Handle -march=native.
5910 if (MArch == "native") {
5911 std::string CPU = llvm::sys::getHostCPUName();
5912 if (CPU != "generic") {
5913 // Translate the native cpu into the architecture suffix for that CPU.
5914 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5915 // If there is no valid architecture suffix for this CPU we don't know how
5916 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005917 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005918 MArch = "";
5919 else
5920 MArch = std::string("arm") + Suffix;
5921 }
5922 }
5923
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005924 return MArch;
5925}
5926/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005927const char *arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00005928 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005929 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5930 // here means an -march=native that we can't handle, so instead return no CPU.
5931 if (MArch.empty())
5932 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005933
John Brawna95c1a82015-05-08 12:52:18 +00005934 // We need to return an empty string here on invalid MArch values as the
5935 // various places that call this function can't cope with a null result.
5936 const char *result = Triple.getARMCPUForArch(MArch);
5937 if (result)
5938 return result;
5939 else
5940 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005941}
5942
5943/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005944std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005945 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005946 // FIXME: Warn on inconsistent use of -mcpu and -march.
5947 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00005948 if (!CPU.empty()) {
5949 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005950 // Handle -mcpu=native.
5951 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005952 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005953 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005954 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005955 }
5956
Renato Goline17c5802015-07-27 23:44:42 +00005957 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00005958}
5959
5960/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005961/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005962// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005963const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005964 if (CPU == "generic" &&
5965 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5966 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005967
Renato Golin3c007252015-05-28 15:05:53 +00005968 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5969 if (ArchKind == llvm::ARM::AK_INVALID)
5970 return "";
5971 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005972}
5973
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005975 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005976 if (Args.hasArg(options::OPT_r))
5977 return;
5978
John Brawn94fd9632015-05-21 12:19:49 +00005979 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5980 // to generate BE-8 executables.
5981 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5982 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005983}
5984
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005985mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5986 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5987 .Case("mips1", NanLegacy)
5988 .Case("mips2", NanLegacy)
5989 .Case("mips3", NanLegacy)
5990 .Case("mips4", NanLegacy)
5991 .Case("mips5", NanLegacy)
5992 .Case("mips32", NanLegacy)
5993 .Case("mips32r2", NanLegacy)
5994 .Case("mips32r3", NanLegacy | Nan2008)
5995 .Case("mips32r5", NanLegacy | Nan2008)
5996 .Case("mips32r6", Nan2008)
5997 .Case("mips64", NanLegacy)
5998 .Case("mips64r2", NanLegacy)
5999 .Case("mips64r3", NanLegacy | Nan2008)
6000 .Case("mips64r5", NanLegacy | Nan2008)
6001 .Case("mips64r6", Nan2008)
6002 .Default(NanLegacy);
6003}
6004
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006005bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6006 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6007 return A && (A->getValue() == StringRef(Value));
6008}
6009
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006010bool mips::isUCLibc(const ArgList &Args) {
6011 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006012 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006013}
6014
Daniel Sanders2bf13662014-07-10 14:40:57 +00006015bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006016 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6017 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006018 .Case("2008", true)
6019 .Case("legacy", false)
6020 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006021
6022 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006023 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006024 .Cases("mips32r6", "mips64r6", true)
6025 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006026
6027 return false;
6028}
6029
Daniel Sanders379d44b2014-07-16 11:52:23 +00006030bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006031 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006032 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006033 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006034 return false;
6035
6036 if (ABIName != "32")
6037 return false;
6038
Toma Tabacu94ea6862015-06-16 13:54:13 +00006039 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6040 // present.
6041 if (FloatABI == "soft")
6042 return false;
6043
Daniel Sanders379d44b2014-07-16 11:52:23 +00006044 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006045 .Cases("mips2", "mips3", "mips4", "mips5", true)
6046 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6047 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6048 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006049}
6050
Toma Tabacu94ea6862015-06-16 13:54:13 +00006051bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6052 StringRef CPUName, StringRef ABIName,
6053 StringRef FloatABI) {
6054 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6055
6056 // FPXX shouldn't be used if -msingle-float is present.
6057 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6058 options::OPT_mdouble_float))
6059 if (A->getOption().matches(options::OPT_msingle_float))
6060 UseFPXX = false;
6061
6062 return UseFPXX;
6063}
6064
Tim Northover157d9112014-01-16 08:48:16 +00006065llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006066 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6067 // archs which Darwin doesn't use.
6068
6069 // The matching this routine does is fairly pointless, since it is neither the
6070 // complete architecture list, nor a reasonable subset. The problem is that
6071 // historically the driver driver accepts this and also ties its -march=
6072 // handling to the architecture name, so we need to be careful before removing
6073 // support for it.
6074
6075 // This code must be kept in sync with Clang's Darwin specific argument
6076 // translation.
6077
6078 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006079 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6080 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6081 .Case("ppc64", llvm::Triple::ppc64)
6082 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6083 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6084 llvm::Triple::x86)
6085 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6086 // This is derived from the driver driver.
6087 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6088 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6089 .Cases("armv7s", "xscale", llvm::Triple::arm)
6090 .Case("arm64", llvm::Triple::aarch64)
6091 .Case("r600", llvm::Triple::r600)
6092 .Case("amdgcn", llvm::Triple::amdgcn)
6093 .Case("nvptx", llvm::Triple::nvptx)
6094 .Case("nvptx64", llvm::Triple::nvptx64)
6095 .Case("amdil", llvm::Triple::amdil)
6096 .Case("spir", llvm::Triple::spir)
6097 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006098}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006099
Tim Northover157d9112014-01-16 08:48:16 +00006100void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006101 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006102 T.setArch(Arch);
6103
6104 if (Str == "x86_64h")
6105 T.setArchName(Str);
6106 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6107 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006108 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006109 }
6110}
6111
Bob Wilsondecc03e2012-11-23 06:14:39 +00006112const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006113 const InputInfo &Input) {
6114 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006115}
6116
Bob Wilsondecc03e2012-11-23 06:14:39 +00006117const char *Clang::getBaseInputStem(const ArgList &Args,
6118 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006119 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006120
Chris Lattner906bb902011-01-16 08:14:11 +00006121 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006122 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006123
6124 return Str;
6125}
6126
Bob Wilsondecc03e2012-11-23 06:14:39 +00006127const char *Clang::getDependencyFileName(const ArgList &Args,
6128 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006129 // FIXME: Think about this more.
6130 std::string Res;
6131
6132 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006133 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006134 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006135 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006136 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006137 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006138 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006139}
6140
Douglas Katzman95354292015-06-23 20:42:09 +00006141void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6142 const InputInfo &Output,
6143 const InputInfoList &Inputs,
6144 const ArgList &Args,
6145 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006146 const ToolChain &ToolChain = getToolChain();
6147 const Driver &D = ToolChain.getDriver();
6148 ArgStringList CmdArgs;
6149
6150 // Silence warning for "clang -g foo.o -o foo"
6151 Args.ClaimAllArgs(options::OPT_g_Group);
6152 // and "clang -emit-llvm foo.o -o foo"
6153 Args.ClaimAllArgs(options::OPT_emit_llvm);
6154 // and for "clang -w foo.o -o foo". Other warning options are already
6155 // handled somewhere else.
6156 Args.ClaimAllArgs(options::OPT_w);
6157
6158 if (!D.SysRoot.empty())
6159 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6160
6161 // CloudABI only supports static linkage.
6162 CmdArgs.push_back("-Bstatic");
6163 CmdArgs.push_back("--eh-frame-hdr");
6164 CmdArgs.push_back("--gc-sections");
6165
6166 if (Output.isFilename()) {
6167 CmdArgs.push_back("-o");
6168 CmdArgs.push_back(Output.getFilename());
6169 } else {
6170 assert(Output.isNothing() && "Invalid output.");
6171 }
6172
6173 if (!Args.hasArg(options::OPT_nostdlib) &&
6174 !Args.hasArg(options::OPT_nostartfiles)) {
6175 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6176 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6177 }
6178
6179 Args.AddAllArgs(CmdArgs, options::OPT_L);
6180 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6181 for (const auto &Path : Paths)
6182 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006183 Args.AddAllArgs(CmdArgs,
6184 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6185 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006186
Alexey Samsonov907880e2015-06-19 19:57:46 +00006187 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006188 AddGoldPlugin(ToolChain, Args, CmdArgs);
6189
6190 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6191
6192 if (!Args.hasArg(options::OPT_nostdlib) &&
6193 !Args.hasArg(options::OPT_nodefaultlibs)) {
6194 if (D.CCCIsCXX())
6195 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6196 CmdArgs.push_back("-lc");
6197 CmdArgs.push_back("-lcompiler_rt");
6198 }
6199
6200 if (!Args.hasArg(options::OPT_nostdlib) &&
6201 !Args.hasArg(options::OPT_nostartfiles))
6202 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6203
6204 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006205 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006206}
6207
Douglas Katzman95354292015-06-23 20:42:09 +00006208void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6209 const InputInfo &Output,
6210 const InputInfoList &Inputs,
6211 const ArgList &Args,
6212 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006213 ArgStringList CmdArgs;
6214
6215 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6216 const InputInfo &Input = Inputs[0];
6217
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006218 // Determine the original source input.
6219 const Action *SourceAction = &JA;
6220 while (SourceAction->getKind() != Action::InputClass) {
6221 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6222 SourceAction = SourceAction->getInputs()[0];
6223 }
6224
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006225 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006226 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006227 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6228 // FIXME: at run-time detect assembler capabilities or rely on version
6229 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006230 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006231 const llvm::Triple &T(getToolChain().getTriple());
6232 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006233 CmdArgs.push_back("-Q");
6234 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006235
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006236 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006237 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006238 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006239 if (Args.hasArg(options::OPT_gstabs))
6240 CmdArgs.push_back("--gstabs");
6241 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006242 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006243 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006244
Daniel Dunbarbe220842009-03-20 16:06:39 +00006245 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006246 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006247
Daniel Dunbar6d484762010-07-22 01:47:22 +00006248 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006249 if (getToolChain().getArch() == llvm::Triple::x86 ||
6250 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006251 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6252 CmdArgs.push_back("-force_cpusubtype_ALL");
6253
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006254 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006255 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006256 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006257 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006258 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006259 CmdArgs.push_back("-static");
6260
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006261 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006262
6263 assert(Output.isFilename() && "Unexpected lipo output.");
6264 CmdArgs.push_back("-o");
6265 CmdArgs.push_back(Output.getFilename());
6266
Daniel Dunbarb440f562010-08-02 02:38:21 +00006267 assert(Input.isFilename() && "Invalid input.");
6268 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006269
6270 // asm_final spec is empty.
6271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006272 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006273 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006274}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006275
Tim Northover157d9112014-01-16 08:48:16 +00006276void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006277
Tim Northover157d9112014-01-16 08:48:16 +00006278void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6279 ArgStringList &CmdArgs) const {
6280 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006281
Daniel Dunbarc1964212009-03-26 16:23:12 +00006282 // Derived from darwin_arch spec.
6283 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006284 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006285
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006286 // FIXME: Is this needed anymore?
6287 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006288 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006289}
6290
Douglas Katzman95354292015-06-23 20:42:09 +00006291bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006292 // We only need to generate a temp path for LTO if we aren't compiling object
6293 // files. When compiling source files, we run 'dsymutil' after linking. We
6294 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006295 for (const auto &Input : Inputs)
6296 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006297 return true;
6298
6299 return false;
6300}
6301
Douglas Katzman95354292015-06-23 20:42:09 +00006302void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6303 ArgStringList &CmdArgs,
6304 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006305 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006306 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006307
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006308 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006309 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6310 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006311 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6312 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006313 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006314 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006315 }
6316
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006317 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006318 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006319 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6320 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006321
Bob Wilson3d27dad2013-08-02 22:25:34 +00006322 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6323 CmdArgs.push_back("-export_dynamic");
6324
Bob Wilsonb111ec92015-03-02 19:01:14 +00006325 // If we are using App Extension restrictions, pass a flag to the linker
6326 // telling it that the compiled code has been audited.
6327 if (Args.hasFlag(options::OPT_fapplication_extension,
6328 options::OPT_fno_application_extension, false))
6329 CmdArgs.push_back("-application_extension");
6330
Bill Wendling313b6bf2012-11-16 23:03:00 +00006331 // If we are using LTO, then automatically create a temporary file path for
6332 // the linker to use, so that it's lifetime will extend past a possible
6333 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006334 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006335 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006336 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006337 C.addTempFile(TmpPath);
6338 CmdArgs.push_back("-object_path_lto");
6339 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006340 }
6341
Daniel Dunbarc1964212009-03-26 16:23:12 +00006342 // Derived from the "link" spec.
6343 Args.AddAllArgs(CmdArgs, options::OPT_static);
6344 if (!Args.hasArg(options::OPT_static))
6345 CmdArgs.push_back("-dynamic");
6346 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6347 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6348 // here. How do we wish to handle such things?
6349 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006350
Daniel Dunbarc1964212009-03-26 16:23:12 +00006351 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006352 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006353 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006354 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006355
6356 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6357 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6358 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6359
6360 Arg *A;
6361 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6362 (A = Args.getLastArg(options::OPT_current__version)) ||
6363 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006364 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6365 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006366
6367 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6368 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6369 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6370 } else {
6371 CmdArgs.push_back("-dylib");
6372
6373 Arg *A;
6374 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6375 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6376 (A = Args.getLastArg(options::OPT_client__name)) ||
6377 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6378 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6379 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006380 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6381 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006382
Daniel Dunbarc1964212009-03-26 16:23:12 +00006383 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6384 "-dylib_compatibility_version");
6385 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6386 "-dylib_current_version");
6387
Tim Northover157d9112014-01-16 08:48:16 +00006388 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006389
6390 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6391 "-dylib_install_name");
6392 }
6393
6394 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6395 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6396 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006397 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006398 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006399 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6400 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6401 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6402 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6403 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6404 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006405 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006406 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6407 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6408 Args.AddAllArgs(CmdArgs, options::OPT_init);
6409
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006410 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006411 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006412
Daniel Dunbarc1964212009-03-26 16:23:12 +00006413 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6414 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6415 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6416 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6417 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006418
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006419 if (const Arg *A =
6420 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6421 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006422 if (A->getOption().matches(options::OPT_fpie) ||
6423 A->getOption().matches(options::OPT_fPIE))
6424 CmdArgs.push_back("-pie");
6425 else
6426 CmdArgs.push_back("-no_pie");
6427 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006428
6429 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6430 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6431 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6432 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6433 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6434 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6435 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6436 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6437 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6438 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6439 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6440 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6441 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6442 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6443 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6444 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006445
Daniel Dunbar84384642011-05-02 21:03:47 +00006446 // Give --sysroot= preference, over the Apple specific behavior to also use
6447 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006448 StringRef sysroot = C.getSysRoot();
6449 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006450 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006452 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6453 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006454 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006455 }
6456
Daniel Dunbarc1964212009-03-26 16:23:12 +00006457 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6458 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6459 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6460 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6461 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006462 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006463 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6464 Args.AddAllArgs(CmdArgs, options::OPT_y);
6465 Args.AddLastArg(CmdArgs, options::OPT_w);
6466 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6467 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6468 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6469 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6470 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6471 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6472 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6473 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6474 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6475 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6476 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6477 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6478}
6479
Douglas Katzman95354292015-06-23 20:42:09 +00006480void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6481 const InputInfo &Output,
6482 const InputInfoList &Inputs,
6483 const ArgList &Args,
6484 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006485 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006486
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006487 // If the number of arguments surpasses the system limits, we will encode the
6488 // input files in a separate file, shortening the command line. To this end,
6489 // build a list of input file names that can be passed via a file with the
6490 // -filelist linker option.
6491 llvm::opt::ArgStringList InputFileList;
6492
Daniel Dunbarc1964212009-03-26 16:23:12 +00006493 // The logic here is derived from gcc's behavior; most of which
6494 // comes from specs (starting with link_command). Consult gcc for
6495 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006496 ArgStringList CmdArgs;
6497
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006498 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6499 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6500 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006501 for (const auto &Arg : Args)
6502 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006503 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006504 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006505 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006506 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006507 return;
6508 }
6509
Daniel Dunbarc1964212009-03-26 16:23:12 +00006510 // I'm not sure why this particular decomposition exists in gcc, but
6511 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006512 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006513
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006514 // It seems that the 'e' option is completely ignored for dynamic executables
6515 // (the default), and with static executables, the last one wins, as expected.
6516 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6517 options::OPT_Z_Flag, options::OPT_u_Group,
6518 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006519
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006520 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6521 // members of static archive libraries which implement Objective-C classes or
6522 // categories.
6523 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6524 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006525
Daniel Dunbarc1964212009-03-26 16:23:12 +00006526 CmdArgs.push_back("-o");
6527 CmdArgs.push_back(Output.getFilename());
6528
Chad Rosier06fd3c62012-05-16 23:45:12 +00006529 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006530 !Args.hasArg(options::OPT_nostartfiles))
6531 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006532
Peter Collingbournec4122c12015-06-15 21:08:13 +00006533 // SafeStack requires its own runtime libraries
6534 // These libraries should be linked first, to make sure the
6535 // __safestack_init constructor executes before everything else
6536 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6537 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6538 "libclang_rt.safestack_osx.a",
6539 /*AlwaysLink=*/true);
6540 }
6541
Daniel Dunbarc1964212009-03-26 16:23:12 +00006542 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006543
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006544 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6545 options::OPT_fno_openmp, false)) {
6546 switch (getOpenMPRuntime(getToolChain(), Args)) {
6547 case OMPRT_OMP:
6548 CmdArgs.push_back("-lomp");
6549 break;
6550 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006551 CmdArgs.push_back("-lgomp");
6552 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006553 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006554 CmdArgs.push_back("-liomp5");
6555 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006556 case OMPRT_Unknown:
6557 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006558 break;
6559 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006560 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006561
Douglas Gregor9295df02012-05-15 21:00:27 +00006562 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006563 // Build the input file for -filelist (list of linker input files) in case we
6564 // need it later
6565 for (const auto &II : Inputs) {
6566 if (!II.isFilename()) {
6567 // This is a linker input argument.
6568 // We cannot mix input arguments and file names in a -filelist input, thus
6569 // we prematurely stop our list (remaining files shall be passed as
6570 // arguments).
6571 if (InputFileList.size() > 0)
6572 break;
6573
6574 continue;
6575 }
6576
6577 InputFileList.push_back(II.getFilename());
6578 }
6579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006580 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006581 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006582 // We use arclite library for both ARC and subscripting support.
6583 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6584
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006585 CmdArgs.push_back("-framework");
6586 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006587 // Link libobj.
6588 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006589 }
John McCall31168b02011-06-15 23:02:42 +00006590
Daniel Dunbarc1964212009-03-26 16:23:12 +00006591 if (LinkingOutput) {
6592 CmdArgs.push_back("-arch_multiple");
6593 CmdArgs.push_back("-final_output");
6594 CmdArgs.push_back(LinkingOutput);
6595 }
6596
Daniel Dunbarc1964212009-03-26 16:23:12 +00006597 if (Args.hasArg(options::OPT_fnested_functions))
6598 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006599
Justin Bognerc7701242015-05-12 05:44:36 +00006600 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6601 // paths are different enough from other toolchains that this needs a fair
6602 // amount of refactoring done first.
6603 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6604
Daniel Dunbarc1964212009-03-26 16:23:12 +00006605 if (!Args.hasArg(options::OPT_nostdlib) &&
6606 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006607 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006608 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006609
Daniel Dunbarc1964212009-03-26 16:23:12 +00006610 // link_ssp spec is empty.
6611
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006612 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006613 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006614 }
6615
Chad Rosier06fd3c62012-05-16 23:45:12 +00006616 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006617 !Args.hasArg(options::OPT_nostartfiles)) {
6618 // endfile_spec is empty.
6619 }
6620
6621 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6622 Args.AddAllArgs(CmdArgs, options::OPT_F);
6623
Steven Wu3ffb61b2015-02-06 18:08:29 +00006624 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006625 for (const Arg *A : Args.filtered(options::OPT_iframework))
6626 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006627
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006628 if (!Args.hasArg(options::OPT_nostdlib) &&
6629 !Args.hasArg(options::OPT_nodefaultlibs)) {
6630 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6631 if (A->getValue() == StringRef("Accelerate")) {
6632 CmdArgs.push_back("-framework");
6633 CmdArgs.push_back("Accelerate");
6634 }
6635 }
6636 }
6637
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006638 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006639 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006640 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006641 Cmd->setInputFileList(std::move(InputFileList));
6642 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006643}
6644
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006645void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006646 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006647 const InputInfoList &Inputs,
6648 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006649 const char *LinkingOutput) const {
6650 ArgStringList CmdArgs;
6651
6652 CmdArgs.push_back("-create");
6653 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006654
6655 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006656 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006657
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006658 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006659 assert(II.isFilename() && "Unexpected lipo input.");
6660 CmdArgs.push_back(II.getFilename());
6661 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006662
6663 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006664 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006665}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006666
Daniel Dunbar88299622010-06-04 18:28:36 +00006667void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006668 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006669 const InputInfoList &Inputs,
6670 const ArgList &Args,
6671 const char *LinkingOutput) const {
6672 ArgStringList CmdArgs;
6673
Daniel Dunbareb86b042011-05-09 17:23:16 +00006674 CmdArgs.push_back("-o");
6675 CmdArgs.push_back(Output.getFilename());
6676
Daniel Dunbar88299622010-06-04 18:28:36 +00006677 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6678 const InputInfo &Input = Inputs[0];
6679 assert(Input.isFilename() && "Unexpected dsymutil input.");
6680 CmdArgs.push_back(Input.getFilename());
6681
Daniel Dunbar88299622010-06-04 18:28:36 +00006682 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006683 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006684 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006685}
6686
Eric Christopher551ef452011-08-23 17:56:55 +00006687void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006688 const InputInfo &Output,
6689 const InputInfoList &Inputs,
6690 const ArgList &Args,
6691 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006692 ArgStringList CmdArgs;
6693 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006694 CmdArgs.push_back("--debug-info");
6695 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006696 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006697
6698 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6699 const InputInfo &Input = Inputs[0];
6700 assert(Input.isFilename() && "Unexpected verify input");
6701
6702 // Grabbing the output of the earlier dsymutil run.
6703 CmdArgs.push_back(Input.getFilename());
6704
6705 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006706 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006707 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006708}
6709
Douglas Katzman95354292015-06-23 20:42:09 +00006710void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006711 const InputInfo &Output,
6712 const InputInfoList &Inputs,
6713 const ArgList &Args,
6714 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006715 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006716 ArgStringList CmdArgs;
6717
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006718 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006719
6720 CmdArgs.push_back("-o");
6721 CmdArgs.push_back(Output.getFilename());
6722
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006723 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006724 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006725
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006726 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006727 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006728}
6729
Douglas Katzman95354292015-06-23 20:42:09 +00006730void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6731 const InputInfo &Output,
6732 const InputInfoList &Inputs,
6733 const ArgList &Args,
6734 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006735 // FIXME: Find a real GCC, don't hard-code versions here
6736 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6737 const llvm::Triple &T = getToolChain().getTriple();
6738 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006739 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006740 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006741 case llvm::Triple::x86:
6742 GCCLibPath +=
6743 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6744 break;
6745 case llvm::Triple::x86_64:
6746 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6747 GCCLibPath += "/4.5.2/amd64/";
6748 LibPath += "amd64/";
6749 break;
6750 default:
6751 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006752 }
6753
6754 ArgStringList CmdArgs;
6755
David Chisnall272a0712012-02-29 15:06:12 +00006756 // Demangle C++ names in errors
6757 CmdArgs.push_back("-C");
6758
David Chisnallf571cde2012-02-15 13:39:01 +00006759 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6760 (!Args.hasArg(options::OPT_shared))) {
6761 CmdArgs.push_back("-e");
6762 CmdArgs.push_back("_start");
6763 }
6764
6765 if (Args.hasArg(options::OPT_static)) {
6766 CmdArgs.push_back("-Bstatic");
6767 CmdArgs.push_back("-dn");
6768 } else {
6769 CmdArgs.push_back("-Bdynamic");
6770 if (Args.hasArg(options::OPT_shared)) {
6771 CmdArgs.push_back("-shared");
6772 } else {
6773 CmdArgs.push_back("--dynamic-linker");
6774 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6775 }
6776 }
6777
6778 if (Output.isFilename()) {
6779 CmdArgs.push_back("-o");
6780 CmdArgs.push_back(Output.getFilename());
6781 } else {
6782 assert(Output.isNothing() && "Invalid output.");
6783 }
6784
6785 if (!Args.hasArg(options::OPT_nostdlib) &&
6786 !Args.hasArg(options::OPT_nostartfiles)) {
6787 if (!Args.hasArg(options::OPT_shared)) {
6788 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6789 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006790 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006791 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6792 } else {
6793 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006794 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6795 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006796 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006797 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006798 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006799 }
6800
6801 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6802
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006803 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6804 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006805
6806 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6807
6808 if (!Args.hasArg(options::OPT_nostdlib) &&
6809 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006810 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006811 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006812 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006813 if (!Args.hasArg(options::OPT_shared)) {
6814 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006815 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006816 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006817 }
David Chisnallf571cde2012-02-15 13:39:01 +00006818 }
6819
6820 if (!Args.hasArg(options::OPT_nostdlib) &&
6821 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006822 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006823 }
David Chisnall96de9932012-02-16 16:00:47 +00006824 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006825
Alexey Samsonov7811d192014-02-20 13:57:37 +00006826 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006827
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006828 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006829 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006830}
6831
Douglas Katzman95354292015-06-23 20:42:09 +00006832void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6833 const InputInfo &Output,
6834 const InputInfoList &Inputs,
6835 const ArgList &Args,
6836 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006837 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006838 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006839 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006840
Rafael Espindolacc126272014-02-28 01:55:21 +00006841 switch (getToolChain().getArch()) {
6842 case llvm::Triple::x86:
6843 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6844 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006845 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006846 break;
6847
6848 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006849 CmdArgs.push_back("-mppc");
6850 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006851 break;
6852
6853 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006854 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006855 CmdArgs.push_back("-32");
6856 NeedsKPIC = true;
6857 break;
6858
6859 case llvm::Triple::sparcv9:
6860 CmdArgs.push_back("-64");
6861 CmdArgs.push_back("-Av9a");
6862 NeedsKPIC = true;
6863 break;
6864
6865 case llvm::Triple::mips64:
6866 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006867 StringRef CPUName;
6868 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006869 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006870
6871 CmdArgs.push_back("-mabi");
6872 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6873
6874 if (getToolChain().getArch() == llvm::Triple::mips64)
6875 CmdArgs.push_back("-EB");
6876 else
6877 CmdArgs.push_back("-EL");
6878
Rafael Espindolacc126272014-02-28 01:55:21 +00006879 NeedsKPIC = true;
6880 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006881 }
6882
Rafael Espindolacc126272014-02-28 01:55:21 +00006883 default:
6884 break;
6885 }
6886
6887 if (NeedsKPIC)
6888 addAssemblerKPIC(Args, CmdArgs);
6889
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006890 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006891
6892 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006893 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006894
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006895 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006896 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006897
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006898 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006899 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006900}
6901
Douglas Katzman95354292015-06-23 20:42:09 +00006902void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6903 const InputInfo &Output,
6904 const InputInfoList &Inputs,
6905 const ArgList &Args,
6906 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006907 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006908 ArgStringList CmdArgs;
6909
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006910 // Silence warning for "clang -g foo.o -o foo"
6911 Args.ClaimAllArgs(options::OPT_g_Group);
6912 // and "clang -emit-llvm foo.o -o foo"
6913 Args.ClaimAllArgs(options::OPT_emit_llvm);
6914 // and for "clang -w foo.o -o foo". Other warning options are already
6915 // handled somewhere else.
6916 Args.ClaimAllArgs(options::OPT_w);
6917
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006918 if (getToolChain().getArch() == llvm::Triple::mips64)
6919 CmdArgs.push_back("-EB");
6920 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6921 CmdArgs.push_back("-EL");
6922
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006923 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006924 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006925 CmdArgs.push_back("-e");
6926 CmdArgs.push_back("__start");
6927 }
6928
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006929 if (Args.hasArg(options::OPT_static)) {
6930 CmdArgs.push_back("-Bstatic");
6931 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006932 if (Args.hasArg(options::OPT_rdynamic))
6933 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006934 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006935 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006936 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006937 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006938 } else {
6939 CmdArgs.push_back("-dynamic-linker");
6940 CmdArgs.push_back("/usr/libexec/ld.so");
6941 }
6942 }
6943
Rafael Espindola044f7832013-06-05 04:28:55 +00006944 if (Args.hasArg(options::OPT_nopie))
6945 CmdArgs.push_back("-nopie");
6946
Daniel Dunbarb440f562010-08-02 02:38:21 +00006947 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006948 CmdArgs.push_back("-o");
6949 CmdArgs.push_back(Output.getFilename());
6950 } else {
6951 assert(Output.isNothing() && "Invalid output.");
6952 }
6953
6954 if (!Args.hasArg(options::OPT_nostdlib) &&
6955 !Args.hasArg(options::OPT_nostartfiles)) {
6956 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006957 if (Args.hasArg(options::OPT_pg))
6958 CmdArgs.push_back(
6959 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00006960 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006961 CmdArgs.push_back(
6962 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6963 CmdArgs.push_back(
6964 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006965 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006966 CmdArgs.push_back(
6967 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006968 }
6969 }
6970
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006971 std::string Triple = getToolChain().getTripleString();
6972 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006973 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006974 CmdArgs.push_back(
6975 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006976
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006977 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6978 options::OPT_e, options::OPT_s, options::OPT_t,
6979 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006980
Daniel Dunbar54423b22010-09-17 00:24:54 +00006981 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006982
6983 if (!Args.hasArg(options::OPT_nostdlib) &&
6984 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006985 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006986 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006987 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006988 CmdArgs.push_back("-lm_p");
6989 else
6990 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006991 }
6992
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006993 // FIXME: For some reason GCC passes -lgcc before adding
6994 // the default system libraries. Just mimic this for now.
6995 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006996
Eric Christopher17674ec2012-09-13 06:32:34 +00006997 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006998 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
6999 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007000 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007001 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007002 }
7003
Chandler Carruth45661652011-12-17 22:32:42 +00007004 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007005 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007006 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007007 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007008 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007009 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007010
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007011 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007012 }
7013
7014 if (!Args.hasArg(options::OPT_nostdlib) &&
7015 !Args.hasArg(options::OPT_nostartfiles)) {
7016 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007017 CmdArgs.push_back(
7018 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007019 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007020 CmdArgs.push_back(
7021 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007022 }
7023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007024 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007025 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007026}
Ed Schoutene33194b2009-04-02 19:13:12 +00007027
Douglas Katzman95354292015-06-23 20:42:09 +00007028void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7029 const InputInfo &Output,
7030 const InputInfoList &Inputs,
7031 const ArgList &Args,
7032 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007033 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007034 ArgStringList CmdArgs;
7035
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007036 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007037
7038 CmdArgs.push_back("-o");
7039 CmdArgs.push_back(Output.getFilename());
7040
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007041 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007042 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007043
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007044 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007045 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007046}
7047
Douglas Katzman95354292015-06-23 20:42:09 +00007048void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7049 const InputInfo &Output,
7050 const InputInfoList &Inputs,
7051 const ArgList &Args,
7052 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007053 const Driver &D = getToolChain().getDriver();
7054 ArgStringList CmdArgs;
7055
7056 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7057 (!Args.hasArg(options::OPT_shared))) {
7058 CmdArgs.push_back("-e");
7059 CmdArgs.push_back("__start");
7060 }
7061
7062 if (Args.hasArg(options::OPT_static)) {
7063 CmdArgs.push_back("-Bstatic");
7064 } else {
7065 if (Args.hasArg(options::OPT_rdynamic))
7066 CmdArgs.push_back("-export-dynamic");
7067 CmdArgs.push_back("--eh-frame-hdr");
7068 CmdArgs.push_back("-Bdynamic");
7069 if (Args.hasArg(options::OPT_shared)) {
7070 CmdArgs.push_back("-shared");
7071 } else {
7072 CmdArgs.push_back("-dynamic-linker");
7073 CmdArgs.push_back("/usr/libexec/ld.so");
7074 }
7075 }
7076
7077 if (Output.isFilename()) {
7078 CmdArgs.push_back("-o");
7079 CmdArgs.push_back(Output.getFilename());
7080 } else {
7081 assert(Output.isNothing() && "Invalid output.");
7082 }
7083
7084 if (!Args.hasArg(options::OPT_nostdlib) &&
7085 !Args.hasArg(options::OPT_nostartfiles)) {
7086 if (!Args.hasArg(options::OPT_shared)) {
7087 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007088 CmdArgs.push_back(
7089 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007090 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007091 CmdArgs.push_back(
7092 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7093 CmdArgs.push_back(
7094 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007095 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007096 CmdArgs.push_back(
7097 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007098 }
7099 }
7100
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007101 Args.AddAllArgs(CmdArgs,
7102 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007103
7104 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7105
7106 if (!Args.hasArg(options::OPT_nostdlib) &&
7107 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007108 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007109 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7110 if (Args.hasArg(options::OPT_pg))
7111 CmdArgs.push_back("-lm_p");
7112 else
7113 CmdArgs.push_back("-lm");
7114 }
7115
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007116 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007117 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007118 CmdArgs.push_back("-lpthread_p");
7119 else
7120 CmdArgs.push_back("-lpthread");
7121 }
7122
Eli Friedman9fa28852012-08-08 23:57:20 +00007123 if (!Args.hasArg(options::OPT_shared)) {
7124 if (Args.hasArg(options::OPT_pg))
7125 CmdArgs.push_back("-lc_p");
7126 else
7127 CmdArgs.push_back("-lc");
7128 }
7129
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007130 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007131 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007132 case llvm::Triple::arm:
7133 MyArch = "arm";
7134 break;
7135 case llvm::Triple::x86:
7136 MyArch = "i386";
7137 break;
7138 case llvm::Triple::x86_64:
7139 MyArch = "amd64";
7140 break;
7141 default:
7142 llvm_unreachable("Unsupported architecture");
7143 }
7144 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007145 }
7146
7147 if (!Args.hasArg(options::OPT_nostdlib) &&
7148 !Args.hasArg(options::OPT_nostartfiles)) {
7149 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007150 CmdArgs.push_back(
7151 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007152 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007153 CmdArgs.push_back(
7154 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007155 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007156
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007157 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007158 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007159}
7160
Douglas Katzman95354292015-06-23 20:42:09 +00007161void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7162 const InputInfo &Output,
7163 const InputInfoList &Inputs,
7164 const ArgList &Args,
7165 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007166 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007167 ArgStringList CmdArgs;
7168
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007169 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7170 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007171 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007172 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007173 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007174 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007175 else if (getToolChain().getArch() == llvm::Triple::mips ||
7176 getToolChain().getArch() == llvm::Triple::mipsel ||
7177 getToolChain().getArch() == llvm::Triple::mips64 ||
7178 getToolChain().getArch() == llvm::Triple::mips64el) {
7179 StringRef CPUName;
7180 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007181 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007182
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007183 CmdArgs.push_back("-march");
7184 CmdArgs.push_back(CPUName.data());
7185
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007186 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007187 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007188
7189 if (getToolChain().getArch() == llvm::Triple::mips ||
7190 getToolChain().getArch() == llvm::Triple::mips64)
7191 CmdArgs.push_back("-EB");
7192 else
7193 CmdArgs.push_back("-EL");
7194
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007195 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007196 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007197 getToolChain().getArch() == llvm::Triple::armeb ||
7198 getToolChain().getArch() == llvm::Triple::thumb ||
7199 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007200 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007201 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007202 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7203
7204 if (FloatABI == "hard") {
7205 CmdArgs.push_back("-mfpu=vfp");
7206 } else {
7207 CmdArgs.push_back("-mfpu=softvfp");
7208 }
7209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007210 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007211 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007212 case llvm::Triple::GNUEABI:
7213 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007214 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007215 break;
7216
7217 default:
7218 CmdArgs.push_back("-matpcs");
7219 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007220 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007221 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007222 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007223 if (getToolChain().getArch() == llvm::Triple::sparc)
7224 CmdArgs.push_back("-Av8plusa");
7225 else
7226 CmdArgs.push_back("-Av9a");
7227
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007228 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007229 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007230
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007231 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007232
7233 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007234 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007235
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007236 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007237 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007238
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007239 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007240 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007241}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007242
Douglas Katzman95354292015-06-23 20:42:09 +00007243void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7244 const InputInfo &Output,
7245 const InputInfoList &Inputs,
7246 const ArgList &Args,
7247 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007248 const toolchains::FreeBSD &ToolChain =
7249 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007250 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007251 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007252 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007253 !Args.hasArg(options::OPT_shared) &&
7254 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007255 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007256
7257 // Silence warning for "clang -g foo.o -o foo"
7258 Args.ClaimAllArgs(options::OPT_g_Group);
7259 // and "clang -emit-llvm foo.o -o foo"
7260 Args.ClaimAllArgs(options::OPT_emit_llvm);
7261 // and for "clang -w foo.o -o foo". Other warning options are already
7262 // handled somewhere else.
7263 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007264
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007265 if (!D.SysRoot.empty())
7266 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7267
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007268 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007269 CmdArgs.push_back("-pie");
7270
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007271 if (Args.hasArg(options::OPT_static)) {
7272 CmdArgs.push_back("-Bstatic");
7273 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007274 if (Args.hasArg(options::OPT_rdynamic))
7275 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007276 CmdArgs.push_back("--eh-frame-hdr");
7277 if (Args.hasArg(options::OPT_shared)) {
7278 CmdArgs.push_back("-Bshareable");
7279 } else {
7280 CmdArgs.push_back("-dynamic-linker");
7281 CmdArgs.push_back("/libexec/ld-elf.so.1");
7282 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007283 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007284 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7285 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7286 CmdArgs.push_back("--hash-style=both");
7287 }
7288 }
7289 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007290 }
7291
7292 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7293 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007294 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007295 CmdArgs.push_back("-m");
7296 CmdArgs.push_back("elf_i386_fbsd");
7297 }
7298
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007299 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007300 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007301 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007302 }
7303
Daniel Dunbarb440f562010-08-02 02:38:21 +00007304 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007305 CmdArgs.push_back("-o");
7306 CmdArgs.push_back(Output.getFilename());
7307 } else {
7308 assert(Output.isNothing() && "Invalid output.");
7309 }
7310
7311 if (!Args.hasArg(options::OPT_nostdlib) &&
7312 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007313 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007314 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007315 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007316 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007317 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007318 crt1 = "Scrt1.o";
7319 else
7320 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007321 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007322 if (crt1)
7323 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7324
7325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7326
Craig Topper92fc2df2014-05-17 16:56:41 +00007327 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007328 if (Args.hasArg(options::OPT_static))
7329 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007330 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007331 crtbegin = "crtbeginS.o";
7332 else
7333 crtbegin = "crtbegin.o";
7334
7335 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007336 }
7337
7338 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007339 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007340 for (const auto &Path : Paths)
7341 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007342 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7343 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007344 Args.AddAllArgs(CmdArgs, options::OPT_s);
7345 Args.AddAllArgs(CmdArgs, options::OPT_t);
7346 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7347 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007348
Alexey Samsonov907880e2015-06-19 19:57:46 +00007349 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007350 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007351
Alexey Samsonov52550342014-09-15 19:58:40 +00007352 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007353 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007354
7355 if (!Args.hasArg(options::OPT_nostdlib) &&
7356 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007357 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007358 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007359 if (Args.hasArg(options::OPT_pg))
7360 CmdArgs.push_back("-lm_p");
7361 else
7362 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007363 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007364 if (NeedsSanitizerDeps)
7365 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007366 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7367 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007368 if (Args.hasArg(options::OPT_pg))
7369 CmdArgs.push_back("-lgcc_p");
7370 else
7371 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007372 if (Args.hasArg(options::OPT_static)) {
7373 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007374 } else if (Args.hasArg(options::OPT_pg)) {
7375 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007376 } else {
7377 CmdArgs.push_back("--as-needed");
7378 CmdArgs.push_back("-lgcc_s");
7379 CmdArgs.push_back("--no-as-needed");
7380 }
7381
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007382 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007383 if (Args.hasArg(options::OPT_pg))
7384 CmdArgs.push_back("-lpthread_p");
7385 else
7386 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007387 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007388
Roman Divacky66f22762011-02-10 16:59:40 +00007389 if (Args.hasArg(options::OPT_pg)) {
7390 if (Args.hasArg(options::OPT_shared))
7391 CmdArgs.push_back("-lc");
7392 else
7393 CmdArgs.push_back("-lc_p");
7394 CmdArgs.push_back("-lgcc_p");
7395 } else {
7396 CmdArgs.push_back("-lc");
7397 CmdArgs.push_back("-lgcc");
7398 }
7399
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007400 if (Args.hasArg(options::OPT_static)) {
7401 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007402 } else if (Args.hasArg(options::OPT_pg)) {
7403 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007404 } else {
7405 CmdArgs.push_back("--as-needed");
7406 CmdArgs.push_back("-lgcc_s");
7407 CmdArgs.push_back("--no-as-needed");
7408 }
7409 }
7410
7411 if (!Args.hasArg(options::OPT_nostdlib) &&
7412 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007413 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007414 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007415 else
7416 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007417 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007418 }
7419
Alexey Samsonov7811d192014-02-20 13:57:37 +00007420 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007421
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007422 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007423 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007424}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007425
Douglas Katzman95354292015-06-23 20:42:09 +00007426void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007427 const InputInfo &Output,
7428 const InputInfoList &Inputs,
7429 const ArgList &Args,
7430 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007431 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007432 ArgStringList CmdArgs;
7433
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007434 // GNU as needs different flags for creating the correct output format
7435 // on architectures with different ABIs or optional feature sets.
7436 switch (getToolChain().getArch()) {
7437 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007438 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007439 break;
7440 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007441 case llvm::Triple::armeb:
7442 case llvm::Triple::thumb:
7443 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007444 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007445 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7446 std::string Arch =
7447 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007448 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007449 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007450 }
7451
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007452 case llvm::Triple::mips:
7453 case llvm::Triple::mipsel:
7454 case llvm::Triple::mips64:
7455 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007456 StringRef CPUName;
7457 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007458 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007459
7460 CmdArgs.push_back("-march");
7461 CmdArgs.push_back(CPUName.data());
7462
7463 CmdArgs.push_back("-mabi");
7464 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7465
7466 if (getToolChain().getArch() == llvm::Triple::mips ||
7467 getToolChain().getArch() == llvm::Triple::mips64)
7468 CmdArgs.push_back("-EB");
7469 else
7470 CmdArgs.push_back("-EL");
7471
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007472 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007473 break;
7474 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007475
7476 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007477 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007478 CmdArgs.push_back("-32");
7479 addAssemblerKPIC(Args, CmdArgs);
7480 break;
7481
7482 case llvm::Triple::sparcv9:
7483 CmdArgs.push_back("-64");
7484 CmdArgs.push_back("-Av9");
7485 addAssemblerKPIC(Args, CmdArgs);
7486 break;
7487
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007488 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007489 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007490 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007491
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007492 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007493
7494 CmdArgs.push_back("-o");
7495 CmdArgs.push_back(Output.getFilename());
7496
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007497 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007498 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007499
David Chisnallddbd68f2011-09-27 22:03:18 +00007500 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007501 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007502}
7503
Douglas Katzman95354292015-06-23 20:42:09 +00007504void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7505 const InputInfo &Output,
7506 const InputInfoList &Inputs,
7507 const ArgList &Args,
7508 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007509 const Driver &D = getToolChain().getDriver();
7510 ArgStringList CmdArgs;
7511
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007512 if (!D.SysRoot.empty())
7513 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7514
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007515 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007516 if (Args.hasArg(options::OPT_static)) {
7517 CmdArgs.push_back("-Bstatic");
7518 } else {
7519 if (Args.hasArg(options::OPT_rdynamic))
7520 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007521 if (Args.hasArg(options::OPT_shared)) {
7522 CmdArgs.push_back("-Bshareable");
7523 } else {
7524 CmdArgs.push_back("-dynamic-linker");
7525 CmdArgs.push_back("/libexec/ld.elf_so");
7526 }
7527 }
7528
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007529 // Many NetBSD architectures support more than one ABI.
7530 // Determine the correct emulation for ld.
7531 switch (getToolChain().getArch()) {
7532 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007533 CmdArgs.push_back("-m");
7534 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007535 break;
7536 case llvm::Triple::arm:
7537 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007538 CmdArgs.push_back("-m");
7539 switch (getToolChain().getTriple().getEnvironment()) {
7540 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007541 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007542 CmdArgs.push_back("armelf_nbsd_eabi");
7543 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007544 case llvm::Triple::EABIHF:
7545 case llvm::Triple::GNUEABIHF:
7546 CmdArgs.push_back("armelf_nbsd_eabihf");
7547 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007548 default:
7549 CmdArgs.push_back("armelf_nbsd");
7550 break;
7551 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007552 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007553 case llvm::Triple::armeb:
7554 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007555 arm::appendEBLinkFlags(
7556 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007557 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007558 CmdArgs.push_back("-m");
7559 switch (getToolChain().getTriple().getEnvironment()) {
7560 case llvm::Triple::EABI:
7561 case llvm::Triple::GNUEABI:
7562 CmdArgs.push_back("armelfb_nbsd_eabi");
7563 break;
7564 case llvm::Triple::EABIHF:
7565 case llvm::Triple::GNUEABIHF:
7566 CmdArgs.push_back("armelfb_nbsd_eabihf");
7567 break;
7568 default:
7569 CmdArgs.push_back("armelfb_nbsd");
7570 break;
7571 }
7572 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007573 case llvm::Triple::mips64:
7574 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007575 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007576 CmdArgs.push_back("-m");
7577 if (getToolChain().getArch() == llvm::Triple::mips64)
7578 CmdArgs.push_back("elf32btsmip");
7579 else
7580 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007581 } else if (mips::hasMipsAbiArg(Args, "64")) {
7582 CmdArgs.push_back("-m");
7583 if (getToolChain().getArch() == llvm::Triple::mips64)
7584 CmdArgs.push_back("elf64btsmip");
7585 else
7586 CmdArgs.push_back("elf64ltsmip");
7587 }
7588 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007589 case llvm::Triple::ppc:
7590 CmdArgs.push_back("-m");
7591 CmdArgs.push_back("elf32ppc_nbsd");
7592 break;
7593
7594 case llvm::Triple::ppc64:
7595 case llvm::Triple::ppc64le:
7596 CmdArgs.push_back("-m");
7597 CmdArgs.push_back("elf64ppc");
7598 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007599
7600 case llvm::Triple::sparc:
7601 CmdArgs.push_back("-m");
7602 CmdArgs.push_back("elf32_sparc");
7603 break;
7604
7605 case llvm::Triple::sparcv9:
7606 CmdArgs.push_back("-m");
7607 CmdArgs.push_back("elf64_sparc");
7608 break;
7609
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007610 default:
7611 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007612 }
7613
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007614 if (Output.isFilename()) {
7615 CmdArgs.push_back("-o");
7616 CmdArgs.push_back(Output.getFilename());
7617 } else {
7618 assert(Output.isNothing() && "Invalid output.");
7619 }
7620
7621 if (!Args.hasArg(options::OPT_nostdlib) &&
7622 !Args.hasArg(options::OPT_nostartfiles)) {
7623 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007624 CmdArgs.push_back(
7625 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7626 CmdArgs.push_back(
7627 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7628 CmdArgs.push_back(
7629 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007630 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007631 CmdArgs.push_back(
7632 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7633 CmdArgs.push_back(
7634 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007635 }
7636 }
7637
7638 Args.AddAllArgs(CmdArgs, options::OPT_L);
7639 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7640 Args.AddAllArgs(CmdArgs, options::OPT_e);
7641 Args.AddAllArgs(CmdArgs, options::OPT_s);
7642 Args.AddAllArgs(CmdArgs, options::OPT_t);
7643 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7644 Args.AddAllArgs(CmdArgs, options::OPT_r);
7645
7646 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7647
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007648 unsigned Major, Minor, Micro;
7649 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7650 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007651 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007652 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007653 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007654 case llvm::Triple::arm:
7655 case llvm::Triple::armeb:
7656 case llvm::Triple::thumb:
7657 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007658 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007659 case llvm::Triple::ppc64:
7660 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007661 case llvm::Triple::x86:
7662 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007663 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007664 break;
7665 default:
7666 break;
7667 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007668 }
7669
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007670 if (!Args.hasArg(options::OPT_nostdlib) &&
7671 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007672 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007673 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7674 CmdArgs.push_back("-lm");
7675 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007676 if (Args.hasArg(options::OPT_pthread))
7677 CmdArgs.push_back("-lpthread");
7678 CmdArgs.push_back("-lc");
7679
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007680 if (useLibgcc) {
7681 if (Args.hasArg(options::OPT_static)) {
7682 // libgcc_eh depends on libc, so resolve as much as possible,
7683 // pull in any new requirements from libc and then get the rest
7684 // of libgcc.
7685 CmdArgs.push_back("-lgcc_eh");
7686 CmdArgs.push_back("-lc");
7687 CmdArgs.push_back("-lgcc");
7688 } else {
7689 CmdArgs.push_back("-lgcc");
7690 CmdArgs.push_back("--as-needed");
7691 CmdArgs.push_back("-lgcc_s");
7692 CmdArgs.push_back("--no-as-needed");
7693 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007694 }
7695 }
7696
7697 if (!Args.hasArg(options::OPT_nostdlib) &&
7698 !Args.hasArg(options::OPT_nostartfiles)) {
7699 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007700 CmdArgs.push_back(
7701 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007702 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007703 CmdArgs.push_back(
7704 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7705 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007706 }
7707
Alexey Samsonov7811d192014-02-20 13:57:37 +00007708 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007709
Logan Chieneb9162f2014-06-26 14:23:45 +00007710 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007711 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007712}
7713
Douglas Katzman95354292015-06-23 20:42:09 +00007714void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7715 const InputInfo &Output,
7716 const InputInfoList &Inputs,
7717 const ArgList &Args,
7718 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007719 claimNoWarnArgs(Args);
7720
Rafael Espindola92b00932010-08-10 00:25:48 +00007721 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007722 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007723
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007724 switch (getToolChain().getArch()) {
7725 default:
7726 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007727 // Add --32/--64 to make sure we get the format we want.
7728 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007729 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007730 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007731 break;
7732 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007733 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7734 CmdArgs.push_back("--x32");
7735 else
7736 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007737 break;
7738 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007739 CmdArgs.push_back("-a32");
7740 CmdArgs.push_back("-mppc");
7741 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007742 break;
7743 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007744 CmdArgs.push_back("-a64");
7745 CmdArgs.push_back("-mppc64");
7746 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007747 break;
7748 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007749 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007750 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007751 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007752 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007753 break;
7754 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007755 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007756 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007757 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007758 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007759 break;
7760 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007761 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007762 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007763 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007764 break;
7765 case llvm::Triple::arm:
7766 case llvm::Triple::armeb:
7767 case llvm::Triple::thumb:
7768 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007769 const llvm::Triple &Triple = getToolChain().getTriple();
7770 switch (Triple.getSubArch()) {
7771 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007772 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007773 break;
7774 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007775 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007776 break;
7777 default:
7778 break;
7779 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007780
Tim Northover9c7e0352013-12-12 11:55:52 +00007781 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007782 getToolChain().getDriver(), Args,
7783 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007784 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007785
7786 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007787
7788 // FIXME: remove krait check when GNU tools support krait cpu
7789 // for now replace it with -march=armv7-a to avoid a lower
7790 // march from being picked in the absence of a cpu flag.
7791 Arg *A;
7792 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007793 StringRef(A->getValue()).lower() == "krait")
7794 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007795 else
7796 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007797 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007798 break;
7799 }
7800 case llvm::Triple::mips:
7801 case llvm::Triple::mipsel:
7802 case llvm::Triple::mips64:
7803 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007804 StringRef CPUName;
7805 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007806 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007807 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007808
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007809 CmdArgs.push_back("-march");
7810 CmdArgs.push_back(CPUName.data());
7811
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007812 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007813 CmdArgs.push_back(ABIName.data());
7814
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007815 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7816 // or -mshared (not implemented) is in effect.
7817 bool IsPicOrPie = false;
7818 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7819 options::OPT_fpic, options::OPT_fno_pic,
7820 options::OPT_fPIE, options::OPT_fno_PIE,
7821 options::OPT_fpie, options::OPT_fno_pie)) {
7822 if (A->getOption().matches(options::OPT_fPIC) ||
7823 A->getOption().matches(options::OPT_fpic) ||
7824 A->getOption().matches(options::OPT_fPIE) ||
7825 A->getOption().matches(options::OPT_fpie))
7826 IsPicOrPie = true;
7827 }
7828 if (!IsPicOrPie)
7829 CmdArgs.push_back("-mno-shared");
7830
Daniel Sanders379d44b2014-07-16 11:52:23 +00007831 // LLVM doesn't support -mplt yet and acts as if it is always given.
7832 // However, -mplt has no effect with the N64 ABI.
7833 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007834
7835 if (getToolChain().getArch() == llvm::Triple::mips ||
7836 getToolChain().getArch() == llvm::Triple::mips64)
7837 CmdArgs.push_back("-EB");
7838 else
7839 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007840
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007841 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7842 if (StringRef(A->getValue()) == "2008")
7843 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7844 }
7845
Daniel Sanders379d44b2014-07-16 11:52:23 +00007846 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007847 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007848 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7849 options::OPT_mfp64)) {
7850 A->claim();
7851 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007852 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7853 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007854 CmdArgs.push_back("-mfpxx");
7855
7856 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7857 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007858 if (Arg *A =
7859 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007860 if (A->getOption().matches(options::OPT_mips16)) {
7861 A->claim();
7862 A->render(Args, CmdArgs);
7863 } else {
7864 A->claim();
7865 CmdArgs.push_back("-no-mips16");
7866 }
7867 }
7868
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007869 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7870 options::OPT_mno_micromips);
7871 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7872 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7873
Simon Atanasyanbd986632013-11-26 11:58:04 +00007874 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7875 // Do not use AddLastArg because not all versions of MIPS assembler
7876 // support -mmsa / -mno-msa options.
7877 if (A->getOption().matches(options::OPT_mmsa))
7878 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7879 }
7880
Daniel Sanders379d44b2014-07-16 11:52:23 +00007881 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7882 options::OPT_msoft_float);
7883
Toma Tabacub36d6102015-06-11 12:13:18 +00007884 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7885 options::OPT_msingle_float);
7886
Daniel Sanders379d44b2014-07-16 11:52:23 +00007887 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7888 options::OPT_mno_odd_spreg);
7889
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007890 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007891 break;
7892 }
7893 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007894 // Always pass an -march option, since our default of z10 is later
7895 // than the GNU assembler's default.
7896 StringRef CPUName = getSystemZTargetCPU(Args);
7897 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007898 break;
7899 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007900 }
7901
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007902 if (NeedsKPIC)
7903 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007904
Renato Golina74bbc72015-07-22 15:32:36 +00007905 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007906 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007907
7908 CmdArgs.push_back("-o");
7909 CmdArgs.push_back(Output.getFilename());
7910
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007911 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007912 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007913
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007914 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007915 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007916
7917 // Handle the debug info splitting at object creation time if we're
7918 // creating an object.
7919 // TODO: Currently only works on linux with newer objcopy.
7920 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007921 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007922 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007923 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007924}
7925
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007926static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007927 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007928 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00007929 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007930 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7931 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007932 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007933 CmdArgs.push_back("-lgcc");
7934
Logan Chien3d3373c2012-11-19 12:04:11 +00007935 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007936 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007937 CmdArgs.push_back("-lgcc");
7938 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00007939 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007940 CmdArgs.push_back("--as-needed");
7941 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00007942 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007943 CmdArgs.push_back("--no-as-needed");
7944 }
7945
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007946 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007947 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007948 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007949 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007950
7951 // According to Android ABI, we have to link with libdl if we are
7952 // linking with non-static libgcc.
7953 //
7954 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7955 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7956 if (isAndroid && !StaticLibgcc)
7957 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007958}
7959
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007960static std::string getLinuxDynamicLinker(const ArgList &Args,
7961 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007962 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7963
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007964 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7965 if (ToolChain.getTriple().isArch64Bit())
7966 return "/system/bin/linker64";
7967 else
7968 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007969 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7970 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007971 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007972 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007973 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007974 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007975 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007976 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00007977 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
7978 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007979 return "/lib/ld-linux-armhf.so.3";
7980 else
7981 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007982 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7983 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00007984 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
7985 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007986 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007987 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007988 return "/lib/ld-linux.so.3";
7989 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7990 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007991 StringRef CPUName;
7992 StringRef ABIName;
7993 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7994 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7995
7996 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7997 .Case("o32", "/lib")
7998 .Case("n32", "/lib32")
7999 .Case("n64", "/lib64")
8000 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008001 StringRef LibName;
8002 if (mips::isUCLibc(Args))
8003 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8004 else
8005 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008006
8007 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008008 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008009 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008010 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008011 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8012 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008013 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008014 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008015 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8016 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008017 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008018 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00008019 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008020 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008021 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008022 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008023 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8024 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008025 else
8026 return "/lib64/ld-linux-x86-64.so.2";
8027}
8028
Renato Golinc4b49242014-02-13 10:01:16 +00008029static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008030 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008031 // Make use of compiler-rt if --rtlib option is used
8032 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8033
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008034 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008035 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008036 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008037 default:
8038 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008039 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008040 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008041 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008042 break;
8043 }
Renato Golinc4b49242014-02-13 10:01:16 +00008044 break;
8045 case ToolChain::RLT_Libgcc:
8046 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8047 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008048 }
8049}
8050
Rafael Espindola1e085772014-08-15 17:14:35 +00008051static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8052 switch (T.getArch()) {
8053 case llvm::Triple::x86:
8054 return "elf_i386";
8055 case llvm::Triple::aarch64:
8056 return "aarch64linux";
8057 case llvm::Triple::aarch64_be:
8058 return "aarch64_be_linux";
8059 case llvm::Triple::arm:
8060 case llvm::Triple::thumb:
8061 return "armelf_linux_eabi";
8062 case llvm::Triple::armeb:
8063 case llvm::Triple::thumbeb:
8064 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8065 case llvm::Triple::ppc:
8066 return "elf32ppclinux";
8067 case llvm::Triple::ppc64:
8068 return "elf64ppc";
8069 case llvm::Triple::ppc64le:
8070 return "elf64lppc";
8071 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008072 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008073 return "elf32_sparc";
8074 case llvm::Triple::sparcv9:
8075 return "elf64_sparc";
8076 case llvm::Triple::mips:
8077 return "elf32btsmip";
8078 case llvm::Triple::mipsel:
8079 return "elf32ltsmip";
8080 case llvm::Triple::mips64:
8081 if (mips::hasMipsAbiArg(Args, "n32"))
8082 return "elf32btsmipn32";
8083 return "elf64btsmip";
8084 case llvm::Triple::mips64el:
8085 if (mips::hasMipsAbiArg(Args, "n32"))
8086 return "elf32ltsmipn32";
8087 return "elf64ltsmip";
8088 case llvm::Triple::systemz:
8089 return "elf64_s390";
8090 case llvm::Triple::x86_64:
8091 if (T.getEnvironment() == llvm::Triple::GNUX32)
8092 return "elf32_x86_64";
8093 return "elf_x86_64";
8094 default:
8095 llvm_unreachable("Unexpected arch");
8096 }
8097}
8098
Douglas Katzman95354292015-06-23 20:42:09 +00008099void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8100 const InputInfo &Output,
8101 const InputInfoList &Inputs,
8102 const ArgList &Args,
8103 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008104 const toolchains::Linux &ToolChain =
8105 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008106 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008107 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008108 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008109 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008110 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008111 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8112 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008113
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008114 ArgStringList CmdArgs;
8115
Rafael Espindolad1002f62010-11-15 18:28:16 +00008116 // Silence warning for "clang -g foo.o -o foo"
8117 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008118 // and "clang -emit-llvm foo.o -o foo"
8119 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008120 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008121 // handled somewhere else.
8122 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008123
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008124 if (!D.SysRoot.empty())
8125 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008126
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008127 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008128 CmdArgs.push_back("-pie");
8129
Rafael Espindola1c76c592010-11-07 22:57:16 +00008130 if (Args.hasArg(options::OPT_rdynamic))
8131 CmdArgs.push_back("-export-dynamic");
8132
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008133 if (Args.hasArg(options::OPT_s))
8134 CmdArgs.push_back("-s");
8135
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008136 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
8137 arm::appendEBLinkFlags(
8138 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008139 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008140
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008141 for (const auto &Opt : ToolChain.ExtraOpts)
8142 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008143
8144 if (!Args.hasArg(options::OPT_static)) {
8145 CmdArgs.push_back("--eh-frame-hdr");
8146 }
8147
8148 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008149 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008150
8151 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008152 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8153 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008154 CmdArgs.push_back("-Bstatic");
8155 else
8156 CmdArgs.push_back("-static");
8157 } else if (Args.hasArg(options::OPT_shared)) {
8158 CmdArgs.push_back("-shared");
8159 }
8160
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008161 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8162 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008163 (!Args.hasArg(options::OPT_static) &&
8164 !Args.hasArg(options::OPT_shared))) {
8165 CmdArgs.push_back("-dynamic-linker");
8166 CmdArgs.push_back(Args.MakeArgString(
8167 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8168 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008169
8170 CmdArgs.push_back("-o");
8171 CmdArgs.push_back(Output.getFilename());
8172
Rafael Espindola81937ec2010-12-01 01:52:43 +00008173 if (!Args.hasArg(options::OPT_nostdlib) &&
8174 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008175 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008176 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008177 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008178 if (Args.hasArg(options::OPT_pg))
8179 crt1 = "gcrt1.o";
8180 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008181 crt1 = "Scrt1.o";
8182 else
8183 crt1 = "crt1.o";
8184 }
8185 if (crt1)
8186 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008187
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008188 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8189 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008190
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008191 const char *crtbegin;
8192 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008193 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008194 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008195 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008196 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008197 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008198 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008199 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008200 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008201
8202 // Add crtfastmath.o if available and fast math is enabled.
8203 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008204 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008205
8206 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008207 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008208
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008209 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008210
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008211 for (const auto &Path : Paths)
8212 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008213
Alexey Samsonov907880e2015-06-19 19:57:46 +00008214 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008215 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008216
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008217 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8218 CmdArgs.push_back("--no-demangle");
8219
Alexey Samsonov52550342014-09-15 19:58:40 +00008220 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008221 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008222 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008223 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008224
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008225 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008226 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008227 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008228 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008229 if (OnlyLibstdcxxStatic)
8230 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008231 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008232 if (OnlyLibstdcxxStatic)
8233 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008234 CmdArgs.push_back("-lm");
8235 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008236 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8237 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008238
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008239 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008240 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8241 if (Args.hasArg(options::OPT_static))
8242 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008243
Alexey Samsonov52550342014-09-15 19:58:40 +00008244 if (NeedsSanitizerDeps)
8245 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8246
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008247 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8248 Args.hasArg(options::OPT_pthreads);
8249
8250 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8251 options::OPT_fno_openmp, false)) {
8252 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8253 // FIXME: Does this really make sense for all GNU toolchains?
8254 WantPthread = true;
8255
8256 // Also link the particular OpenMP runtimes.
8257 switch (getOpenMPRuntime(ToolChain, Args)) {
8258 case OMPRT_OMP:
8259 CmdArgs.push_back("-lomp");
8260 break;
8261 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008262 CmdArgs.push_back("-lgomp");
8263
8264 // FIXME: Exclude this for platforms with libgomp that don't require
8265 // librt. Most modern Linux platforms require it, but some may not.
8266 CmdArgs.push_back("-lrt");
8267 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008268 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008269 CmdArgs.push_back("-liomp5");
8270 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008271 case OMPRT_Unknown:
8272 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008273 break;
8274 }
Chandler Carruth01538002013-01-17 13:19:29 +00008275 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008276
Renato Golinc4b49242014-02-13 10:01:16 +00008277 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008278
Richard Smith31d1de22015-05-20 22:48:44 +00008279 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008280 CmdArgs.push_back("-lpthread");
8281
8282 CmdArgs.push_back("-lc");
8283
8284 if (Args.hasArg(options::OPT_static))
8285 CmdArgs.push_back("--end-group");
8286 else
Renato Golinc4b49242014-02-13 10:01:16 +00008287 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008288 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008289
Rafael Espindola81937ec2010-12-01 01:52:43 +00008290 if (!Args.hasArg(options::OPT_nostartfiles)) {
8291 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008292 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008293 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008294 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008295 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008296 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008297 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008298
Rafael Espindola81937ec2010-12-01 01:52:43 +00008299 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008300 if (!isAndroid)
8301 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008302 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008303 }
8304
Justin Bognerd3371d82015-07-17 03:35:54 +00008305 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8306 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008307}
8308
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008309// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8310// for the various SFI requirements like register masking. The assembly tool
8311// inserts the file containing the macros as an input into all the assembly
8312// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008313void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8314 const InputInfo &Output,
8315 const InputInfoList &Inputs,
8316 const ArgList &Args,
8317 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008318 const toolchains::NaClToolChain &ToolChain =
8319 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008320 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8321 "nacl-arm-macros.s");
8322 InputInfoList NewInputs;
8323 NewInputs.push_back(NaClMacros);
8324 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008325 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8326 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008327}
8328
Douglas Katzman750cfc52015-06-29 18:42:16 +00008329// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008330// we use static by default, do not yet support sanitizers or LTO, and a few
8331// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008332// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008333void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8334 const InputInfo &Output,
8335 const InputInfoList &Inputs,
8336 const ArgList &Args,
8337 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008338
Douglas Katzman54366072015-07-27 16:53:08 +00008339 const toolchains::NaClToolChain &ToolChain =
8340 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008341 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008342 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008343 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008344 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008345
8346 ArgStringList CmdArgs;
8347
8348 // Silence warning for "clang -g foo.o -o foo"
8349 Args.ClaimAllArgs(options::OPT_g_Group);
8350 // and "clang -emit-llvm foo.o -o foo"
8351 Args.ClaimAllArgs(options::OPT_emit_llvm);
8352 // and for "clang -w foo.o -o foo". Other warning options are already
8353 // handled somewhere else.
8354 Args.ClaimAllArgs(options::OPT_w);
8355
8356 if (!D.SysRoot.empty())
8357 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8358
8359 if (Args.hasArg(options::OPT_rdynamic))
8360 CmdArgs.push_back("-export-dynamic");
8361
8362 if (Args.hasArg(options::OPT_s))
8363 CmdArgs.push_back("-s");
8364
Douglas Katzman54366072015-07-27 16:53:08 +00008365 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8366 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008367 CmdArgs.push_back("--build-id");
8368
8369 if (!IsStatic)
8370 CmdArgs.push_back("--eh-frame-hdr");
8371
8372 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008373 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008374 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008375 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008376 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008377 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008378 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008379 else if (Arch == llvm::Triple::mipsel)
8380 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008381 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008382 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8383 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008384
8385 if (IsStatic)
8386 CmdArgs.push_back("-static");
8387 else if (Args.hasArg(options::OPT_shared))
8388 CmdArgs.push_back("-shared");
8389
8390 CmdArgs.push_back("-o");
8391 CmdArgs.push_back(Output.getFilename());
8392 if (!Args.hasArg(options::OPT_nostdlib) &&
8393 !Args.hasArg(options::OPT_nostartfiles)) {
8394 if (!Args.hasArg(options::OPT_shared))
8395 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8396 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8397
8398 const char *crtbegin;
8399 if (IsStatic)
8400 crtbegin = "crtbeginT.o";
8401 else if (Args.hasArg(options::OPT_shared))
8402 crtbegin = "crtbeginS.o";
8403 else
8404 crtbegin = "crtbegin.o";
8405 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8406 }
8407
8408 Args.AddAllArgs(CmdArgs, options::OPT_L);
8409 Args.AddAllArgs(CmdArgs, options::OPT_u);
8410
8411 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8412
8413 for (const auto &Path : Paths)
8414 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8415
8416 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8417 CmdArgs.push_back("--no-demangle");
8418
8419 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8420
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008421 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008422 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008423 bool OnlyLibstdcxxStatic =
8424 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008425 if (OnlyLibstdcxxStatic)
8426 CmdArgs.push_back("-Bstatic");
8427 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8428 if (OnlyLibstdcxxStatic)
8429 CmdArgs.push_back("-Bdynamic");
8430 CmdArgs.push_back("-lm");
8431 }
8432
8433 if (!Args.hasArg(options::OPT_nostdlib)) {
8434 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8435 // Always use groups, since it has no effect on dynamic libraries.
8436 CmdArgs.push_back("--start-group");
8437 CmdArgs.push_back("-lc");
8438 // NaCl's libc++ currently requires libpthread, so just always include it
8439 // in the group for C++.
8440 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008441 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008442 // Gold, used by Mips, handles nested groups differently than ld, and
8443 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8444 // which is not a desired behaviour here.
8445 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8446 if (getToolChain().getArch() == llvm::Triple::mipsel)
8447 CmdArgs.push_back("-lnacl");
8448
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008449 CmdArgs.push_back("-lpthread");
8450 }
8451
8452 CmdArgs.push_back("-lgcc");
8453 CmdArgs.push_back("--as-needed");
8454 if (IsStatic)
8455 CmdArgs.push_back("-lgcc_eh");
8456 else
8457 CmdArgs.push_back("-lgcc_s");
8458 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008459
8460 // Mips needs to create and use pnacl_legacy library that contains
8461 // definitions from bitcode/pnaclmm.c and definitions for
8462 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8463 if (getToolChain().getArch() == llvm::Triple::mipsel)
8464 CmdArgs.push_back("-lpnacl_legacy");
8465
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008466 CmdArgs.push_back("--end-group");
8467 }
8468
8469 if (!Args.hasArg(options::OPT_nostartfiles)) {
8470 const char *crtend;
8471 if (Args.hasArg(options::OPT_shared))
8472 crtend = "crtendS.o";
8473 else
8474 crtend = "crtend.o";
8475
8476 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8477 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8478 }
8479 }
8480
Justin Bognerd3371d82015-07-17 03:35:54 +00008481 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8482 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008483}
8484
Douglas Katzman95354292015-06-23 20:42:09 +00008485void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8486 const InputInfo &Output,
8487 const InputInfoList &Inputs,
8488 const ArgList &Args,
8489 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008490 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008491 ArgStringList CmdArgs;
8492
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008493 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008494
8495 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008496 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008497
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008498 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008499 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008500
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008501 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008502 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008503}
8504
Douglas Katzman95354292015-06-23 20:42:09 +00008505void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8506 const InputInfo &Output,
8507 const InputInfoList &Inputs,
8508 const ArgList &Args,
8509 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008510 const Driver &D = getToolChain().getDriver();
8511 ArgStringList CmdArgs;
8512
Daniel Dunbarb440f562010-08-02 02:38:21 +00008513 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008514 CmdArgs.push_back("-o");
8515 CmdArgs.push_back(Output.getFilename());
8516 } else {
8517 assert(Output.isNothing() && "Invalid output.");
8518 }
8519
8520 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008521 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008522 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8523 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8524 CmdArgs.push_back(
8525 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8526 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008527 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008528
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008529 Args.AddAllArgs(CmdArgs,
8530 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008531
Daniel Dunbar54423b22010-09-17 00:24:54 +00008532 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008533
Alexey Samsonov7811d192014-02-20 13:57:37 +00008534 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008535
Chris Lattner3e2ee142010-07-07 16:01:42 +00008536 if (!Args.hasArg(options::OPT_nostdlib) &&
8537 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008538 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008539 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008540 CmdArgs.push_back("-lm");
8541 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008542 }
8543
8544 if (!Args.hasArg(options::OPT_nostdlib) &&
8545 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008546 if (Args.hasArg(options::OPT_pthread))
8547 CmdArgs.push_back("-lpthread");
8548 CmdArgs.push_back("-lc");
8549 CmdArgs.push_back("-lCompilerRT-Generic");
8550 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8551 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008552 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008553 }
8554
Logan Chieneb9162f2014-06-26 14:23:45 +00008555 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008557}
8558
Daniel Dunbarcc912342009-05-02 18:28:39 +00008559/// DragonFly Tools
8560
8561// For now, DragonFly Assemble does just about the same as for
8562// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008563void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8564 const InputInfo &Output,
8565 const InputInfoList &Inputs,
8566 const ArgList &Args,
8567 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008568 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008569 ArgStringList CmdArgs;
8570
8571 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8572 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008573 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008574 CmdArgs.push_back("--32");
8575
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008576 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008577
8578 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008579 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008580
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008581 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008582 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008583
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008584 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008585 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008586}
8587
Douglas Katzman95354292015-06-23 20:42:09 +00008588void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8589 const InputInfo &Output,
8590 const InputInfoList &Inputs,
8591 const ArgList &Args,
8592 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008593 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008594 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008595 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008596
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008597 if (!D.SysRoot.empty())
8598 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8599
John McCall65b8da02013-04-11 22:55:55 +00008600 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008601 if (Args.hasArg(options::OPT_static)) {
8602 CmdArgs.push_back("-Bstatic");
8603 } else {
John McCall65b8da02013-04-11 22:55:55 +00008604 if (Args.hasArg(options::OPT_rdynamic))
8605 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008606 if (Args.hasArg(options::OPT_shared))
8607 CmdArgs.push_back("-Bshareable");
8608 else {
8609 CmdArgs.push_back("-dynamic-linker");
8610 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8611 }
John McCall65b8da02013-04-11 22:55:55 +00008612 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008613 }
8614
8615 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8616 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008617 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008618 CmdArgs.push_back("-m");
8619 CmdArgs.push_back("elf_i386");
8620 }
8621
Daniel Dunbarb440f562010-08-02 02:38:21 +00008622 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008623 CmdArgs.push_back("-o");
8624 CmdArgs.push_back(Output.getFilename());
8625 } else {
8626 assert(Output.isNothing() && "Invalid output.");
8627 }
8628
8629 if (!Args.hasArg(options::OPT_nostdlib) &&
8630 !Args.hasArg(options::OPT_nostartfiles)) {
8631 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008632 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008633 CmdArgs.push_back(
8634 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008635 else {
8636 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008637 CmdArgs.push_back(
8638 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008639 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008640 CmdArgs.push_back(
8641 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008642 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008643 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008644 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008645 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008646 CmdArgs.push_back(
8647 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008648 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008649 CmdArgs.push_back(
8650 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008651 }
8652
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008653 Args.AddAllArgs(CmdArgs,
8654 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008655
Daniel Dunbar54423b22010-09-17 00:24:54 +00008656 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008657
8658 if (!Args.hasArg(options::OPT_nostdlib) &&
8659 !Args.hasArg(options::OPT_nodefaultlibs)) {
8660 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8661 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008662 if (UseGCC47)
8663 CmdArgs.push_back("-L/usr/lib/gcc47");
8664 else
8665 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008666
8667 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008668 if (UseGCC47) {
8669 CmdArgs.push_back("-rpath");
8670 CmdArgs.push_back("/usr/lib/gcc47");
8671 } else {
8672 CmdArgs.push_back("-rpath");
8673 CmdArgs.push_back("/usr/lib/gcc44");
8674 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008675 }
8676
Hans Wennborg70850d82013-07-18 20:29:38 +00008677 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008678 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008679 CmdArgs.push_back("-lm");
8680 }
8681
Daniel Dunbarcc912342009-05-02 18:28:39 +00008682 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008683 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008684
8685 if (!Args.hasArg(options::OPT_nolibc)) {
8686 CmdArgs.push_back("-lc");
8687 }
8688
John McCall65b8da02013-04-11 22:55:55 +00008689 if (UseGCC47) {
8690 if (Args.hasArg(options::OPT_static) ||
8691 Args.hasArg(options::OPT_static_libgcc)) {
8692 CmdArgs.push_back("-lgcc");
8693 CmdArgs.push_back("-lgcc_eh");
8694 } else {
8695 if (Args.hasArg(options::OPT_shared_libgcc)) {
8696 CmdArgs.push_back("-lgcc_pic");
8697 if (!Args.hasArg(options::OPT_shared))
8698 CmdArgs.push_back("-lgcc");
8699 } else {
8700 CmdArgs.push_back("-lgcc");
8701 CmdArgs.push_back("--as-needed");
8702 CmdArgs.push_back("-lgcc_pic");
8703 CmdArgs.push_back("--no-as-needed");
8704 }
8705 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008706 } else {
John McCall65b8da02013-04-11 22:55:55 +00008707 if (Args.hasArg(options::OPT_shared)) {
8708 CmdArgs.push_back("-lgcc_pic");
8709 } else {
8710 CmdArgs.push_back("-lgcc");
8711 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008712 }
8713 }
8714
8715 if (!Args.hasArg(options::OPT_nostdlib) &&
8716 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008717 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008718 CmdArgs.push_back(
8719 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008720 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008721 CmdArgs.push_back(
8722 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8723 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008724 }
8725
Alexey Samsonov7811d192014-02-20 13:57:37 +00008726 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008727
Logan Chieneb9162f2014-06-26 14:23:45 +00008728 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008729 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008730}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008731
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008732// Try to find Exe from a Visual Studio distribution. This first tries to find
8733// an installed copy of Visual Studio and, failing that, looks in the PATH,
8734// making sure that whatever executable that's found is not a same-named exe
8735// from clang itself to prevent clang from falling back to itself.
8736static std::string FindVisualStudioExecutable(const ToolChain &TC,
8737 const char *Exe,
8738 const char *ClangProgramPath) {
8739 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8740 std::string visualStudioBinDir;
8741 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8742 visualStudioBinDir)) {
8743 SmallString<128> FilePath(visualStudioBinDir);
8744 llvm::sys::path::append(FilePath, Exe);
8745 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8746 return FilePath.str();
8747 }
8748
8749 return Exe;
8750}
8751
Douglas Katzman95354292015-06-23 20:42:09 +00008752void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8753 const InputInfo &Output,
8754 const InputInfoList &Inputs,
8755 const ArgList &Args,
8756 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008757 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008758 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008759
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008760 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8761 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008762 CmdArgs.push_back(
8763 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008764
8765 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008766 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008767 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008768
Zachary Turner10d75b22014-10-22 20:40:43 +00008769 if (!llvm::sys::Process::GetEnv("LIB")) {
8770 // If the VC environment hasn't been configured (perhaps because the user
8771 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008772 // the environment variable is set however, assume the user knows what
8773 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008774 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008775 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008776 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8777 SmallString<128> LibDir(VisualStudioDir);
8778 llvm::sys::path::append(LibDir, "VC", "lib");
8779 switch (MSVC.getArch()) {
8780 case llvm::Triple::x86:
8781 // x86 just puts the libraries directly in lib
8782 break;
8783 case llvm::Triple::x86_64:
8784 llvm::sys::path::append(LibDir, "amd64");
8785 break;
8786 case llvm::Triple::arm:
8787 llvm::sys::path::append(LibDir, "arm");
8788 break;
8789 default:
8790 break;
8791 }
8792 CmdArgs.push_back(
8793 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8794 }
8795
8796 std::string WindowsSdkLibPath;
8797 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8798 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8799 WindowsSdkLibPath.c_str()));
8800 }
8801
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008802 CmdArgs.push_back("-nologo");
8803
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008804 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008805 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008806
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008807 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008808 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008809 if (DLL) {
8810 CmdArgs.push_back(Args.MakeArgString("-dll"));
8811
8812 SmallString<128> ImplibName(Output.getFilename());
8813 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008814 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008815 }
8816
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008817 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008818 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008819 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008820 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008821 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008822 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008823 };
8824 for (const auto &Component : CompilerRTComponents)
8825 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008826 // Make sure the dynamic runtime thunk is not optimized out at link time
8827 // to ensure proper SEH handling.
8828 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008829 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008830 CmdArgs.push_back(
8831 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008832 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008833 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008834 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008835 };
8836 for (const auto &Component : CompilerRTComponents)
8837 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008838 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008839 }
8840
Hans Wennborg2e274592013-08-13 23:38:57 +00008841 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008842
Reid Kleckner337188f2014-09-16 19:22:00 +00008843 // Add filenames, libraries, and other linker inputs.
8844 for (const auto &Input : Inputs) {
8845 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008846 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008847 continue;
8848 }
8849
8850 const Arg &A = Input.getInputArg();
8851
8852 // Render -l options differently for the MSVC linker.
8853 if (A.getOption().matches(options::OPT_l)) {
8854 StringRef Lib = A.getValue();
8855 const char *LinkLibArg;
8856 if (Lib.endswith(".lib"))
8857 LinkLibArg = Args.MakeArgString(Lib);
8858 else
8859 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8860 CmdArgs.push_back(LinkLibArg);
8861 continue;
8862 }
8863
8864 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8865 // or -L. Render it, even if MSVC doesn't understand it.
8866 A.renderAsInput(Args, CmdArgs);
8867 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008868
Zachary Turner719f58c2014-12-01 23:06:47 +00008869 // We need to special case some linker paths. In the case of lld, we need to
8870 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8871 // linker, we need to use a special search algorithm.
8872 llvm::SmallString<128> linkPath;
8873 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8874 if (Linker.equals_lower("lld"))
8875 Linker = "lld-link";
8876
8877 if (Linker.equals_lower("link")) {
8878 // If we're using the MSVC linker, it's not sufficient to just use link
8879 // from the program PATH, because other environments like GnuWin32 install
8880 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008881 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008882 C.getDriver().getClangProgramPath());
8883 } else {
8884 linkPath = Linker;
8885 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008886 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008887 }
8888
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008889 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00008890 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008891}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008892
Douglas Katzman95354292015-06-23 20:42:09 +00008893void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8894 const InputInfo &Output,
8895 const InputInfoList &Inputs,
8896 const ArgList &Args,
8897 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008898 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8899}
8900
Douglas Katzman95354292015-06-23 20:42:09 +00008901std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008902 Compilation &C, const JobAction &JA, const InputInfo &Output,
8903 const InputInfoList &Inputs, const ArgList &Args,
8904 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008905 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008906 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008907 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008908 CmdArgs.push_back("/W0"); // No warnings.
8909
8910 // The goal is to be able to invoke this tool correctly based on
8911 // any flag accepted by clang-cl.
8912
8913 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008914 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008915
8916 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00008917 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
8918 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
8919 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008920 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8921 if (A->getOption().getID() == options::OPT_O0) {
8922 CmdArgs.push_back("/Od");
8923 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00008924 CmdArgs.push_back("/Og");
8925
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008926 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00008927 if (OptLevel == "s" || OptLevel == "z")
8928 CmdArgs.push_back("/Os");
8929 else
8930 CmdArgs.push_back("/Ot");
8931
8932 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008933 }
8934 }
David Majnemer015ce0f2015-07-27 07:32:11 +00008935 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
8936 options::OPT_fno_omit_frame_pointer))
8937 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
8938 ? "/Oy"
8939 : "/Oy-");
8940 if (!Args.hasArg(options::OPT_fwritable_strings))
8941 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008942
Nico Weber3f8dafb2015-03-12 19:37:10 +00008943 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008944 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8945
David Majnemerf6072342014-07-01 22:24:56 +00008946 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8947 /*default=*/false))
8948 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008949 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8950 options::OPT_fno_function_sections))
8951 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8952 ? "/Gy"
8953 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008954 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8955 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008956 CmdArgs.push_back(
8957 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008958 if (Args.hasArg(options::OPT_fsyntax_only))
8959 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008960 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8961 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008962
Nico Weber3f8dafb2015-03-12 19:37:10 +00008963 std::vector<std::string> Includes =
8964 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008965 for (const auto &Include : Includes)
8966 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008967
Hans Wennborg87cfa712013-09-19 20:32:16 +00008968 // Flags that can simply be passed through.
8969 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8970 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008971 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00008972 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008973
8974 // The order of these flags is relevant, so pick the last one.
8975 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8976 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8977 A->render(Args, CmdArgs);
8978
Hans Wennborg87cfa712013-09-19 20:32:16 +00008979 // Input filename.
8980 assert(Inputs.size() == 1);
8981 const InputInfo &II = Inputs[0];
8982 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8983 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8984 if (II.isFilename())
8985 CmdArgs.push_back(II.getFilename());
8986 else
8987 II.getInputArg().renderAsInput(Args, CmdArgs);
8988
8989 // Output filename.
8990 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008991 const char *Fo =
8992 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00008993 CmdArgs.push_back(Fo);
8994
Hans Wennborg188382e2013-09-20 18:16:35 +00008995 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008996 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8997 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008998 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00008999 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009000}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009001
Yaron Keren1c0070c2015-07-02 04:45:27 +00009002/// MinGW Tools
9003void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9004 const InputInfo &Output,
9005 const InputInfoList &Inputs,
9006 const ArgList &Args,
9007 const char *LinkingOutput) const {
9008 claimNoWarnArgs(Args);
9009 ArgStringList CmdArgs;
9010
9011 if (getToolChain().getArch() == llvm::Triple::x86) {
9012 CmdArgs.push_back("--32");
9013 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9014 CmdArgs.push_back("--64");
9015 }
9016
9017 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9018
9019 CmdArgs.push_back("-o");
9020 CmdArgs.push_back(Output.getFilename());
9021
9022 for (const auto &II : Inputs)
9023 CmdArgs.push_back(II.getFilename());
9024
9025 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009026 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009027
9028 if (Args.hasArg(options::OPT_gsplit_dwarf))
9029 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9030 SplitDebugName(Args, Inputs[0]));
9031}
9032
9033void MinGW::Linker::AddLibGCC(const ArgList &Args,
9034 ArgStringList &CmdArgs) const {
9035 if (Args.hasArg(options::OPT_mthreads))
9036 CmdArgs.push_back("-lmingwthrd");
9037 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009038
9039 // Add libgcc or compiler-rt.
9040 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9041
Yaron Keren1c0070c2015-07-02 04:45:27 +00009042 CmdArgs.push_back("-lmoldname");
9043 CmdArgs.push_back("-lmingwex");
9044 CmdArgs.push_back("-lmsvcrt");
9045}
9046
9047void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9048 const InputInfo &Output,
9049 const InputInfoList &Inputs,
9050 const ArgList &Args,
9051 const char *LinkingOutput) const {
9052 const ToolChain &TC = getToolChain();
9053 const Driver &D = TC.getDriver();
9054 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9055
9056 ArgStringList CmdArgs;
9057
9058 // Silence warning for "clang -g foo.o -o foo"
9059 Args.ClaimAllArgs(options::OPT_g_Group);
9060 // and "clang -emit-llvm foo.o -o foo"
9061 Args.ClaimAllArgs(options::OPT_emit_llvm);
9062 // and for "clang -w foo.o -o foo". Other warning options are already
9063 // handled somewhere else.
9064 Args.ClaimAllArgs(options::OPT_w);
9065
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009066 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9067 if (LinkerName.equals_lower("lld")) {
9068 CmdArgs.push_back("-flavor");
9069 CmdArgs.push_back("gnu");
9070 }
9071
Yaron Keren1c0070c2015-07-02 04:45:27 +00009072 if (!D.SysRoot.empty())
9073 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9074
9075 if (Args.hasArg(options::OPT_s))
9076 CmdArgs.push_back("-s");
9077
9078 CmdArgs.push_back("-m");
9079 if (TC.getArch() == llvm::Triple::x86)
9080 CmdArgs.push_back("i386pe");
9081 if (TC.getArch() == llvm::Triple::x86_64)
9082 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009083 if (TC.getArch() == llvm::Triple::arm)
9084 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009085
9086 if (Args.hasArg(options::OPT_mwindows)) {
9087 CmdArgs.push_back("--subsystem");
9088 CmdArgs.push_back("windows");
9089 } else if (Args.hasArg(options::OPT_mconsole)) {
9090 CmdArgs.push_back("--subsystem");
9091 CmdArgs.push_back("console");
9092 }
9093
9094 if (Args.hasArg(options::OPT_static))
9095 CmdArgs.push_back("-Bstatic");
9096 else {
9097 if (Args.hasArg(options::OPT_mdll))
9098 CmdArgs.push_back("--dll");
9099 else if (Args.hasArg(options::OPT_shared))
9100 CmdArgs.push_back("--shared");
9101 CmdArgs.push_back("-Bdynamic");
9102 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9103 CmdArgs.push_back("-e");
9104 if (TC.getArch() == llvm::Triple::x86)
9105 CmdArgs.push_back("_DllMainCRTStartup@12");
9106 else
9107 CmdArgs.push_back("DllMainCRTStartup");
9108 CmdArgs.push_back("--enable-auto-image-base");
9109 }
9110 }
9111
9112 CmdArgs.push_back("-o");
9113 CmdArgs.push_back(Output.getFilename());
9114
9115 Args.AddAllArgs(CmdArgs, options::OPT_e);
9116 // FIXME: add -N, -n flags
9117 Args.AddLastArg(CmdArgs, options::OPT_r);
9118 Args.AddLastArg(CmdArgs, options::OPT_s);
9119 Args.AddLastArg(CmdArgs, options::OPT_t);
9120 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9121 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9122
9123 if (!Args.hasArg(options::OPT_nostdlib) &&
9124 !Args.hasArg(options::OPT_nostartfiles)) {
9125 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9126 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9127 } else {
9128 if (Args.hasArg(options::OPT_municode))
9129 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9130 else
9131 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9132 }
9133 if (Args.hasArg(options::OPT_pg))
9134 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9135 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9136 }
9137
9138 Args.AddAllArgs(CmdArgs, options::OPT_L);
9139 const ToolChain::path_list Paths = TC.getFilePaths();
9140 for (const auto &Path : Paths)
9141 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9142
9143 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9144
9145 // TODO: Add ASan stuff here
9146
9147 // TODO: Add profile stuff here
9148
9149 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9150 !Args.hasArg(options::OPT_nodefaultlibs)) {
9151 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9152 !Args.hasArg(options::OPT_static);
9153 if (OnlyLibstdcxxStatic)
9154 CmdArgs.push_back("-Bstatic");
9155 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9156 if (OnlyLibstdcxxStatic)
9157 CmdArgs.push_back("-Bdynamic");
9158 }
9159
9160 if (!Args.hasArg(options::OPT_nostdlib)) {
9161 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9162 if (Args.hasArg(options::OPT_static))
9163 CmdArgs.push_back("--start-group");
9164
9165 if (Args.hasArg(options::OPT_fstack_protector) ||
9166 Args.hasArg(options::OPT_fstack_protector_strong) ||
9167 Args.hasArg(options::OPT_fstack_protector_all)) {
9168 CmdArgs.push_back("-lssp_nonshared");
9169 CmdArgs.push_back("-lssp");
9170 }
9171 if (Args.hasArg(options::OPT_fopenmp))
9172 CmdArgs.push_back("-lgomp");
9173
9174 AddLibGCC(Args, CmdArgs);
9175
9176 if (Args.hasArg(options::OPT_pg))
9177 CmdArgs.push_back("-lgmon");
9178
Yaron Kerenadce68e2015-07-06 18:52:19 +00009179 if (Args.hasArg(options::OPT_pthread))
9180 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009181
9182 // add system libraries
9183 if (Args.hasArg(options::OPT_mwindows)) {
9184 CmdArgs.push_back("-lgdi32");
9185 CmdArgs.push_back("-lcomdlg32");
9186 }
9187 CmdArgs.push_back("-ladvapi32");
9188 CmdArgs.push_back("-lshell32");
9189 CmdArgs.push_back("-luser32");
9190 CmdArgs.push_back("-lkernel32");
9191
9192 if (Args.hasArg(options::OPT_static))
9193 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009194 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009195 AddLibGCC(Args, CmdArgs);
9196 }
9197
9198 if (!Args.hasArg(options::OPT_nostartfiles)) {
9199 // Add crtfastmath.o if available and fast math is enabled.
9200 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9201
9202 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9203 }
9204 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009205 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009206 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009207}
9208
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009209/// XCore Tools
9210// We pass assemble and link construction to the xcc tool.
9211
Douglas Katzman95354292015-06-23 20:42:09 +00009212void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9213 const InputInfo &Output,
9214 const InputInfoList &Inputs,
9215 const ArgList &Args,
9216 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009217 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009218 ArgStringList CmdArgs;
9219
9220 CmdArgs.push_back("-o");
9221 CmdArgs.push_back(Output.getFilename());
9222
9223 CmdArgs.push_back("-c");
9224
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009225 if (Args.hasArg(options::OPT_v))
9226 CmdArgs.push_back("-v");
9227
Robert Lytton894d25c2014-05-02 09:33:25 +00009228 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9229 if (!A->getOption().matches(options::OPT_g0))
9230 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009231
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009232 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9233 false))
9234 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009235
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009236 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009237
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009238 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009239 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009240
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009241 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009242 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009243}
9244
Douglas Katzman95354292015-06-23 20:42:09 +00009245void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9246 const InputInfo &Output,
9247 const InputInfoList &Inputs,
9248 const ArgList &Args,
9249 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009250 ArgStringList CmdArgs;
9251
9252 if (Output.isFilename()) {
9253 CmdArgs.push_back("-o");
9254 CmdArgs.push_back(Output.getFilename());
9255 } else {
9256 assert(Output.isNothing() && "Invalid output.");
9257 }
9258
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009259 if (Args.hasArg(options::OPT_v))
9260 CmdArgs.push_back("-v");
9261
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009262 // Pass -fexceptions through to the linker if it was present.
9263 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9264 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009265 CmdArgs.push_back("-fexceptions");
9266
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009267 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9268
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009269 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009270 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009271}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009272
Douglas Katzman95354292015-06-23 20:42:09 +00009273void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9274 const InputInfo &Output,
9275 const InputInfoList &Inputs,
9276 const ArgList &Args,
9277 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009278 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009279 const auto &TC =
9280 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9281 ArgStringList CmdArgs;
9282 const char *Exec;
9283
9284 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009285 default:
9286 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009287 case llvm::Triple::arm:
9288 case llvm::Triple::thumb:
9289 break;
9290 case llvm::Triple::x86:
9291 CmdArgs.push_back("--32");
9292 break;
9293 case llvm::Triple::x86_64:
9294 CmdArgs.push_back("--64");
9295 break;
9296 }
9297
9298 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9299
9300 CmdArgs.push_back("-o");
9301 CmdArgs.push_back(Output.getFilename());
9302
9303 for (const auto &Input : Inputs)
9304 CmdArgs.push_back(Input.getFilename());
9305
9306 const std::string Assembler = TC.GetProgramPath("as");
9307 Exec = Args.MakeArgString(Assembler);
9308
Justin Bognerd3371d82015-07-17 03:35:54 +00009309 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009310}
9311
Douglas Katzman95354292015-06-23 20:42:09 +00009312void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9313 const InputInfo &Output,
9314 const InputInfoList &Inputs,
9315 const ArgList &Args,
9316 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009317 const auto &TC =
9318 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9319 const llvm::Triple &T = TC.getTriple();
9320 const Driver &D = TC.getDriver();
9321 SmallString<128> EntryPoint;
9322 ArgStringList CmdArgs;
9323 const char *Exec;
9324
9325 // Silence warning for "clang -g foo.o -o foo"
9326 Args.ClaimAllArgs(options::OPT_g_Group);
9327 // and "clang -emit-llvm foo.o -o foo"
9328 Args.ClaimAllArgs(options::OPT_emit_llvm);
9329 // and for "clang -w foo.o -o foo"
9330 Args.ClaimAllArgs(options::OPT_w);
9331 // Other warning options are already handled somewhere else.
9332
9333 if (!D.SysRoot.empty())
9334 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9335
9336 if (Args.hasArg(options::OPT_pie))
9337 CmdArgs.push_back("-pie");
9338 if (Args.hasArg(options::OPT_rdynamic))
9339 CmdArgs.push_back("-export-dynamic");
9340 if (Args.hasArg(options::OPT_s))
9341 CmdArgs.push_back("--strip-all");
9342
9343 CmdArgs.push_back("-m");
9344 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009345 default:
9346 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009347 case llvm::Triple::arm:
9348 case llvm::Triple::thumb:
9349 // FIXME: this is incorrect for WinCE
9350 CmdArgs.push_back("thumb2pe");
9351 break;
9352 case llvm::Triple::x86:
9353 CmdArgs.push_back("i386pe");
9354 EntryPoint.append("_");
9355 break;
9356 case llvm::Triple::x86_64:
9357 CmdArgs.push_back("i386pep");
9358 break;
9359 }
9360
9361 if (Args.hasArg(options::OPT_shared)) {
9362 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009363 default:
9364 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009365 case llvm::Triple::arm:
9366 case llvm::Triple::thumb:
9367 case llvm::Triple::x86_64:
9368 EntryPoint.append("_DllMainCRTStartup");
9369 break;
9370 case llvm::Triple::x86:
9371 EntryPoint.append("_DllMainCRTStartup@12");
9372 break;
9373 }
9374
9375 CmdArgs.push_back("-shared");
9376 CmdArgs.push_back("-Bdynamic");
9377
9378 CmdArgs.push_back("--enable-auto-image-base");
9379
9380 CmdArgs.push_back("--entry");
9381 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9382 } else {
9383 EntryPoint.append("mainCRTStartup");
9384
9385 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9386 : "-Bdynamic");
9387
9388 if (!Args.hasArg(options::OPT_nostdlib) &&
9389 !Args.hasArg(options::OPT_nostartfiles)) {
9390 CmdArgs.push_back("--entry");
9391 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9392 }
9393
9394 // FIXME: handle subsystem
9395 }
9396
9397 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009398 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009399
9400 CmdArgs.push_back("-o");
9401 CmdArgs.push_back(Output.getFilename());
9402
9403 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9404 SmallString<261> ImpLib(Output.getFilename());
9405 llvm::sys::path::replace_extension(ImpLib, ".lib");
9406
9407 CmdArgs.push_back("--out-implib");
9408 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9409 }
9410
9411 if (!Args.hasArg(options::OPT_nostdlib) &&
9412 !Args.hasArg(options::OPT_nostartfiles)) {
9413 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9414 const char *CRTBegin;
9415
9416 CRTBegin =
9417 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9418 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9419 }
9420
9421 Args.AddAllArgs(CmdArgs, options::OPT_L);
9422
9423 const auto &Paths = TC.getFilePaths();
9424 for (const auto &Path : Paths)
9425 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9426
9427 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9428
9429 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9430 !Args.hasArg(options::OPT_nodefaultlibs)) {
9431 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9432 !Args.hasArg(options::OPT_static);
9433 if (StaticCXX)
9434 CmdArgs.push_back("-Bstatic");
9435 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9436 if (StaticCXX)
9437 CmdArgs.push_back("-Bdynamic");
9438 }
9439
9440 if (!Args.hasArg(options::OPT_nostdlib)) {
9441 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9442 // TODO handle /MT[d] /MD[d]
9443 CmdArgs.push_back("-lmsvcrt");
9444 AddRunTimeLibs(TC, D, CmdArgs, Args);
9445 }
9446 }
9447
9448 const std::string Linker = TC.GetProgramPath("ld");
9449 Exec = Args.MakeArgString(Linker);
9450
Justin Bognerd3371d82015-07-17 03:35:54 +00009451 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009452}
Douglas Katzman84a75642015-06-19 14:55:19 +00009453
Douglas Katzman95354292015-06-23 20:42:09 +00009454void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9455 const InputInfo &Output,
9456 const InputInfoList &Inputs,
9457 const ArgList &Args,
9458 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009459
9460 ArgStringList CmdArgs;
9461
9462 assert(Inputs.size() == 1);
9463 const InputInfo &II = Inputs[0];
9464 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9465 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9466
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009467 // Append all -I, -iquote, -isystem paths, and defines/undefines.
Douglas Katzman84a75642015-06-19 14:55:19 +00009468 // These are spelled the same way in clang and moviCompile.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009469 Args.AddAllArgs(CmdArgs,
9470 {options::OPT_clang_i_Group, options::OPT_D, options::OPT_U});
Douglas Katzman84a75642015-06-19 14:55:19 +00009471
9472 CmdArgs.push_back("-DMYRIAD2");
9473 CmdArgs.push_back("-mcpu=myriad2");
9474 CmdArgs.push_back("-S");
9475
9476 // Any -O option passes through without translation. What about -Ofast ?
9477 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9478 A->render(Args, CmdArgs);
9479
9480 if (Args.hasFlag(options::OPT_ffunction_sections,
9481 options::OPT_fno_function_sections)) {
9482 CmdArgs.push_back("-ffunction-sections");
9483 }
9484 if (Args.hasArg(options::OPT_fno_inline_functions))
9485 CmdArgs.push_back("-fno-inline-functions");
9486
9487 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9488
9489 CmdArgs.push_back(II.getFilename());
9490 CmdArgs.push_back("-o");
9491 CmdArgs.push_back(Output.getFilename());
9492
9493 std::string Exec =
9494 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009495 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9496 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009497}
9498
Douglas Katzman95354292015-06-23 20:42:09 +00009499void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9500 const InputInfo &Output,
9501 const InputInfoList &Inputs,
9502 const ArgList &Args,
9503 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009504 ArgStringList CmdArgs;
9505
9506 assert(Inputs.size() == 1);
9507 const InputInfo &II = Inputs[0];
9508 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9509 assert(Output.getType() == types::TY_Object);
9510
9511 CmdArgs.push_back("-no6thSlotCompression");
9512 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9513 CmdArgs.push_back("-noSPrefixing");
9514 CmdArgs.push_back("-a"); // Mystery option.
9515 for (auto Arg : Args.filtered(options::OPT_I)) {
9516 Arg->claim();
9517 CmdArgs.push_back(
9518 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9519 }
9520 CmdArgs.push_back("-elf"); // Output format.
9521 CmdArgs.push_back(II.getFilename());
9522 CmdArgs.push_back(
9523 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9524
9525 std::string Exec =
9526 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009527 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9528 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009529}