blob: f23765b8c88ba960c0e2dc876970d007cb07cc06 [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 // Check -march. ClangAs gives preference to -Wa,-march=.
719 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000720 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000721 if (WaArch) {
722 if (ArchArg)
723 D.Diag(clang::diag::warn_drv_unused_argument)
724 << ArchArg->getAsString(Args);
725 ArchName = StringRef(WaArch->getValue()).substr(7);
726 checkARMArchName(D, WaArch, Args, ArchName, Triple);
727 // FIXME: Set Arch.
728 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
729 } else if (ArchArg) {
730 ArchName = ArchArg->getValue();
731 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000732 }
733
Renato Golin7c542b42015-07-27 23:44:45 +0000734 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
735 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000736 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000737 if (WaCPU) {
738 if (CPUArg)
739 D.Diag(clang::diag::warn_drv_unused_argument)
740 << CPUArg->getAsString(Args);
741 CPUName = StringRef(WaCPU->getValue()).substr(6);
742 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
743 } else if (CPUArg) {
744 CPUName = CPUArg->getValue();
745 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000746 }
John Brawna95c1a82015-05-08 12:52:18 +0000747
Renato Golin23459c62015-07-30 16:40:17 +0000748 // Add CPU features for generic CPUs
749 if (CPUName == "native") {
750 llvm::StringMap<bool> HostFeatures;
751 if (llvm::sys::getHostCPUFeatures(HostFeatures))
752 for (auto &F : HostFeatures)
753 Features.push_back(
754 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
755 }
756
757 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
758 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
759 if (WaFPU) {
760 if (FPUArg)
761 D.Diag(clang::diag::warn_drv_unused_argument)
762 << FPUArg->getAsString(Args);
763 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
764 Features);
765 } else if (FPUArg) {
766 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
767 }
768
769 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
770 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
771 if (WaHDiv) {
772 if (HDivArg)
773 D.Diag(clang::diag::warn_drv_unused_argument)
774 << HDivArg->getAsString(Args);
775 getARMHWDivFeatures(D, WaHDiv, Args,
776 StringRef(WaHDiv->getValue()).substr(8), Features);
777 } else if (HDivArg)
778 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
779
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000780 // Setting -msoft-float effectively disables NEON because of the GCC
781 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000782 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000783 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000784 // Also need to explicitly disable features which imply NEON.
785 Features.push_back("-crypto");
786 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000787
Eric Christopher269c2a22015-04-04 03:34:43 +0000788 // En/disable crc code generation.
789 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000790 if (A->getOption().matches(options::OPT_mcrc))
791 Features.push_back("+crc");
792 else
793 Features.push_back("-crc");
794 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000795
796 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
797 Features.insert(Features.begin(), "+v8.1a");
798 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000799
Akira Hatanakac2694822015-07-07 08:28:42 +0000800 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
801 // neither options are specified, see if we are compiling for kernel/kext and
802 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000803 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
804 options::OPT_mno_long_calls)) {
805 if (A->getOption().matches(options::OPT_mlong_calls))
806 Features.push_back("+long-calls");
807 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
808 Features.push_back("+long-calls");
809 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000810
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000811 // Kernel code has more strict alignment requirements.
812 if (KernelOrKext)
813 Features.push_back("+strict-align");
814 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
815 options::OPT_munaligned_access)) {
816 if (A->getOption().matches(options::OPT_munaligned_access)) {
817 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
818 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
819 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
820 } else
821 Features.push_back("+strict-align");
822 } else {
823 // Assume pre-ARMv6 doesn't support unaligned accesses.
824 //
825 // ARMv6 may or may not support unaligned accesses depending on the
826 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
827 // Darwin and NetBSD targets support unaligned accesses, and others don't.
828 //
829 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
830 // which raises an alignment fault on unaligned accesses. Linux
831 // defaults this bit to 0 and handles it as a system-wide (not
832 // per-process) setting. It is therefore safe to assume that ARMv7+
833 // Linux targets support unaligned accesses. The same goes for NaCl.
834 //
835 // The above behavior is consistent with GCC.
836 int VersionNum = getARMSubArchVersionNumber(Triple);
837 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
838 if (VersionNum < 6)
839 Features.push_back("+strict-align");
840 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
841 if (VersionNum < 7)
842 Features.push_back("+strict-align");
843 } else
844 Features.push_back("+strict-align");
845 }
846
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000847 // llvm does not support reserving registers in general. There is support
848 // for reserving r9 on ARM though (defined as a platform-specific register
849 // in ARM EABI).
850 if (Args.hasArg(options::OPT_ffixed_r9))
851 Features.push_back("+reserve-r9");
852
Akira Hatanaka580efb22015-07-16 00:43:00 +0000853 // The kext linker doesn't know how to deal with movw/movt.
854 if (KernelOrKext)
855 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000856}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000857
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000858void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859 bool KernelOrKext) const {
860 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000861 // Get the effective triple, which takes into account the deployment target.
862 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
863 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000864
865 // Select the ABI to use.
866 //
867 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000868 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000869 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000870 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000871 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000872 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000873 // The backend is hardwired to assume AAPCS for M-class processors, ensure
874 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000875 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000876 Triple.getOS() == llvm::Triple::UnknownOS || isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000877 ABIName = "aapcs";
878 } else {
879 ABIName = "apcs-gnu";
880 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000881 } else if (Triple.isOSWindows()) {
882 // FIXME: this is invalid for WindowsCE
883 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000884 } else {
885 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000886 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000887 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000888 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000889 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000890 ABIName = "aapcs-linux";
891 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000892 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000893 case llvm::Triple::EABI:
894 ABIName = "aapcs";
895 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000896 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000897 if (Triple.getOS() == llvm::Triple::NetBSD)
898 ABIName = "apcs-gnu";
899 else
900 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000901 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000902 }
903 }
904 CmdArgs.push_back("-target-abi");
905 CmdArgs.push_back(ABIName);
906
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000907 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000908 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000909 if (FloatABI == "soft") {
910 // Floating point operations and argument passing are soft.
911 //
912 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000913 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000914 CmdArgs.push_back("-mfloat-abi");
915 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000916 } else if (FloatABI == "softfp") {
917 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000918 CmdArgs.push_back("-mfloat-abi");
919 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000920 } else {
921 // Floating point operations and argument passing are hard.
922 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000923 CmdArgs.push_back("-mfloat-abi");
924 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000925 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000926
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000927 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000928 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
929 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000930 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000931 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000932 CmdArgs.push_back("-arm-global-merge=false");
933 else
934 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000935 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000936
Bob Wilson9c8af452013-04-11 18:53:25 +0000937 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000938 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000939 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000940}
Renato Goline17c5802015-07-27 23:44:42 +0000941// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000942
Tim Northover573cbee2014-05-24 12:52:07 +0000943/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
944/// targeting.
945static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000946 Arg *A;
947 std::string CPU;
948 // If we have -mtune or -mcpu, use that.
949 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000950 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000951 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000952 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000953 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000954 }
955
Kevin Qin110db6f2014-07-18 07:03:22 +0000956 // Handle CPU name is 'native'.
957 if (CPU == "native")
958 return llvm::sys::getHostCPUName();
959 else if (CPU.size())
960 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000961
James Molloy9b1586b2014-04-17 12:51:17 +0000962 // Make sure we pick "cyclone" if -arch is used.
963 // FIXME: Should this be picked by checking the target triple instead?
964 if (Args.getLastArg(options::OPT_arch))
965 return "cyclone";
966
967 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000968}
969
Tim Northover573cbee2014-05-24 12:52:07 +0000970void Clang::AddAArch64TargetArgs(const ArgList &Args,
971 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000972 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
973 llvm::Triple Triple(TripleStr);
974
975 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
976 Args.hasArg(options::OPT_mkernel) ||
977 Args.hasArg(options::OPT_fapple_kext))
978 CmdArgs.push_back("-disable-red-zone");
979
980 if (!Args.hasFlag(options::OPT_mimplicit_float,
981 options::OPT_mno_implicit_float, true))
982 CmdArgs.push_back("-no-implicit-float");
983
Craig Topper92fc2df2014-05-17 16:56:41 +0000984 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000985 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
986 ABIName = A->getValue();
987 else if (Triple.isOSDarwin())
988 ABIName = "darwinpcs";
989 else
990 ABIName = "aapcs";
991
992 CmdArgs.push_back("-target-abi");
993 CmdArgs.push_back(ABIName);
994
Bradley Smith9ff64332014-10-13 10:16:06 +0000995 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
996 options::OPT_mno_fix_cortex_a53_835769)) {
997 CmdArgs.push_back("-backend-option");
998 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
999 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1000 else
1001 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001002 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
1003 // Enabled A53 errata (835769) workaround by default on android
1004 CmdArgs.push_back("-backend-option");
1005 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001006 }
1007
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001008 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001009 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1010 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001011 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001012 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001013 CmdArgs.push_back("-aarch64-global-merge=false");
1014 else
1015 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001016 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001017}
1018
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001019// Get CPU and ABI names. They are not independent
1020// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001021void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1022 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001023 const char *DefMips32CPU = "mips32r2";
1024 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001025
Daniel Sanders2bf13662014-07-10 14:40:57 +00001026 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1027 // default for mips64(el)?-img-linux-gnu.
1028 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1029 Triple.getEnvironment() == llvm::Triple::GNU) {
1030 DefMips32CPU = "mips32r6";
1031 DefMips64CPU = "mips64r6";
1032 }
Renato Golin7c542b42015-07-27 23:44:45 +00001033
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001034 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1035 if (Triple.getEnvironment() == llvm::Triple::Android)
1036 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001037
Brad Smithba26f582015-01-06 02:53:17 +00001038 // MIPS3 is the default for mips64*-unknown-openbsd.
1039 if (Triple.getOS() == llvm::Triple::OpenBSD)
1040 DefMips64CPU = "mips3";
1041
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001042 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001043 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001044
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001045 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001046 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001047 // Convert a GNU style Mips ABI name to the name
1048 // accepted by LLVM Mips backend.
1049 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001050 .Case("32", "o32")
1051 .Case("64", "n64")
1052 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001053 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001054
1055 // Setup default CPU and ABI names.
1056 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001057 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001058 default:
1059 llvm_unreachable("Unexpected triple arch name");
1060 case llvm::Triple::mips:
1061 case llvm::Triple::mipsel:
1062 CPUName = DefMips32CPU;
1063 break;
1064 case llvm::Triple::mips64:
1065 case llvm::Triple::mips64el:
1066 CPUName = DefMips64CPU;
1067 break;
1068 }
1069 }
1070
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001071 if (ABIName.empty()) {
1072 // Deduce ABI name from the target triple.
1073 if (Triple.getArch() == llvm::Triple::mips ||
1074 Triple.getArch() == llvm::Triple::mipsel)
1075 ABIName = "o32";
1076 else
1077 ABIName = "n64";
1078 }
1079
1080 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001081 // Deduce CPU name from ABI name.
1082 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083 .Cases("o32", "eabi", DefMips32CPU)
1084 .Cases("n32", "n64", DefMips64CPU)
1085 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001086 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001087
1088 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001089}
1090
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001091// Convert ABI name to the GNU tools acceptable variant.
1092static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1093 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001094 .Case("o32", "32")
1095 .Case("n64", "64")
1096 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001097}
1098
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001099// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1100// and -mfloat-abi=.
1101static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001102 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001103 if (Arg *A =
1104 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1105 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001106 if (A->getOption().matches(options::OPT_msoft_float))
1107 FloatABI = "soft";
1108 else if (A->getOption().matches(options::OPT_mhard_float))
1109 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001110 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001111 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001112 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001113 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001114 FloatABI = "hard";
1115 }
1116 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001117 }
1118
1119 // If unspecified, choose the default based on the platform.
1120 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001121 // Assume "hard", because it's a default value used by gcc.
1122 // When we start to recognize specific target MIPS processors,
1123 // we will be able to select the default more correctly.
1124 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001125 }
1126
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001127 return FloatABI;
1128}
1129
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001131 std::vector<const char *> &Features,
1132 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001133 StringRef FeatureName) {
1134 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001135 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001136 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001137 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001138 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001139 }
1140}
1141
Daniel Sanders379d44b2014-07-16 11:52:23 +00001142static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1143 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001144 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001145 StringRef CPUName;
1146 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001147 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001148 ABIName = getGnuCompatibleMipsABIName(ABIName);
1149
Daniel Sandersfeb61302014-08-08 15:47:17 +00001150 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1151 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001152
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001153 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001154 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001155 // FIXME: Note, this is a hack. We need to pass the selected float
1156 // mode to the MipsTargetInfoBase to define appropriate macros there.
1157 // Now it is the only method.
1158 Features.push_back("+soft-float");
1159 }
1160
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001161 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001162 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001163 if (Val == "2008") {
1164 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1165 Features.push_back("+nan2008");
1166 else {
1167 Features.push_back("-nan2008");
1168 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1169 }
1170 } else if (Val == "legacy") {
1171 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1172 Features.push_back("-nan2008");
1173 else {
1174 Features.push_back("+nan2008");
1175 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1176 }
1177 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001178 D.Diag(diag::err_drv_unsupported_option_argument)
1179 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001180 }
1181
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001182 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1183 options::OPT_mdouble_float, "single-float");
1184 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1185 "mips16");
1186 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1187 options::OPT_mno_micromips, "micromips");
1188 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1189 "dsp");
1190 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1191 "dspr2");
1192 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1193 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001194
1195 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1196 // pass -mfpxx
1197 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1198 options::OPT_mfp64)) {
1199 if (A->getOption().matches(options::OPT_mfp32))
1200 Features.push_back(Args.MakeArgString("-fp64"));
1201 else if (A->getOption().matches(options::OPT_mfpxx)) {
1202 Features.push_back(Args.MakeArgString("+fpxx"));
1203 Features.push_back(Args.MakeArgString("+nooddspreg"));
1204 } else
1205 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001206 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001207 Features.push_back(Args.MakeArgString("+fpxx"));
1208 Features.push_back(Args.MakeArgString("+nooddspreg"));
1209 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001210
Daniel Sanders28e5d392014-07-10 10:39:51 +00001211 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1212 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001213}
1214
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001215void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001216 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001217 const Driver &D = getToolChain().getDriver();
1218 StringRef CPUName;
1219 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001220 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001221 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001222
1223 CmdArgs.push_back("-target-abi");
1224 CmdArgs.push_back(ABIName.data());
1225
1226 StringRef FloatABI = getMipsFloatABI(D, Args);
1227
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001228 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001229 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001230 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001231 CmdArgs.push_back("-mfloat-abi");
1232 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001233 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001234 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001235 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001236 CmdArgs.push_back("-mfloat-abi");
1237 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001238 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001239
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001240 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1241 if (A->getOption().matches(options::OPT_mxgot)) {
1242 CmdArgs.push_back("-mllvm");
1243 CmdArgs.push_back("-mxgot");
1244 }
1245 }
1246
Simon Atanasyanc580b322013-05-11 06:33:44 +00001247 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1248 options::OPT_mno_ldc1_sdc1)) {
1249 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1250 CmdArgs.push_back("-mllvm");
1251 CmdArgs.push_back("-mno-ldc1-sdc1");
1252 }
1253 }
1254
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1256 options::OPT_mno_check_zero_division)) {
1257 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1258 CmdArgs.push_back("-mllvm");
1259 CmdArgs.push_back("-mno-check-zero-division");
1260 }
1261 }
1262
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001263 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001264 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001265 CmdArgs.push_back("-mllvm");
1266 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1267 A->claim();
1268 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001269}
1270
Hal Finkel8eb59282012-06-11 22:35:19 +00001271/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1272static std::string getPPCTargetCPU(const ArgList &Args) {
1273 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001274 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001275
1276 if (CPUName == "native") {
1277 std::string CPU = llvm::sys::getHostCPUName();
1278 if (!CPU.empty() && CPU != "generic")
1279 return CPU;
1280 else
1281 return "";
1282 }
1283
1284 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001285 .Case("common", "generic")
1286 .Case("440", "440")
1287 .Case("440fp", "440")
1288 .Case("450", "450")
1289 .Case("601", "601")
1290 .Case("602", "602")
1291 .Case("603", "603")
1292 .Case("603e", "603e")
1293 .Case("603ev", "603ev")
1294 .Case("604", "604")
1295 .Case("604e", "604e")
1296 .Case("620", "620")
1297 .Case("630", "pwr3")
1298 .Case("G3", "g3")
1299 .Case("7400", "7400")
1300 .Case("G4", "g4")
1301 .Case("7450", "7450")
1302 .Case("G4+", "g4+")
1303 .Case("750", "750")
1304 .Case("970", "970")
1305 .Case("G5", "g5")
1306 .Case("a2", "a2")
1307 .Case("a2q", "a2q")
1308 .Case("e500mc", "e500mc")
1309 .Case("e5500", "e5500")
1310 .Case("power3", "pwr3")
1311 .Case("power4", "pwr4")
1312 .Case("power5", "pwr5")
1313 .Case("power5x", "pwr5x")
1314 .Case("power6", "pwr6")
1315 .Case("power6x", "pwr6x")
1316 .Case("power7", "pwr7")
1317 .Case("power8", "pwr8")
1318 .Case("pwr3", "pwr3")
1319 .Case("pwr4", "pwr4")
1320 .Case("pwr5", "pwr5")
1321 .Case("pwr5x", "pwr5x")
1322 .Case("pwr6", "pwr6")
1323 .Case("pwr6x", "pwr6x")
1324 .Case("pwr7", "pwr7")
1325 .Case("pwr8", "pwr8")
1326 .Case("powerpc", "ppc")
1327 .Case("powerpc64", "ppc64")
1328 .Case("powerpc64le", "ppc64le")
1329 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001330 }
1331
1332 return "";
1333}
1334
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001335static void getPPCTargetFeatures(const ArgList &Args,
1336 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001337 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1338 StringRef Name = A->getOption().getName();
1339 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001340
1341 // Skip over "-m".
1342 assert(Name.startswith("m") && "Invalid feature name.");
1343 Name = Name.substr(1);
1344
1345 bool IsNegative = Name.startswith("no-");
1346 if (IsNegative)
1347 Name = Name.substr(3);
1348
1349 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1350 // pass the correct option to the backend while calling the frontend
1351 // option the same.
1352 // TODO: Change the LLVM backend option maybe?
1353 if (Name == "mfcrf")
1354 Name = "mfocrf";
1355
1356 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1357 }
1358
1359 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001360 AddTargetFeature(Args, Features, options::OPT_faltivec,
1361 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001362}
1363
Ulrich Weigand8afad612014-07-28 13:17:52 +00001364void Clang::AddPPCTargetArgs(const ArgList &Args,
1365 ArgStringList &CmdArgs) const {
1366 // Select the ABI to use.
1367 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001368 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001369 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001370 case llvm::Triple::ppc64: {
1371 // When targeting a processor that supports QPX, or if QPX is
1372 // specifically enabled, default to using the ABI that supports QPX (so
1373 // long as it is not specifically disabled).
1374 bool HasQPX = false;
1375 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1376 HasQPX = A->getValue() == StringRef("a2q");
1377 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1378 if (HasQPX) {
1379 ABIName = "elfv1-qpx";
1380 break;
1381 }
1382
Ulrich Weigand8afad612014-07-28 13:17:52 +00001383 ABIName = "elfv1";
1384 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001385 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001386 case llvm::Triple::ppc64le:
1387 ABIName = "elfv2";
1388 break;
1389 default:
1390 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001391 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001392
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001393 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1394 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1395 // the option if given as we don't have backend support for any targets
1396 // that don't use the altivec abi.
1397 if (StringRef(A->getValue()) != "altivec")
1398 ABIName = A->getValue();
1399
Ulrich Weigand8afad612014-07-28 13:17:52 +00001400 if (ABIName) {
1401 CmdArgs.push_back("-target-abi");
1402 CmdArgs.push_back(ABIName);
1403 }
1404}
1405
1406bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1407 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1408 return A && (A->getValue() == StringRef(Value));
1409}
1410
Tom Stellard6674c702013-04-01 20:56:53 +00001411/// Get the (LLVM) name of the R600 gpu we are targeting.
1412static std::string getR600TargetGPU(const ArgList &Args) {
1413 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001414 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001415 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001416 .Cases("rv630", "rv635", "r600")
1417 .Cases("rv610", "rv620", "rs780", "rs880")
1418 .Case("rv740", "rv770")
1419 .Case("palm", "cedar")
1420 .Cases("sumo", "sumo2", "sumo")
1421 .Case("hemlock", "cypress")
1422 .Case("aruba", "cayman")
1423 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001424 }
1425 return "";
1426}
1427
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001428void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001429 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001430 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001431 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001432
James Y Knightb2406522015-06-15 20:51:24 +00001433 bool SoftFloatABI = false;
1434 if (Arg *A =
1435 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001436 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001437 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001438 }
1439
James Y Knightb2406522015-06-15 20:51:24 +00001440 // Only the hard-float ABI on Sparc is standardized, and it is the
1441 // default. GCC also supports a nonstandard soft-float ABI mode, and
1442 // perhaps LLVM should implement that, too. However, since llvm
1443 // currently does not support Sparc soft-float, at all, display an
1444 // error if it's requested.
1445 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001446 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1447 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001448 }
1449}
1450
Richard Sandiford4652d892013-07-19 16:51:51 +00001451static const char *getSystemZTargetCPU(const ArgList &Args) {
1452 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1453 return A->getValue();
1454 return "z10";
1455}
1456
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001457static void getSystemZTargetFeatures(const ArgList &Args,
1458 std::vector<const char *> &Features) {
1459 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001460 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001461 if (A->getOption().matches(options::OPT_mhtm))
1462 Features.push_back("+transactional-execution");
1463 else
1464 Features.push_back("-transactional-execution");
1465 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001466 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001467 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001468 if (A->getOption().matches(options::OPT_mvx))
1469 Features.push_back("+vector");
1470 else
1471 Features.push_back("-vector");
1472 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001473}
1474
Chandler Carruth953fb082013-01-13 11:46:33 +00001475static const char *getX86TargetCPU(const ArgList &Args,
1476 const llvm::Triple &Triple) {
1477 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001478 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001479 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001480 return "core-avx2";
1481
Chandler Carruth953fb082013-01-13 11:46:33 +00001482 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001483 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001484
1485 // FIXME: Reject attempts to use -march=native unless the target matches
1486 // the host.
1487 //
1488 // FIXME: We should also incorporate the detected target features for use
1489 // with -native.
1490 std::string CPU = llvm::sys::getHostCPUName();
1491 if (!CPU.empty() && CPU != "generic")
1492 return Args.MakeArgString(CPU);
1493 }
1494
Reid Kleckner3123eff2015-06-30 16:32:04 +00001495 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1496 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1497 StringRef Arch = A->getValue();
1498 const char *CPU;
1499 if (Triple.getArch() == llvm::Triple::x86) {
1500 CPU = llvm::StringSwitch<const char *>(Arch)
1501 .Case("IA32", "i386")
1502 .Case("SSE", "pentium3")
1503 .Case("SSE2", "pentium4")
1504 .Case("AVX", "sandybridge")
1505 .Case("AVX2", "haswell")
1506 .Default(nullptr);
1507 } else {
1508 CPU = llvm::StringSwitch<const char *>(Arch)
1509 .Case("AVX", "sandybridge")
1510 .Case("AVX2", "haswell")
1511 .Default(nullptr);
1512 }
1513 if (CPU)
1514 return CPU;
1515 }
1516
Chandler Carruth953fb082013-01-13 11:46:33 +00001517 // Select the default CPU if none was given (or detection failed).
1518
1519 if (Triple.getArch() != llvm::Triple::x86_64 &&
1520 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001521 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001522
1523 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1524
1525 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001526 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001527 if (Triple.getArchName() == "x86_64h")
1528 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001529 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001530 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001531
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001532 // Set up default CPU name for PS4 compilers.
1533 if (Triple.isPS4CPU())
1534 return "btver2";
1535
Alexey Bataev286d1b92014-01-31 04:07:13 +00001536 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001537 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001538 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001539
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001540 // Everything else goes to x86-64 in 64-bit mode.
1541 if (Is64Bit)
1542 return "x86-64";
1543
1544 switch (Triple.getOS()) {
1545 case llvm::Triple::FreeBSD:
1546 case llvm::Triple::NetBSD:
1547 case llvm::Triple::OpenBSD:
1548 return "i486";
1549 case llvm::Triple::Haiku:
1550 return "i586";
1551 case llvm::Triple::Bitrig:
1552 return "i686";
1553 default:
1554 // Fallback to p4.
1555 return "pentium4";
1556 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001557}
1558
Renato Golin7c542b42015-07-27 23:44:45 +00001559static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1560 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001561 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001562 default:
1563 return "";
1564
Amara Emerson703da2e2013-10-31 09:32:33 +00001565 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001566 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001567 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001568
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001569 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001570 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001571 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001572 case llvm::Triple::thumbeb: {
1573 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001574 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001575 return arm::getARMTargetCPU(MCPU, MArch, T);
1576 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001577 case llvm::Triple::mips:
1578 case llvm::Triple::mipsel:
1579 case llvm::Triple::mips64:
1580 case llvm::Triple::mips64el: {
1581 StringRef CPUName;
1582 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001583 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001584 return CPUName;
1585 }
1586
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001587 case llvm::Triple::nvptx:
1588 case llvm::Triple::nvptx64:
1589 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1590 return A->getValue();
1591 return "";
1592
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001593 case llvm::Triple::ppc:
1594 case llvm::Triple::ppc64:
1595 case llvm::Triple::ppc64le: {
1596 std::string TargetCPUName = getPPCTargetCPU(Args);
1597 // LLVM may default to generating code for the native CPU,
1598 // but, like gcc, we default to a more generic option for
1599 // each architecture. (except on Darwin)
1600 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1601 if (T.getArch() == llvm::Triple::ppc64)
1602 TargetCPUName = "ppc64";
1603 else if (T.getArch() == llvm::Triple::ppc64le)
1604 TargetCPUName = "ppc64le";
1605 else
1606 TargetCPUName = "ppc";
1607 }
1608 return TargetCPUName;
1609 }
1610
1611 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001612 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001613 case llvm::Triple::sparcv9:
1614 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001615 return A->getValue();
1616 return "";
1617
1618 case llvm::Triple::x86:
1619 case llvm::Triple::x86_64:
1620 return getX86TargetCPU(Args, T);
1621
1622 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001623 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001624
1625 case llvm::Triple::systemz:
1626 return getSystemZTargetCPU(Args);
1627
1628 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001629 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001630 return getR600TargetGPU(Args);
1631 }
1632}
1633
Alp Tokerce365ca2013-12-02 12:43:03 +00001634static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1635 ArgStringList &CmdArgs) {
1636 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1637 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1638 // forward.
1639 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001640 std::string Plugin =
1641 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001642 CmdArgs.push_back(Args.MakeArgString(Plugin));
1643
1644 // Try to pass driver level flags relevant to LTO code generation down to
1645 // the plugin.
1646
1647 // Handle flags for selecting CPU variants.
1648 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1649 if (!CPU.empty())
1650 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1651}
1652
Sanjay Patel2987c292015-06-11 14:53:41 +00001653/// This is a helper function for validating the optional refinement step
1654/// parameter in reciprocal argument strings. Return false if there is an error
1655/// parsing the refinement step. Otherwise, return true and set the Position
1656/// of the refinement step in the input string.
1657static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001658 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001659 const char RefinementStepToken = ':';
1660 Position = In.find(RefinementStepToken);
1661 if (Position != StringRef::npos) {
1662 StringRef Option = A.getOption().getName();
1663 StringRef RefStep = In.substr(Position + 1);
1664 // Allow exactly one numeric character for the additional refinement
1665 // step parameter. This is reasonable for all currently-supported
1666 // operations and architectures because we would expect that a larger value
1667 // of refinement steps would cause the estimate "optimization" to
1668 // under-perform the native operation. Also, if the estimate does not
1669 // converge quickly, it probably will not ever converge, so further
1670 // refinement steps will not produce a better answer.
1671 if (RefStep.size() != 1) {
1672 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1673 return false;
1674 }
1675 char RefStepChar = RefStep[0];
1676 if (RefStepChar < '0' || RefStepChar > '9') {
1677 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1678 return false;
1679 }
1680 }
1681 return true;
1682}
1683
1684/// The -mrecip flag requires processing of many optional parameters.
1685static void ParseMRecip(const Driver &D, const ArgList &Args,
1686 ArgStringList &OutStrings) {
1687 StringRef DisabledPrefixIn = "!";
1688 StringRef DisabledPrefixOut = "!";
1689 StringRef EnabledPrefixOut = "";
1690 StringRef Out = "-mrecip=";
1691
1692 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1693 if (!A)
1694 return;
1695
1696 unsigned NumOptions = A->getNumValues();
1697 if (NumOptions == 0) {
1698 // No option is the same as "all".
1699 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1700 return;
1701 }
1702
1703 // Pass through "all", "none", or "default" with an optional refinement step.
1704 if (NumOptions == 1) {
1705 StringRef Val = A->getValue(0);
1706 size_t RefStepLoc;
1707 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1708 return;
1709 StringRef ValBase = Val.slice(0, RefStepLoc);
1710 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1711 OutStrings.push_back(Args.MakeArgString(Out + Val));
1712 return;
1713 }
1714 }
1715
1716 // Each reciprocal type may be enabled or disabled individually.
1717 // Check each input value for validity, concatenate them all back together,
1718 // and pass through.
1719
1720 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001721 OptionStrings.insert(std::make_pair("divd", false));
1722 OptionStrings.insert(std::make_pair("divf", false));
1723 OptionStrings.insert(std::make_pair("vec-divd", false));
1724 OptionStrings.insert(std::make_pair("vec-divf", false));
1725 OptionStrings.insert(std::make_pair("sqrtd", false));
1726 OptionStrings.insert(std::make_pair("sqrtf", false));
1727 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1728 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001729
1730 for (unsigned i = 0; i != NumOptions; ++i) {
1731 StringRef Val = A->getValue(i);
1732
1733 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1734 // Ignore the disablement token for string matching.
1735 if (IsDisabled)
1736 Val = Val.substr(1);
1737
1738 size_t RefStep;
1739 if (!getRefinementStep(Val, D, *A, RefStep))
1740 return;
1741
1742 StringRef ValBase = Val.slice(0, RefStep);
1743 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1744 if (OptionIter == OptionStrings.end()) {
1745 // Try again specifying float suffix.
1746 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1747 if (OptionIter == OptionStrings.end()) {
1748 // The input name did not match any known option string.
1749 D.Diag(diag::err_drv_unknown_argument) << Val;
1750 return;
1751 }
1752 // The option was specified without a float or double suffix.
1753 // Make sure that the double entry was not already specified.
1754 // The float entry will be checked below.
1755 if (OptionStrings[ValBase.str() + 'd']) {
1756 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1757 return;
1758 }
1759 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001760
Sanjay Patel2987c292015-06-11 14:53:41 +00001761 if (OptionIter->second == true) {
1762 // Duplicate option specified.
1763 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1764 return;
1765 }
1766
1767 // Mark the matched option as found. Do not allow duplicate specifiers.
1768 OptionIter->second = true;
1769
1770 // If the precision was not specified, also mark the double entry as found.
1771 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1772 OptionStrings[ValBase.str() + 'd'] = true;
1773
1774 // Build the output string.
1775 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1776 Out = Args.MakeArgString(Out + Prefix + Val);
1777 if (i != NumOptions - 1)
1778 Out = Args.MakeArgString(Out + ",");
1779 }
1780
1781 OutStrings.push_back(Args.MakeArgString(Out));
1782}
1783
Eric Christopherc54920a2015-03-23 19:26:05 +00001784static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001785 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001786 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001787 // If -march=native, autodetect the feature list.
1788 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1789 if (StringRef(A->getValue()) == "native") {
1790 llvm::StringMap<bool> HostFeatures;
1791 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1792 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 Features.push_back(
1794 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001795 }
1796 }
1797
Jim Grosbach82eee262013-11-16 00:53:35 +00001798 if (Triple.getArchName() == "x86_64h") {
1799 // x86_64h implies quite a few of the more modern subtarget features
1800 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1801 Features.push_back("-rdrnd");
1802 Features.push_back("-aes");
1803 Features.push_back("-pclmul");
1804 Features.push_back("-rtm");
1805 Features.push_back("-hle");
1806 Features.push_back("-fsgsbase");
1807 }
1808
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001809 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001810 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001811 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001812 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001813 Features.push_back("+sse4.2");
1814 Features.push_back("+popcnt");
1815 } else
1816 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001817 }
1818
Eric Christopherc54920a2015-03-23 19:26:05 +00001819 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001820 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1821 StringRef Arch = A->getValue();
1822 bool ArchUsed = false;
1823 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001824 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001825 if (Arch == "AVX" || Arch == "AVX2") {
1826 ArchUsed = true;
1827 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1828 }
1829 }
1830 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001831 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001832 if (Arch == "IA32") {
1833 ArchUsed = true;
1834 } else if (Arch == "SSE" || Arch == "SSE2") {
1835 ArchUsed = true;
1836 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1837 }
1838 }
1839 if (!ArchUsed)
1840 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1841 }
1842
Jim Grosbach82eee262013-11-16 00:53:35 +00001843 // Now add any that the user explicitly requested on the command line,
1844 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001845 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1846 StringRef Name = A->getOption().getName();
1847 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001848
1849 // Skip over "-m".
1850 assert(Name.startswith("m") && "Invalid feature name.");
1851 Name = Name.substr(1);
1852
1853 bool IsNegative = Name.startswith("no-");
1854 if (IsNegative)
1855 Name = Name.substr(3);
1856
1857 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1858 }
1859}
1860
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001861void Clang::AddX86TargetArgs(const ArgList &Args,
1862 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001863 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001864 Args.hasArg(options::OPT_mkernel) ||
1865 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001866 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001867
Bob Wilson2616e2e2013-02-10 16:01:41 +00001868 // Default to avoid implicit floating-point for kernel/kext code, but allow
1869 // that to be overridden with -mno-soft-float.
1870 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1871 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001872 if (Arg *A = Args.getLastArg(
1873 options::OPT_msoft_float, options::OPT_mno_soft_float,
1874 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001875 const Option &O = A->getOption();
1876 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1877 O.matches(options::OPT_msoft_float));
1878 }
1879 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001880 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001881
1882 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1883 StringRef Value = A->getValue();
1884 if (Value == "intel" || Value == "att") {
1885 CmdArgs.push_back("-mllvm");
1886 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1887 } else {
1888 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1889 << A->getOption().getName() << Value;
1890 }
1891 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001892}
1893
Tony Linthicum76329bf2011-12-12 21:14:55 +00001894void Clang::AddHexagonTargetArgs(const ArgList &Args,
1895 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001896 CmdArgs.push_back("-mqdsp6-compat");
1897 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001898
Douglas Katzman54366072015-07-27 16:53:08 +00001899 if (const char *v =
1900 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001902 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001903 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001904 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001905 }
1906
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001907 if (!Args.hasArg(options::OPT_fno_short_enums))
1908 CmdArgs.push_back("-fshort-enums");
1909 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001910 CmdArgs.push_back("-mllvm");
1911 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001912 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001913 CmdArgs.push_back("-mllvm");
1914 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001915}
1916
Kevin Qin110db6f2014-07-18 07:03:22 +00001917// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001918static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001919 std::vector<const char *> &Features) {
1920 SmallVector<StringRef, 8> Split;
1921 text.split(Split, StringRef("+"), -1, false);
1922
Douglas Katzman2675d012015-06-29 19:12:56 +00001923 for (const StringRef Feature : Split) {
1924 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001925 .Case("fp", "+fp-armv8")
1926 .Case("simd", "+neon")
1927 .Case("crc", "+crc")
1928 .Case("crypto", "+crypto")
1929 .Case("nofp", "-fp-armv8")
1930 .Case("nosimd", "-neon")
1931 .Case("nocrc", "-crc")
1932 .Case("nocrypto", "-crypto")
1933 .Default(nullptr);
1934 if (result)
1935 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001936 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001937 D.Diag(diag::err_drv_no_neon_modifier);
1938 else
1939 return false;
1940 }
1941 return true;
1942}
1943
1944// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1945// decode CPU and feature.
1946static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1947 std::vector<const char *> &Features) {
1948 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1949 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001950 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1951 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001952 Features.push_back("+neon");
1953 Features.push_back("+crc");
1954 Features.push_back("+crypto");
1955 } else if (CPU == "generic") {
1956 Features.push_back("+neon");
1957 } else {
1958 return false;
1959 }
1960
1961 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1962 return false;
1963
1964 return true;
1965}
1966
1967static bool
1968getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1969 const ArgList &Args,
1970 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001971 std::string MarchLowerCase = March.lower();
1972 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001973
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001974 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001975 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001976 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001977 Features.push_back("+v8.1a");
1978 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001979 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001980 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001981
1982 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1983 return false;
1984
1985 return true;
1986}
1987
1988static bool
1989getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1990 const ArgList &Args,
1991 std::vector<const char *> &Features) {
1992 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001993 std::string McpuLowerCase = Mcpu.lower();
1994 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001995 return false;
1996
1997 return true;
1998}
1999
2000static bool
2001getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2002 const ArgList &Args,
2003 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002004 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002005 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002006 if (MtuneLowerCase == "native")
2007 MtuneLowerCase = llvm::sys::getHostCPUName();
2008 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002009 Features.push_back("+zcm");
2010 Features.push_back("+zcz");
2011 }
2012 return true;
2013}
2014
2015static bool
2016getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2017 const ArgList &Args,
2018 std::vector<const char *> &Features) {
2019 StringRef CPU;
2020 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002021 std::string McpuLowerCase = Mcpu.lower();
2022 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002023 return false;
2024
2025 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2026}
2027
Akira Hatanaka92500472015-07-27 19:29:04 +00002028static void getAArch64TargetFeatures(const Driver &D,
2029 const llvm::Triple &Triple,
2030 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002031 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002032 Arg *A;
2033 bool success = true;
2034 // Enable NEON by default.
2035 Features.push_back("+neon");
2036 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2037 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2038 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2039 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002040 else if (Args.hasArg(options::OPT_arch))
2041 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2042 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002043
2044 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2045 success =
2046 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2047 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2048 success =
2049 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002050 else if (Args.hasArg(options::OPT_arch))
2051 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2052 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002053
2054 if (!success)
2055 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002056
2057 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2058 Features.push_back("-fp-armv8");
2059 Features.push_back("-crypto");
2060 Features.push_back("-neon");
2061 }
Bradley Smith418c5932014-05-02 15:17:51 +00002062
2063 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002064 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002065 if (A->getOption().matches(options::OPT_mcrc))
2066 Features.push_back("+crc");
2067 else
2068 Features.push_back("-crc");
2069 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002070
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002071 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2072 options::OPT_munaligned_access))
2073 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2074 Features.push_back("+strict-align");
2075
Akira Hatanaka92500472015-07-27 19:29:04 +00002076 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002077 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002078}
2079
2080static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002081 const ArgList &Args, ArgStringList &CmdArgs,
2082 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002083 std::vector<const char *> Features;
2084 switch (Triple.getArch()) {
2085 default:
2086 break;
2087 case llvm::Triple::mips:
2088 case llvm::Triple::mipsel:
2089 case llvm::Triple::mips64:
2090 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002091 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002092 break;
2093
2094 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002095 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002096 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002097 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002098 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002099 break;
2100
2101 case llvm::Triple::ppc:
2102 case llvm::Triple::ppc64:
2103 case llvm::Triple::ppc64le:
2104 getPPCTargetFeatures(Args, Features);
2105 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002106 case llvm::Triple::systemz:
2107 getSystemZTargetFeatures(Args, Features);
2108 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002109 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002110 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002111 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002112 break;
2113 case llvm::Triple::x86:
2114 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002115 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002116 break;
2117 }
Rafael Espindola43964802013-08-21 17:34:32 +00002118
2119 // Find the last of each feature.
2120 llvm::StringMap<unsigned> LastOpt;
2121 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2122 const char *Name = Features[I];
2123 assert(Name[0] == '-' || Name[0] == '+');
2124 LastOpt[Name + 1] = I;
2125 }
2126
2127 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2128 // If this feature was overridden, ignore it.
2129 const char *Name = Features[I];
2130 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2131 assert(LastI != LastOpt.end());
2132 unsigned Last = LastI->second;
2133 if (Last != I)
2134 continue;
2135
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002136 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002137 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002138 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002139}
2140
David Majnemerae394812014-12-09 00:12:30 +00002141static bool
2142shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2143 const llvm::Triple &Triple) {
2144 // We use the zero-cost exception tables for Objective-C if the non-fragile
2145 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2146 // later.
2147 if (runtime.isNonFragile())
2148 return true;
2149
2150 if (!Triple.isMacOSX())
2151 return false;
2152
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002153 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002154 (Triple.getArch() == llvm::Triple::x86_64 ||
2155 Triple.getArch() == llvm::Triple::arm));
2156}
2157
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002158/// Adds exception related arguments to the driver command arguments. There's a
2159/// master flag, -fexceptions and also language specific flags to enable/disable
2160/// C++ and Objective-C exceptions. This makes it possible to for example
2161/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002162static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002163 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002164 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002165 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002166 const Driver &D = TC.getDriver();
2167 const llvm::Triple &Triple = TC.getTriple();
2168
Chad Rosier4fab82c2012-03-26 22:04:46 +00002169 if (KernelOrKext) {
2170 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2171 // arguments now to avoid warnings about unused arguments.
2172 Args.ClaimAllArgs(options::OPT_fexceptions);
2173 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2174 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2175 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2176 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2177 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002178 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002179 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002180
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002181 // See if the user explicitly enabled exceptions.
2182 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2183 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002184
David Majnemerae394812014-12-09 00:12:30 +00002185 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2186 // is not necessarily sensible, but follows GCC.
2187 if (types::isObjC(InputType) &&
2188 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002189 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002190 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002191
David Majnemerae394812014-12-09 00:12:30 +00002192 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002193 }
2194
2195 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002196 // Disable C++ EH by default on XCore, PS4, and MSVC.
2197 // FIXME: Remove MSVC from this list once things work.
2198 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2199 !Triple.isPS4CPU() &&
2200 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002201 Arg *ExceptionArg = Args.getLastArg(
2202 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2203 options::OPT_fexceptions, options::OPT_fno_exceptions);
2204 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002205 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002206 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2207 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002208
2209 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002210 if (Triple.isPS4CPU()) {
2211 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2212 assert(ExceptionArg &&
2213 "On the PS4 exceptions should only be enabled if passing "
2214 "an argument");
2215 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2216 const Arg *RTTIArg = TC.getRTTIArg();
2217 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2218 D.Diag(diag::err_drv_argument_not_allowed_with)
2219 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2220 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2221 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2222 } else
2223 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2224
Anders Carlssone96ab552011-02-28 02:27:16 +00002225 CmdArgs.push_back("-fcxx-exceptions");
2226
David Majnemer8de68642014-12-05 08:11:58 +00002227 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002228 }
2229 }
2230
David Majnemer8de68642014-12-05 08:11:58 +00002231 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002232 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002233}
2234
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002235static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002236 bool Default = true;
2237 if (TC.getTriple().isOSDarwin()) {
2238 // The native darwin assembler doesn't support the linker_option directives,
2239 // so we disable them if we think the .s file will be passed to it.
2240 Default = TC.useIntegratedAs();
2241 }
2242 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2243 Default);
2244}
2245
Ted Kremenek62093662013-03-12 17:02:12 +00002246static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2247 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002248 bool UseDwarfDirectory =
2249 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2250 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002251 return !UseDwarfDirectory;
2252}
2253
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002254/// \brief Check whether the given input tree contains any compilation actions.
2255static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002256 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002257 return true;
2258
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002259 for (const auto &Act : *A)
2260 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002261 return true;
2262
2263 return false;
2264}
2265
2266/// \brief Check if -relax-all should be passed to the internal assembler.
2267/// This is done by default when compiling non-assembler source with -O0.
2268static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2269 bool RelaxDefault = true;
2270
2271 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2272 RelaxDefault = A->getOption().matches(options::OPT_O0);
2273
2274 if (RelaxDefault) {
2275 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002276 for (const auto &Act : C.getActions()) {
2277 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002278 RelaxDefault = true;
2279 break;
2280 }
2281 }
2282 }
2283
2284 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002285 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002286}
2287
David Blaikie9260ed62013-07-25 21:19:01 +00002288static void CollectArgsForIntegratedAssembler(Compilation &C,
2289 const ArgList &Args,
2290 ArgStringList &CmdArgs,
2291 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002292 if (UseRelaxAll(C, Args))
2293 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002294
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002295 // When passing -I arguments to the assembler we sometimes need to
2296 // unconditionally take the next argument. For example, when parsing
2297 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2298 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2299 // arg after parsing the '-I' arg.
2300 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002302 // When using an integrated assembler, translate -Wa, and -Xassembler
2303 // options.
2304 bool CompressDebugSections = false;
2305 for (const Arg *A :
2306 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2307 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002308
Renato Golin7c542b42015-07-27 23:44:45 +00002309 for (const StringRef Value : A->getValues()) {
2310 if (TakeNextArg) {
2311 CmdArgs.push_back(Value.data());
2312 TakeNextArg = false;
2313 continue;
2314 }
David Blaikie9260ed62013-07-25 21:19:01 +00002315
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002316 if (Value == "-force_cpusubtype_ALL") {
2317 // Do nothing, this is the default and we don't support anything else.
2318 } else if (Value == "-L") {
2319 CmdArgs.push_back("-msave-temp-labels");
2320 } else if (Value == "--fatal-warnings") {
2321 CmdArgs.push_back("-massembler-fatal-warnings");
2322 } else if (Value == "--noexecstack") {
2323 CmdArgs.push_back("-mnoexecstack");
2324 } else if (Value == "-compress-debug-sections" ||
2325 Value == "--compress-debug-sections") {
2326 CompressDebugSections = true;
2327 } else if (Value == "-nocompress-debug-sections" ||
2328 Value == "--nocompress-debug-sections") {
2329 CompressDebugSections = false;
2330 } else if (Value.startswith("-I")) {
2331 CmdArgs.push_back(Value.data());
2332 // We need to consume the next argument if the current arg is a plain
2333 // -I. The next arg will be the include directory.
2334 if (Value == "-I")
2335 TakeNextArg = true;
2336 } else if (Value.startswith("-gdwarf-")) {
2337 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002338 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2339 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2340 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002341 } else {
2342 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002343 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002344 }
2345 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002346 }
2347 if (CompressDebugSections) {
2348 if (llvm::zlib::isAvailable())
2349 CmdArgs.push_back("-compress-debug-sections");
2350 else
2351 D.Diag(diag::warn_debug_compression_unavailable);
2352 }
David Blaikie9260ed62013-07-25 21:19:01 +00002353}
2354
Renato Goline807c122014-01-31 11:47:28 +00002355// Until ARM libraries are build separately, we have them all in one library
2356static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002357 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002358 TC.getArch() == llvm::Triple::x86)
2359 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002360 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002361 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002362 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002363}
2364
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002365static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2366 // The runtimes are located in the OS-specific resource directory.
2367 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002368 const llvm::Triple &Triple = TC.getTriple();
2369 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002370 StringRef OSLibName =
2371 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002372 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002373 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002374}
2375
Peter Collingbourne581f4382015-07-02 01:48:12 +00002376SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2377 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002378 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2379 ? "-android"
2380 : "";
2381
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002382 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002383 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2384 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002385 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002386 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002387 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002388 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002389
2390 SmallString<128> Path = getCompilerRTLibDir(TC);
2391 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2392 Arch + Env + Suffix);
2393
2394 return Path;
2395}
2396
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002397// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002398// FIXME: Make sure we can also emit shared objects if they're requested
2399// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002400static void addClangRT(const ToolChain &TC, const ArgList &Args,
2401 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002402 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002403}
2404
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002405static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2406 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002407 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2408 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002409 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002410 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002411 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002412 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002413 Args.hasArg(options::OPT_fcreate_profile) ||
2414 Args.hasArg(options::OPT_coverage)))
2415 return;
2416
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002417 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002418}
2419
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002420namespace {
2421enum OpenMPRuntimeKind {
2422 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2423 /// without knowing what runtime to target.
2424 OMPRT_Unknown,
2425
2426 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2427 /// the default for Clang.
2428 OMPRT_OMP,
2429
2430 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2431 /// this runtime but can swallow the pragmas, and find and link against the
2432 /// runtime library itself.
2433 OMPRT_GOMP,
2434
Chandler Carruthc6625c62015-05-28 21:10:31 +00002435 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002436 /// OpenMP runtime. We support this mode for users with existing dependencies
2437 /// on this runtime library name.
2438 OMPRT_IOMP5
2439};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002440}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002441
2442/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002443static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2444 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002445 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2446
2447 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2448 if (A)
2449 RuntimeName = A->getValue();
2450
2451 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002452 .Case("libomp", OMPRT_OMP)
2453 .Case("libgomp", OMPRT_GOMP)
2454 .Case("libiomp5", OMPRT_IOMP5)
2455 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002456
2457 if (RT == OMPRT_Unknown) {
2458 if (A)
2459 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002460 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002461 else
2462 // FIXME: We could use a nicer diagnostic here.
2463 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2464 }
2465
2466 return RT;
2467}
2468
Alexey Samsonov52550342014-09-15 19:58:40 +00002469static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2470 ArgStringList &CmdArgs, StringRef Sanitizer,
2471 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002472 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002473 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002474 if (!IsShared)
2475 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002476 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002477 if (!IsShared)
2478 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002479}
2480
Alexey Samsonov52550342014-09-15 19:58:40 +00002481// Tries to use a file with the list of dynamic symbols that need to be exported
2482// from the runtime library. Returns true if the file was found.
2483static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2484 ArgStringList &CmdArgs,
2485 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002486 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2487 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2488 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002489 return true;
2490 }
2491 return false;
2492}
2493
2494static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2495 ArgStringList &CmdArgs) {
2496 // Force linking against the system libraries sanitizers depends on
2497 // (see PR15823 why this is necessary).
2498 CmdArgs.push_back("--no-as-needed");
2499 CmdArgs.push_back("-lpthread");
2500 CmdArgs.push_back("-lrt");
2501 CmdArgs.push_back("-lm");
2502 // There's no libdl on FreeBSD.
2503 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2504 CmdArgs.push_back("-ldl");
2505}
2506
2507static void
2508collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2509 SmallVectorImpl<StringRef> &SharedRuntimes,
2510 SmallVectorImpl<StringRef> &StaticRuntimes,
2511 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2512 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2513 // Collect shared runtimes.
2514 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2515 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002516 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002517
Alexey Samsonov52550342014-09-15 19:58:40 +00002518 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002519 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002520 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2521 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002522 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002523 }
2524 if (SanArgs.needsAsanRt()) {
2525 if (SanArgs.needsSharedAsanRt()) {
2526 HelperStaticRuntimes.push_back("asan-preinit");
2527 } else {
2528 StaticRuntimes.push_back("asan");
2529 if (SanArgs.linkCXXRuntimes())
2530 StaticRuntimes.push_back("asan_cxx");
2531 }
2532 }
2533 if (SanArgs.needsDfsanRt())
2534 StaticRuntimes.push_back("dfsan");
2535 if (SanArgs.needsLsanRt())
2536 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002537 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002538 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002539 if (SanArgs.linkCXXRuntimes())
2540 StaticRuntimes.push_back("msan_cxx");
2541 }
2542 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002543 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002544 if (SanArgs.linkCXXRuntimes())
2545 StaticRuntimes.push_back("tsan_cxx");
2546 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002547 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002548 StaticRuntimes.push_back("ubsan_standalone");
2549 if (SanArgs.linkCXXRuntimes())
2550 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002551 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002552 if (SanArgs.needsSafeStackRt())
2553 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002554}
2555
Alexey Samsonov52550342014-09-15 19:58:40 +00002556// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2557// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2558static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002559 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002560 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2561 HelperStaticRuntimes;
2562 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2563 HelperStaticRuntimes);
2564 for (auto RT : SharedRuntimes)
2565 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2566 for (auto RT : HelperStaticRuntimes)
2567 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2568 bool AddExportDynamic = false;
2569 for (auto RT : StaticRuntimes) {
2570 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2571 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2572 }
2573 // If there is a static runtime with no dynamic list, force all the symbols
2574 // to be dynamic to be sure we export sanitizer interface functions.
2575 if (AddExportDynamic)
2576 CmdArgs.push_back("-export-dynamic");
2577 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002578}
2579
Reid Kleckner86ea7702015-02-04 23:45:07 +00002580static bool areOptimizationsEnabled(const ArgList &Args) {
2581 // Find the last -O arg and see if it is non-zero.
2582 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2583 return !A->getOption().matches(options::OPT_O0);
2584 // Defaults to -O0.
2585 return false;
2586}
2587
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002588static bool shouldUseFramePointerForTarget(const ArgList &Args,
2589 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002590 // XCore never wants frame pointers, regardless of OS.
2591 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002592 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002593 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002594
2595 if (Triple.isOSLinux()) {
2596 switch (Triple.getArch()) {
2597 // Don't use a frame pointer on linux if optimizing for certain targets.
2598 case llvm::Triple::mips64:
2599 case llvm::Triple::mips64el:
2600 case llvm::Triple::mips:
2601 case llvm::Triple::mipsel:
2602 case llvm::Triple::systemz:
2603 case llvm::Triple::x86:
2604 case llvm::Triple::x86_64:
2605 return !areOptimizationsEnabled(Args);
2606 default:
2607 return true;
2608 }
2609 }
2610
2611 if (Triple.isOSWindows()) {
2612 switch (Triple.getArch()) {
2613 case llvm::Triple::x86:
2614 return !areOptimizationsEnabled(Args);
2615 default:
2616 // All other supported Windows ISAs use xdata unwind information, so frame
2617 // pointers are not generally useful.
2618 return false;
2619 }
2620 }
2621
2622 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002623}
2624
Rafael Espindola224dd632011-12-14 21:02:23 +00002625static bool shouldUseFramePointer(const ArgList &Args,
2626 const llvm::Triple &Triple) {
2627 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2628 options::OPT_fomit_frame_pointer))
2629 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2630
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002631 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002632}
2633
Eric Christopherb7d97e92013-04-03 01:58:53 +00002634static bool shouldUseLeafFramePointer(const ArgList &Args,
2635 const llvm::Triple &Triple) {
2636 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2637 options::OPT_momit_leaf_frame_pointer))
2638 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2639
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002640 if (Triple.isPS4CPU())
2641 return false;
2642
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002643 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002644}
2645
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002646/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002647static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002648 SmallString<128> cwd;
2649 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002650 CmdArgs.push_back("-fdebug-compilation-dir");
2651 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002652 }
2653}
2654
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002655static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002656 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2657 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2658 SmallString<128> T(FinalOutput->getValue());
2659 llvm::sys::path::replace_extension(T, "dwo");
2660 return Args.MakeArgString(T);
2661 } else {
2662 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002663 SmallString<128> T(
2664 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002665 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002666 llvm::sys::path::replace_extension(F, "dwo");
2667 T += F;
2668 return Args.MakeArgString(F);
2669 }
2670}
2671
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002672static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2673 const JobAction &JA, const ArgList &Args,
2674 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002675 ArgStringList ExtractArgs;
2676 ExtractArgs.push_back("--extract-dwo");
2677
2678 ArgStringList StripArgs;
2679 StripArgs.push_back("--strip-dwo");
2680
2681 // Grabbing the output of the earlier compile step.
2682 StripArgs.push_back(Output.getFilename());
2683 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002684 ExtractArgs.push_back(OutFile);
2685
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002686 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002687 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002688
2689 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002690 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002691
2692 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002693 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002694}
2695
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002696/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002697/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2698static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002699 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002700 if (A->getOption().matches(options::OPT_O4) ||
2701 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002702 return true;
2703
2704 if (A->getOption().matches(options::OPT_O0))
2705 return false;
2706
2707 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2708
Rafael Espindola91780de2013-08-26 14:05:41 +00002709 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002710 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002711 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002712 return true;
2713
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002714 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002715 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002716 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002717
2718 unsigned OptLevel = 0;
2719 if (S.getAsInteger(10, OptLevel))
2720 return false;
2721
2722 return OptLevel > 1;
2723 }
2724
2725 return false;
2726}
2727
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002728/// Add -x lang to \p CmdArgs for \p Input.
2729static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2730 ArgStringList &CmdArgs) {
2731 // When using -verify-pch, we don't want to provide the type
2732 // 'precompiled-header' if it was inferred from the file extension
2733 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2734 return;
2735
2736 CmdArgs.push_back("-x");
2737 if (Args.hasArg(options::OPT_rewrite_objc))
2738 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2739 else
2740 CmdArgs.push_back(types::getTypeName(Input.getType()));
2741}
2742
David Majnemerc371ff02015-03-22 08:39:22 +00002743static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002744 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002745 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002746
2747 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002748 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002749
2750 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002751 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002752 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002753 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002754}
2755
Rafael Espindola577637a2015-01-03 00:06:04 +00002756// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002757// options that build systems might add but are unused when assembling or only
2758// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002759static void claimNoWarnArgs(const ArgList &Args) {
2760 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002761 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002762 Args.ClaimAllArgs(options::OPT_flto);
2763 Args.ClaimAllArgs(options::OPT_fno_lto);
2764}
2765
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002766static void appendUserToPath(SmallVectorImpl<char> &Result) {
2767#ifdef LLVM_ON_UNIX
2768 const char *Username = getenv("LOGNAME");
2769#else
2770 const char *Username = getenv("USERNAME");
2771#endif
2772 if (Username) {
2773 // Validate that LoginName can be used in a path, and get its length.
2774 size_t Len = 0;
2775 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002776 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002777 Username = nullptr;
2778 break;
2779 }
2780 }
2781
2782 if (Username && Len > 0) {
2783 Result.append(Username, Username + Len);
2784 return;
2785 }
2786 }
2787
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002788// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002789#ifdef LLVM_ON_UNIX
2790 std::string UID = llvm::utostr(getuid());
2791#else
2792 // FIXME: Windows seems to have an 'SID' that might work.
2793 std::string UID = "9999";
2794#endif
2795 Result.append(UID.begin(), UID.end());
2796}
2797
David Majnemere11d3732015-06-08 00:22:46 +00002798VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2799 const llvm::Triple &Triple,
2800 const llvm::opt::ArgList &Args,
2801 bool IsWindowsMSVC) {
2802 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2803 IsWindowsMSVC) ||
2804 Args.hasArg(options::OPT_fmsc_version) ||
2805 Args.hasArg(options::OPT_fms_compatibility_version)) {
2806 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2807 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002808 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002809
2810 if (MSCVersion && MSCompatibilityVersion) {
2811 if (D)
2812 D->Diag(diag::err_drv_argument_not_allowed_with)
2813 << MSCVersion->getAsString(Args)
2814 << MSCompatibilityVersion->getAsString(Args);
2815 return VersionTuple();
2816 }
2817
2818 if (MSCompatibilityVersion) {
2819 VersionTuple MSVT;
2820 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2821 D->Diag(diag::err_drv_invalid_value)
2822 << MSCompatibilityVersion->getAsString(Args)
2823 << MSCompatibilityVersion->getValue();
2824 return MSVT;
2825 }
2826
2827 if (MSCVersion) {
2828 unsigned Version = 0;
2829 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2830 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2831 << MSCVersion->getValue();
2832 return getMSCompatibilityVersion(Version);
2833 }
2834
2835 unsigned Major, Minor, Micro;
2836 Triple.getEnvironmentVersion(Major, Minor, Micro);
2837 if (Major || Minor || Micro)
2838 return VersionTuple(Major, Minor, Micro);
2839
2840 return VersionTuple(18);
2841 }
2842 return VersionTuple();
2843}
2844
Diego Novilloa0545962015-07-10 18:00:07 +00002845static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2846 const InputInfo &Output, const ArgList &Args,
2847 ArgStringList &CmdArgs) {
2848 auto *ProfileGenerateArg = Args.getLastArg(
2849 options::OPT_fprofile_instr_generate,
2850 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002851 options::OPT_fprofile_generate_EQ,
2852 options::OPT_fno_profile_instr_generate);
2853 if (ProfileGenerateArg &&
2854 ProfileGenerateArg->getOption().matches(
2855 options::OPT_fno_profile_instr_generate))
2856 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002857
2858 auto *ProfileUseArg = Args.getLastArg(
2859 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002860 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2861 options::OPT_fno_profile_instr_use);
2862 if (ProfileUseArg &&
2863 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2864 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002865
2866 if (ProfileGenerateArg && ProfileUseArg)
2867 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002868 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002869
Diego Novillo758f3f52015-08-05 21:49:51 +00002870 if (ProfileGenerateArg) {
2871 if (ProfileGenerateArg->getOption().matches(
2872 options::OPT_fprofile_instr_generate_EQ))
2873 ProfileGenerateArg->render(Args, CmdArgs);
2874 else if (ProfileGenerateArg->getOption().matches(
2875 options::OPT_fprofile_generate_EQ)) {
2876 SmallString<128> Path(ProfileGenerateArg->getValue());
2877 llvm::sys::path::append(Path, "default.profraw");
2878 CmdArgs.push_back(
2879 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2880 } else
2881 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2882 }
Diego Novilloa0545962015-07-10 18:00:07 +00002883
Diego Novillo758f3f52015-08-05 21:49:51 +00002884 if (ProfileUseArg) {
2885 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2886 ProfileUseArg->render(Args, CmdArgs);
2887 else if ((ProfileUseArg->getOption().matches(
2888 options::OPT_fprofile_use_EQ) ||
2889 ProfileUseArg->getOption().matches(
2890 options::OPT_fprofile_instr_use))) {
2891 SmallString<128> Path(
2892 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2893 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2894 llvm::sys::path::append(Path, "default.profdata");
2895 CmdArgs.push_back(
2896 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2897 }
Diego Novilloa0545962015-07-10 18:00:07 +00002898 }
2899
2900 if (Args.hasArg(options::OPT_ftest_coverage) ||
2901 Args.hasArg(options::OPT_coverage))
2902 CmdArgs.push_back("-femit-coverage-notes");
2903 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2904 false) ||
2905 Args.hasArg(options::OPT_coverage))
2906 CmdArgs.push_back("-femit-coverage-data");
2907
Diego Novilloc4b94da2015-08-05 23:27:40 +00002908 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2909 options::OPT_fno_coverage_mapping, false) &&
2910 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002911 D.Diag(diag::err_drv_argument_only_allowed_with)
2912 << "-fcoverage-mapping"
2913 << "-fprofile-instr-generate";
2914
Diego Novilloc4b94da2015-08-05 23:27:40 +00002915 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2916 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002917 CmdArgs.push_back("-fcoverage-mapping");
2918
2919 if (C.getArgs().hasArg(options::OPT_c) ||
2920 C.getArgs().hasArg(options::OPT_S)) {
2921 if (Output.isFilename()) {
2922 CmdArgs.push_back("-coverage-file");
2923 SmallString<128> CoverageFilename;
2924 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2925 CoverageFilename = FinalOutput->getValue();
2926 } else {
2927 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2928 }
2929 if (llvm::sys::path::is_relative(CoverageFilename)) {
2930 SmallString<128> Pwd;
2931 if (!llvm::sys::fs::current_path(Pwd)) {
2932 llvm::sys::path::append(Pwd, CoverageFilename);
2933 CoverageFilename.swap(Pwd);
2934 }
2935 }
2936 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2937 }
2938 }
2939}
2940
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002941void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002942 const InputInfo &Output, const InputInfoList &Inputs,
2943 const ArgList &Args, const char *LinkingOutput) const {
2944 bool KernelOrKext =
2945 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002946 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002947 ArgStringList CmdArgs;
2948
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002949 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002950 bool IsWindowsCygnus =
2951 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002952 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2953
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002954 // Check number of inputs for sanity. We need at least one input.
2955 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00002956 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002957 // CUDA compilation may have multiple inputs (source file + results of
2958 // device-side compilations). All other jobs are expected to have exactly one
2959 // input.
2960 bool IsCuda = types::isCuda(Input.getType());
2961 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00002962
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002963 // Invoke ourselves in -cc1 mode.
2964 //
2965 // FIXME: Implement custom jobs for internal actions.
2966 CmdArgs.push_back("-cc1");
2967
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002968 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002969 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002970 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002971 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002972
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002973 const llvm::Triple TT(TripleStr);
2974 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2975 TT.getArch() == llvm::Triple::thumb)) {
2976 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2977 unsigned Version;
2978 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2979 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002980 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2981 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002982 }
2983
Tim Northover336f1892014-03-29 13:16:12 +00002984 // Push all default warning arguments that are specific to
2985 // the given target. These come before user provided warning options
2986 // are provided.
2987 getToolChain().addClangWarningOptions(CmdArgs);
2988
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002989 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002990 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002991
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002992 if (isa<AnalyzeJobAction>(JA)) {
2993 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2994 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002995 } else if (isa<MigrateJobAction>(JA)) {
2996 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002997 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002998 if (Output.getType() == types::TY_Dependencies)
2999 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003000 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003001 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003002 if (Args.hasArg(options::OPT_rewrite_objc) &&
3003 !Args.hasArg(options::OPT_g_Group))
3004 CmdArgs.push_back("-P");
3005 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003006 } else if (isa<AssembleJobAction>(JA)) {
3007 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003008
David Blaikie9260ed62013-07-25 21:19:01 +00003009 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003010
3011 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003012 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003013 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003014 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003015 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003016
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003017 if (JA.getType() == types::TY_Nothing)
3018 CmdArgs.push_back("-fsyntax-only");
3019 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003020 CmdArgs.push_back("-emit-pch");
3021 else
3022 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003023 } else if (isa<VerifyPCHJobAction>(JA)) {
3024 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003025 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003026 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3027 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003028
Renato Golin7c542b42015-07-27 23:44:45 +00003029 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003030 CmdArgs.push_back("-flto");
3031 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003032 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003033 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003034 } else if (JA.getType() == types::TY_LLVM_IR ||
3035 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003036 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003037 } else if (JA.getType() == types::TY_LLVM_BC ||
3038 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003039 CmdArgs.push_back("-emit-llvm-bc");
3040 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003041 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003042 } else if (JA.getType() == types::TY_AST) {
3043 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003044 } else if (JA.getType() == types::TY_ModuleFile) {
3045 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003046 } else if (JA.getType() == types::TY_RewrittenObjC) {
3047 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003048 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003049 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3050 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003051 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003052 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003053 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003054 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003055
3056 // Preserve use-list order by default when emitting bitcode, so that
3057 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3058 // same result as running passes here. For LTO, we don't need to preserve
3059 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003060 if (JA.getType() == types::TY_LLVM_BC)
3061 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003062 }
3063
Justin Bognera88f0122014-06-20 22:59:50 +00003064 // We normally speed up the clang process a bit by skipping destructors at
3065 // exit, but when we're generating diagnostics we can rely on some of the
3066 // cleanup.
3067 if (!C.isForDiagnostics())
3068 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003070// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003071#ifdef NDEBUG
3072 CmdArgs.push_back("-disable-llvm-verifier");
3073#endif
3074
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003075 // Set the main file name, so that debug info works even with
3076 // -save-temps.
3077 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003078 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003079
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003080 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003081 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003082 if (Args.hasArg(options::OPT_static))
3083 CmdArgs.push_back("-static-define");
3084
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003085 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003086 // Enable region store model by default.
3087 CmdArgs.push_back("-analyzer-store=region");
3088
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003089 // Treat blocks as analysis entry points.
3090 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3091
Ted Kremenek49c79792011-03-24 00:28:47 +00003092 CmdArgs.push_back("-analyzer-eagerly-assume");
3093
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003094 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003095 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003096 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003097
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003098 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003099 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003100
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003101 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003102 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003103
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003104 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003105
Artem Belevichba558952015-05-06 18:20:23 +00003106 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003107 CmdArgs.push_back("-analyzer-checker=cplusplus");
3108
Nico Webere8e53112014-05-11 01:04:02 +00003109 // Enable the following experimental checkers for testing.
3110 CmdArgs.push_back(
3111 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003112 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3113 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003114 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003115 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3116 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003117 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003118
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003119 // Set the output format. The default is plist, for (lame) historical
3120 // reasons.
3121 CmdArgs.push_back("-analyzer-output");
3122 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003123 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003124 else
3125 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003126
Ted Kremenekfe449a22010-03-22 22:32:05 +00003127 // Disable the presentation of standard compiler warnings when
3128 // using --analyze. We only want to show static analyzer diagnostics
3129 // or frontend errors.
3130 CmdArgs.push_back("-w");
3131
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003132 // Add -Xanalyzer arguments when running as analyzer.
3133 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003134 }
3135
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003136 CheckCodeGenerationOptions(D, Args);
3137
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003138 bool PIE = getToolChain().isPIEDefault();
3139 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003140 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003141
Alexey Bataev40e75222014-01-28 06:30:35 +00003142 // Android-specific defaults for PIC/PIE
3143 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003144 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00003145 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003146 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00003147 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003148 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00003149 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00003150 case llvm::Triple::mips:
3151 case llvm::Triple::mipsel:
3152 case llvm::Triple::mips64:
3153 case llvm::Triple::mips64el:
3154 PIC = true; // "-fpic"
3155 break;
3156
3157 case llvm::Triple::x86:
3158 case llvm::Triple::x86_64:
3159 PIC = true; // "-fPIC"
3160 IsPICLevelTwo = true;
3161 break;
3162
3163 default:
3164 break;
3165 }
3166 }
3167
Brad Smith5b05db82014-06-24 19:51:29 +00003168 // OpenBSD-specific defaults for PIE
3169 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003170 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00003171 case llvm::Triple::mips64:
3172 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003173 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00003174 case llvm::Triple::x86:
3175 case llvm::Triple::x86_64:
3176 IsPICLevelTwo = false; // "-fpie"
3177 break;
3178
3179 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00003180 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00003181 case llvm::Triple::sparcv9:
3182 IsPICLevelTwo = true; // "-fPIE"
3183 break;
3184
3185 default:
3186 break;
3187 }
3188 }
3189
Alexey Samsonov090301e2013-04-09 12:28:19 +00003190 // For the PIC and PIE flag options, this logic is different from the
3191 // legacy logic in very old versions of GCC, as that logic was just
3192 // a bug no one had ever fixed. This logic is both more rational and
3193 // consistent with GCC's new logic now that the bugs are fixed. The last
3194 // argument relating to either PIC or PIE wins, and no other argument is
3195 // used. If the last argument is any flavor of the '-fno-...' arguments,
3196 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
3197 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003198 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3199 options::OPT_fpic, options::OPT_fno_pic,
3200 options::OPT_fPIE, options::OPT_fno_PIE,
3201 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00003202 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3203 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003204 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00003205 if (LastPICArg) {
3206 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003207 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3208 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3209 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003210 PIC =
3211 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3212 IsPICLevelTwo =
3213 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003214 } else {
3215 PIE = PIC = false;
3216 }
3217 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003218 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00003219
Nick Lewycky609dd662013-10-11 03:33:53 +00003220 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00003221 // specified while enabling PIC enabled level 1 PIC, just force it back to
3222 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
3223 // informal testing).
3224 if (PIC && getToolChain().getTriple().isOSDarwin())
3225 IsPICLevelTwo |= getToolChain().isPICDefault();
3226
Chandler Carruthc0c04552012-04-08 16:40:35 +00003227 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3228 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003229 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00003230 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003231 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003232 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003233 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003234
Chandler Carruth76a943b2012-11-19 03:52:03 +00003235 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3236 // This is a very special mode. It trumps the other modes, almost no one
3237 // uses it, and it isn't even valid on any OS but Darwin.
3238 if (!getToolChain().getTriple().isOSDarwin())
3239 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003240 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003241
3242 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3243
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003244 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003245 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003246
Chandler Carruth76a943b2012-11-19 03:52:03 +00003247 // Only a forced PIC mode can cause the actual compile to have PIC defines
3248 // etc., no flags are sufficient. This behavior was selected to closely
3249 // match that of llvm-gcc and Apple GCC before that.
3250 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3251 CmdArgs.push_back("-pic-level");
3252 CmdArgs.push_back("2");
3253 }
3254 } else {
3255 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3256 // handled in Clang's IRGen by the -pie-level flag.
3257 CmdArgs.push_back("-mrelocation-model");
3258 CmdArgs.push_back(PIC ? "pic" : "static");
3259
3260 if (PIC) {
3261 CmdArgs.push_back("-pic-level");
3262 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3263 if (PIE) {
3264 CmdArgs.push_back("-pie-level");
3265 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3266 }
3267 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003268 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003269
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003270 CmdArgs.push_back("-mthread-model");
3271 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3272 CmdArgs.push_back(A->getValue());
3273 else
3274 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3275
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003276 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3277
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003278 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3279 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003280 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003281
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003282 // LLVM Code Generator Options.
3283
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003284 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3285 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003286 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3287 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003288 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003289 CmdArgs.push_back(A->getValue());
3290 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003291 }
3292 }
3293
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003294 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3295 StringRef v = A->getValue();
3296 CmdArgs.push_back("-mllvm");
3297 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3298 A->claim();
3299 }
3300
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003301 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3302 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003303 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003304 }
3305
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003306 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3307 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003308 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003309 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003310 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003311 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3312 CmdArgs.push_back("-fpcc-struct-return");
3313 } else {
3314 assert(A->getOption().matches(options::OPT_freg_struct_return));
3315 CmdArgs.push_back("-freg-struct-return");
3316 }
3317 }
3318
Roman Divacky65b88cd2011-03-01 17:40:53 +00003319 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3320 CmdArgs.push_back("-mrtd");
3321
Rafael Espindola224dd632011-12-14 21:02:23 +00003322 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003323 CmdArgs.push_back("-mdisable-fp-elim");
3324 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3325 options::OPT_fno_zero_initialized_in_bss))
3326 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003327
3328 bool OFastEnabled = isOptimizationLevelFast(Args);
3329 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3330 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003331 OptSpecifier StrictAliasingAliasOption =
3332 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003333 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3334 // doesn't do any TBAA.
3335 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003336 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003337 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003338 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003339 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3340 options::OPT_fno_struct_path_tbaa))
3341 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003342 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3343 false))
3344 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003345 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3346 options::OPT_fno_optimize_sibling_calls))
3347 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003348
Eric Christopher006208c2013-04-04 06:29:47 +00003349 // Handle segmented stacks.
3350 if (Args.hasArg(options::OPT_fsplit_stack))
3351 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003352
3353 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3354 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003355 OptSpecifier FastMathAliasOption =
3356 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3357
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003358 // Handle various floating point optimization flags, mapping them to the
3359 // appropriate LLVM code generation flags. The pattern for all of these is to
3360 // default off the codegen optimizations, and if any flag enables them and no
3361 // flag disables them after the flag enabling them, enable the codegen
3362 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003363 if (Arg *A = Args.getLastArg(
3364 options::OPT_ffast_math, FastMathAliasOption,
3365 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3366 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3367 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003368 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3369 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003370 A->getOption().getID() != options::OPT_fhonor_infinities)
3371 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003372 if (Arg *A = Args.getLastArg(
3373 options::OPT_ffast_math, FastMathAliasOption,
3374 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3375 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3376 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003377 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3378 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003379 A->getOption().getID() != options::OPT_fhonor_nans)
3380 CmdArgs.push_back("-menable-no-nans");
3381
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003382 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3383 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003384 if (Arg *A =
3385 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3386 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3387 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003388 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3389 // However, turning *off* -ffast_math merely restores the toolchain default
3390 // (which may be false).
3391 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3392 A->getOption().getID() == options::OPT_ffast_math ||
3393 A->getOption().getID() == options::OPT_Ofast)
3394 MathErrno = false;
3395 else if (A->getOption().getID() == options::OPT_fmath_errno)
3396 MathErrno = true;
3397 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003398 if (MathErrno)
3399 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003400
3401 // There are several flags which require disabling very specific
3402 // optimizations. Any of these being disabled forces us to turn off the
3403 // entire set of LLVM optimizations, so collect them through all the flag
3404 // madness.
3405 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003406 if (Arg *A = Args.getLastArg(
3407 options::OPT_ffast_math, FastMathAliasOption,
3408 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3409 options::OPT_fno_unsafe_math_optimizations,
3410 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003411 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3412 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003413 A->getOption().getID() != options::OPT_fno_associative_math)
3414 AssociativeMath = true;
3415 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003416 if (Arg *A = Args.getLastArg(
3417 options::OPT_ffast_math, FastMathAliasOption,
3418 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3419 options::OPT_fno_unsafe_math_optimizations,
3420 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003421 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3422 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003423 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3424 ReciprocalMath = true;
3425 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003426 if (Arg *A = Args.getLastArg(
3427 options::OPT_ffast_math, FastMathAliasOption,
3428 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3429 options::OPT_fno_unsafe_math_optimizations,
3430 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003431 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3432 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003433 A->getOption().getID() != options::OPT_fsigned_zeros)
3434 SignedZeros = false;
3435 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003436 if (Arg *A = Args.getLastArg(
3437 options::OPT_ffast_math, FastMathAliasOption,
3438 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3439 options::OPT_fno_unsafe_math_optimizations,
3440 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003441 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3442 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003443 A->getOption().getID() != options::OPT_ftrapping_math)
3444 TrappingMath = false;
3445 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3446 !TrappingMath)
3447 CmdArgs.push_back("-menable-unsafe-fp-math");
3448
Sanjay Patel76c9e092015-01-23 16:40:50 +00003449 if (!SignedZeros)
3450 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003451
Sanjay Patel359b1052015-04-09 15:03:23 +00003452 if (ReciprocalMath)
3453 CmdArgs.push_back("-freciprocal-math");
3454
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003455 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003456 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003457 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003458 options::OPT_ffp_contract)) {
3459 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003460 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003461 if (Val == "fast" || Val == "on" || Val == "off") {
3462 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3463 } else {
3464 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003465 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003466 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003467 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3468 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003469 // If fast-math is set then set the fp-contract mode to fast.
3470 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3471 }
3472 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003473
Sanjay Patel2987c292015-06-11 14:53:41 +00003474 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003475
Bob Wilson6a039162012-07-19 03:52:53 +00003476 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3477 // and if we find them, tell the frontend to provide the appropriate
3478 // preprocessor macros. This is distinct from enabling any optimizations as
3479 // these options induce language changes which must survive serialization
3480 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003481 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3482 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003483 if (!A->getOption().matches(options::OPT_fno_fast_math))
3484 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003485 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3486 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003487 if (A->getOption().matches(options::OPT_ffinite_math_only))
3488 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003489
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003490 // Decide whether to use verbose asm. Verbose assembly is the default on
3491 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003492 bool IsIntegratedAssemblerDefault =
3493 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003494 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003495 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003496 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003497 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003498
Rafael Espindolab8a12932015-05-22 20:44:03 +00003499 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3500 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003501 CmdArgs.push_back("-no-integrated-as");
3502
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003503 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3504 CmdArgs.push_back("-mdebug-pass");
3505 CmdArgs.push_back("Structure");
3506 }
3507 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3508 CmdArgs.push_back("-mdebug-pass");
3509 CmdArgs.push_back("Arguments");
3510 }
3511
John McCall8517abc2010-02-19 02:45:38 +00003512 // Enable -mconstructor-aliases except on darwin, where we have to
3513 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003514 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003515 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003516
John McCall7ef5cb32011-03-18 02:56:14 +00003517 // Darwin's kernel doesn't support guard variables; just die if we
3518 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003519 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003520 CmdArgs.push_back("-fforbid-guard-variables");
3521
Douglas Gregordbe39272011-02-01 15:15:22 +00003522 if (Args.hasArg(options::OPT_mms_bitfields)) {
3523 CmdArgs.push_back("-mms-bitfields");
3524 }
John McCall8517abc2010-02-19 02:45:38 +00003525
Daniel Dunbar306945d2009-09-16 06:17:29 +00003526 // This is a coarse approximation of what llvm-gcc actually does, both
3527 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3528 // complicated ways.
3529 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003530 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3531 options::OPT_fno_asynchronous_unwind_tables,
3532 (getToolChain().IsUnwindTablesDefault() ||
3533 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3534 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003535 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3536 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003537 CmdArgs.push_back("-munwind-tables");
3538
Chandler Carruth05fb5852012-11-21 23:40:23 +00003539 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003540
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003541 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3542 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003543 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003544 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003545
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003546 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003548
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003549 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003550 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003551 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003552 }
3553
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003554 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003555 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003556 if (!CPU.empty()) {
3557 CmdArgs.push_back("-target-cpu");
3558 CmdArgs.push_back(Args.MakeArgString(CPU));
3559 }
3560
Rafael Espindolaeb265472013-08-21 21:59:03 +00003561 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3562 CmdArgs.push_back("-mfpmath");
3563 CmdArgs.push_back(A->getValue());
3564 }
3565
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003566 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003567 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003568
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003569 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003570 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003571 default:
3572 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003573
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003574 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003575 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003576 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003577 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003578 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003579 break;
3580
Tim Northover573cbee2014-05-24 12:52:07 +00003581 case llvm::Triple::aarch64:
3582 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003583 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003584 break;
3585
Eric Christopher0b26a612010-03-02 02:41:08 +00003586 case llvm::Triple::mips:
3587 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003588 case llvm::Triple::mips64:
3589 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003590 AddMIPSTargetArgs(Args, CmdArgs);
3591 break;
3592
Ulrich Weigand8afad612014-07-28 13:17:52 +00003593 case llvm::Triple::ppc:
3594 case llvm::Triple::ppc64:
3595 case llvm::Triple::ppc64le:
3596 AddPPCTargetArgs(Args, CmdArgs);
3597 break;
3598
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003599 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003600 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003601 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003602 AddSparcTargetArgs(Args, CmdArgs);
3603 break;
3604
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003605 case llvm::Triple::x86:
3606 case llvm::Triple::x86_64:
3607 AddX86TargetArgs(Args, CmdArgs);
3608 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003609
3610 case llvm::Triple::hexagon:
3611 AddHexagonTargetArgs(Args, CmdArgs);
3612 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003613 }
3614
Hans Wennborg75958c42013-08-08 00:17:41 +00003615 // Add clang-cl arguments.
3616 if (getToolChain().getDriver().IsCLMode())
3617 AddClangCLArgs(Args, CmdArgs);
3618
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003619 // Pass the linker version in use.
3620 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3621 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003622 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003623 }
3624
Eric Christopherb7d97e92013-04-03 01:58:53 +00003625 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003626 CmdArgs.push_back("-momit-leaf-frame-pointer");
3627
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003628 // Explicitly error on some things we know we don't support and can't just
3629 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003630 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003631 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3632 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003633 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003634 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003635 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3636 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003637 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003638 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003639 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003640 }
3641
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003642 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003643 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003644 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003645 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003646 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3647 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003648 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003649 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003650 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003651
Chad Rosierbe10f982011-08-02 17:58:04 +00003652 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003653 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003654 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3655 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003656 }
3657
Manman Ren17bdb0f2013-11-20 20:22:14 +00003658 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3659 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003660 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003661 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003662 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003663 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3664 A->getOption().matches(options::OPT_g1)) &&
3665 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003666 // FIXME: we should support specifying dwarf version with
3667 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003668 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003669 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003670 const llvm::Triple &Triple = getToolChain().getTriple();
3671 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003672 Triple.getOS() == llvm::Triple::FreeBSD ||
3673 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003674 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003675 SplitDwarfArg = nullptr;
Manman Ren17bdb0f2013-11-20 20:22:14 +00003676 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003677 CmdArgs.push_back("-gdwarf-2");
3678 else if (A->getOption().matches(options::OPT_gdwarf_3))
3679 CmdArgs.push_back("-gdwarf-3");
3680 else if (A->getOption().matches(options::OPT_gdwarf_4))
3681 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003682 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003683 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003684 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003685 const llvm::Triple &Triple = getToolChain().getTriple();
3686 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003687 Triple.getOS() == llvm::Triple::FreeBSD ||
3688 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003689 CmdArgs.push_back("-gdwarf-2");
3690 else
3691 CmdArgs.push_back("-g");
3692 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003693 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003694
Reid Kleckner124955a2015-08-05 18:51:13 +00003695 // Forward -gcodeview.
3696 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3697
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003698 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3699 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003700 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3701 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003702 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003703
Eric Christopher138c32b2013-09-13 22:37:55 +00003704 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003705 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3706 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003707 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003708 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003709 CmdArgs.push_back("-g");
3710 CmdArgs.push_back("-backend-option");
3711 CmdArgs.push_back("-split-dwarf=Enable");
3712 }
3713
Eric Christopher138c32b2013-09-13 22:37:55 +00003714 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3715 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3716 CmdArgs.push_back("-backend-option");
3717 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3718 }
Eric Christophereec89c22013-06-18 00:03:50 +00003719
Eric Christopher0d403d22014-02-14 01:27:03 +00003720 // -gdwarf-aranges turns on the emission of the aranges section in the
3721 // backend.
3722 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3723 CmdArgs.push_back("-backend-option");
3724 CmdArgs.push_back("-generate-arange-section");
3725 }
3726
David Blaikief36d9ba2014-01-27 18:52:43 +00003727 if (Args.hasFlag(options::OPT_fdebug_types_section,
3728 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003729 CmdArgs.push_back("-backend-option");
3730 CmdArgs.push_back("-generate-type-units");
3731 }
Eric Christophereec89c22013-06-18 00:03:50 +00003732
Ed Schouten6e576152015-03-26 17:50:28 +00003733 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3734 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3735
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003736 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003737 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003738 CmdArgs.push_back("-ffunction-sections");
3739 }
3740
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003741 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3742 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003743 CmdArgs.push_back("-fdata-sections");
3744 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003745
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003746 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003747 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003748 CmdArgs.push_back("-fno-unique-section-names");
3749
Chris Lattner3c77a352010-06-22 00:03:40 +00003750 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3751
Diego Novilloa0545962015-07-10 18:00:07 +00003752 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003753
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003754 // Pass options for controlling the default header search paths.
3755 if (Args.hasArg(options::OPT_nostdinc)) {
3756 CmdArgs.push_back("-nostdsysteminc");
3757 CmdArgs.push_back("-nobuiltininc");
3758 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003759 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003760 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003761 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3762 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3763 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003764
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003765 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003766 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003767 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003768
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003769 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3770
Ted Kremenekf7639e12012-03-06 20:06:33 +00003771 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003772 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003773 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003774 options::OPT_ccc_arcmt_modify,
3775 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003776 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003777 switch (A->getOption().getID()) {
3778 default:
3779 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003780 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003781 CmdArgs.push_back("-arcmt-check");
3782 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003783 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003784 CmdArgs.push_back("-arcmt-modify");
3785 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003786 case options::OPT_ccc_arcmt_migrate:
3787 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003788 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003789 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003790
3791 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3792 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003793 break;
John McCalld70fb982011-06-15 23:25:17 +00003794 }
3795 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003796 } else {
3797 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3798 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3799 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003800 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003801
Ted Kremenekf7639e12012-03-06 20:06:33 +00003802 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3803 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003804 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3805 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003806 }
3807 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003808 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003809
3810 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003811 options::OPT_objcmt_migrate_subscripting,
3812 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003813 // None specified, means enable them all.
3814 CmdArgs.push_back("-objcmt-migrate-literals");
3815 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003816 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003817 } else {
3818 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3819 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003820 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003821 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003822 } else {
3823 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3824 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3825 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3826 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3827 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3828 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003829 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003830 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3831 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3832 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3833 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3834 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3835 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3836 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003837 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003838 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003839 }
3840
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003841 // Add preprocessing options like -I, -D, etc. if we are using the
3842 // preprocessor.
3843 //
3844 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003845 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003846 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003847
Rafael Espindolaa7431922011-07-21 23:40:37 +00003848 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3849 // that "The compiler can only warn and ignore the option if not recognized".
3850 // When building with ccache, it will pass -D options to clang even on
3851 // preprocessed inputs and configure concludes that -fPIC is not supported.
3852 Args.ClaimAllArgs(options::OPT_D);
3853
Alp Toker7874bdc2013-11-15 20:40:58 +00003854 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003855 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3856 if (A->getOption().matches(options::OPT_O4)) {
3857 CmdArgs.push_back("-O3");
3858 D.Diag(diag::warn_O4_is_O3);
3859 } else {
3860 A->render(Args, CmdArgs);
3861 }
3862 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003863
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003864 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003865 for (const Arg *A :
3866 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3867 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003868 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003869 }
3870
Rafael Espindola577637a2015-01-03 00:06:04 +00003871 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003872
Richard Smith3be1cb22014-08-07 00:24:21 +00003873 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003874 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003875 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3876 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003877 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003878 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003879
3880 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003881 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003882 //
3883 // If a std is supplied, only add -trigraphs if it follows the
3884 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003885 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003886 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3887 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003888 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003889 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003890 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003891 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003892 else
3893 Std->render(Args, CmdArgs);
3894
Nico Weber00721502014-12-23 22:32:37 +00003895 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003896 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003897 options::OPT_ftrigraphs,
3898 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003899 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003900 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003901 } else {
3902 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003903 //
3904 // FIXME: Clang doesn't correctly handle -std= when the input language
3905 // doesn't match. For the time being just ignore this for C++ inputs;
3906 // eventually we want to do all the standard defaulting here instead of
3907 // splitting it between the driver and clang -cc1.
3908 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003909 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3910 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003911 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003912 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003913
Nico Weber00721502014-12-23 22:32:37 +00003914 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3915 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003916 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003917
Richard Smith282b4492013-09-04 22:50:31 +00003918 // GCC's behavior for -Wwrite-strings is a bit strange:
3919 // * In C, this "warning flag" changes the types of string literals from
3920 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3921 // for the discarded qualifier.
3922 // * In C++, this is just a normal warning flag.
3923 //
3924 // Implementing this warning correctly in C is hard, so we follow GCC's
3925 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3926 // a non-const char* in C, rather than using this crude hack.
3927 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003928 // FIXME: This should behave just like a warning flag, and thus should also
3929 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3930 Arg *WriteStrings =
3931 Args.getLastArg(options::OPT_Wwrite_strings,
3932 options::OPT_Wno_write_strings, options::OPT_w);
3933 if (WriteStrings &&
3934 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003935 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003936 }
3937
Chandler Carruth61fbf622011-04-23 09:27:53 +00003938 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003939 // during C++ compilation, which it is by default. GCC keeps this define even
3940 // in the presence of '-w', match this behavior bug-for-bug.
3941 if (types::isCXX(InputType) &&
3942 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3943 true)) {
3944 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003945 }
3946
Chandler Carruthe0391482010-05-22 02:21:53 +00003947 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3948 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3949 if (Asm->getOption().matches(options::OPT_fasm))
3950 CmdArgs.push_back("-fgnu-keywords");
3951 else
3952 CmdArgs.push_back("-fno-gnu-keywords");
3953 }
3954
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003955 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3956 CmdArgs.push_back("-fno-dwarf-directory-asm");
3957
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003958 if (ShouldDisableAutolink(Args, getToolChain()))
3959 CmdArgs.push_back("-fno-autolink");
3960
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003961 // Add in -fdebug-compilation-dir if necessary.
3962 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003963
Richard Smith9a568822011-11-21 19:36:32 +00003964 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3965 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003966 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003967 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003968 }
3969
Richard Smith79c927b2013-11-06 19:31:51 +00003970 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3971 CmdArgs.push_back("-foperator-arrow-depth");
3972 CmdArgs.push_back(A->getValue());
3973 }
3974
Richard Smith9a568822011-11-21 19:36:32 +00003975 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3976 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003977 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003978 }
3979
Richard Smitha3d3bd22013-05-08 02:12:03 +00003980 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3981 CmdArgs.push_back("-fconstexpr-steps");
3982 CmdArgs.push_back(A->getValue());
3983 }
3984
Richard Smithb3a14522013-02-22 01:59:51 +00003985 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3986 CmdArgs.push_back("-fbracket-depth");
3987 CmdArgs.push_back(A->getValue());
3988 }
3989
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003990 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3991 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003992 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003993 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003994 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3995 } else
3996 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003997 }
3998
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003999 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004000 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004001
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004002 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4003 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004004 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004005 }
David Chisnall5778fce2009-08-31 16:41:57 +00004006
Chris Lattnere23003d2010-01-09 21:54:33 +00004007 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4008 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004009 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004010 }
4011
Chris Lattnerb35583d2010-04-07 20:49:23 +00004012 CmdArgs.push_back("-ferror-limit");
4013 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004014 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004015 else
4016 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004017
Chandler Carrutha77a7272010-05-06 04:55:18 +00004018 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4019 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004020 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004021 }
4022
4023 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4024 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004025 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004026 }
4027
Richard Smithf6f003a2011-12-16 19:06:07 +00004028 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4029 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004030 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004031 }
4032
Nick Lewycky24653262014-12-16 21:39:02 +00004033 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4034 CmdArgs.push_back("-fspell-checking-limit");
4035 CmdArgs.push_back(A->getValue());
4036 }
4037
Daniel Dunbar2c978472009-11-04 06:24:47 +00004038 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004039 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004040 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004041 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004042 } else {
4043 // If -fmessage-length=N was not specified, determine whether this is a
4044 // terminal and, if so, implicitly define -fmessage-length appropriately.
4045 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004046 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004047 }
4048
John McCallb4a99d32013-02-19 01:57:35 +00004049 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4050 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4051 options::OPT_fvisibility_ms_compat)) {
4052 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4053 CmdArgs.push_back("-fvisibility");
4054 CmdArgs.push_back(A->getValue());
4055 } else {
4056 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4057 CmdArgs.push_back("-fvisibility");
4058 CmdArgs.push_back("hidden");
4059 CmdArgs.push_back("-ftype-visibility");
4060 CmdArgs.push_back("default");
4061 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004062 }
4063
Douglas Gregor08329632010-06-15 17:05:35 +00004064 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004065
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004066 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4067
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004068 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004069 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4070 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004071 CmdArgs.push_back("-ffreestanding");
4072
Daniel Dunbare357d562009-12-03 18:42:11 +00004073 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004074 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004075 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004076 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4077 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004078 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004079 // Emulated TLS is enabled by default on Android, and can be enabled manually
4080 // with -femulated-tls.
4081 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4082 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4083 EmulatedTLSDefault))
4084 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004085 // AltiVec-like language extensions aren't relevant for assembling.
4086 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004087 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004088 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4089 }
Richard Trieu91844232012-06-26 18:18:47 +00004090 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4091 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004092
Alexey Bataevdb390212015-05-20 04:24:19 +00004093 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004094 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4095 options::OPT_fno_openmp, false))
4096 switch (getOpenMPRuntime(getToolChain(), Args)) {
4097 case OMPRT_OMP:
4098 case OMPRT_IOMP5:
4099 // Clang can generate useful OpenMP code for these two runtime libraries.
4100 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004101
4102 // If no option regarding the use of TLS in OpenMP codegeneration is
4103 // given, decide a default based on the target. Otherwise rely on the
4104 // options and pass the right information to the frontend.
4105 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4106 options::OPT_fnoopenmp_use_tls,
4107 getToolChain().getArch() == llvm::Triple::ppc ||
4108 getToolChain().getArch() == llvm::Triple::ppc64 ||
4109 getToolChain().getArch() == llvm::Triple::ppc64le))
4110 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004111 break;
4112 default:
4113 // By default, if Clang doesn't know how to generate useful OpenMP code
4114 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4115 // down to the actual compilation.
4116 // FIXME: It would be better to have a mode which *only* omits IR
4117 // generation based on the OpenMP support so that we get consistent
4118 // semantic analysis, etc.
4119 break;
4120 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004121
Peter Collingbourne32701642013-11-01 18:16:25 +00004122 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004123 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004124
Eric Christopher459d2712013-02-19 06:16:53 +00004125 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004126 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4127 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4128 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4129 Arch == llvm::Triple::ppc64le))
4130 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4131 << "ppc/ppc64/ppc64le";
4132 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004133
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004134 // -fzvector is incompatible with -faltivec.
4135 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4136 if (Args.hasArg(options::OPT_faltivec))
4137 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4138 << "-faltivec";
4139
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004140 if (getToolChain().SupportsProfiling())
4141 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004142
4143 // -flax-vector-conversions is default.
4144 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4145 options::OPT_fno_lax_vector_conversions))
4146 CmdArgs.push_back("-fno-lax-vector-conversions");
4147
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004148 if (Args.getLastArg(options::OPT_fapple_kext))
4149 CmdArgs.push_back("-fapple-kext");
4150
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004151 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004152 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004153 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004154 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4155 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004156
4157 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4158 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004159 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004160 }
4161
Bob Wilson14adb362012-02-03 06:27:22 +00004162 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004163
Chandler Carruth6e501032011-03-27 00:04:55 +00004164 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4165 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004166 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004167 if (A->getOption().matches(options::OPT_fwrapv))
4168 CmdArgs.push_back("-fwrapv");
4169 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4170 options::OPT_fno_strict_overflow)) {
4171 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4172 CmdArgs.push_back("-fwrapv");
4173 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004174
4175 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4176 options::OPT_fno_reroll_loops))
4177 if (A->getOption().matches(options::OPT_freroll_loops))
4178 CmdArgs.push_back("-freroll-loops");
4179
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004180 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004181 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4182 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004183
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004184 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4185
Daniel Dunbar4930e332009-11-17 08:07:36 +00004186 // -stack-protector=0 is default.
4187 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004188 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4189 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4190 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4191 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4192 Args.ClaimAllArgs(options::OPT_fstack_protector);
4193 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004194 options::OPT_fstack_protector_all,
4195 options::OPT_fstack_protector_strong,
4196 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004197 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004198 StackProtectorLevel = std::max<unsigned>(
4199 LangOptions::SSPOn,
4200 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004201 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004202 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004203 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004204 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004205 } else {
4206 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004207 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004208 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004209 if (StackProtectorLevel) {
4210 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004211 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004212 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004213
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004214 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004215 for (const Arg *A : Args.filtered(options::OPT__param)) {
4216 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004217 if (Str.startswith("ssp-buffer-size=")) {
4218 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004219 CmdArgs.push_back("-stack-protector-buffer-size");
4220 // FIXME: Verify the argument is a valid integer.
4221 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004222 }
Sean Silva14facf32015-06-09 01:57:17 +00004223 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004224 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004225 }
4226
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004227 // Translate -mstackrealign
4228 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4229 false)) {
4230 CmdArgs.push_back("-backend-option");
4231 CmdArgs.push_back("-force-align-stack");
4232 }
4233 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004234 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004235 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4236 }
4237
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004238 if (Args.hasArg(options::OPT_mstack_alignment)) {
4239 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4240 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004241 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004242
Hans Wennborg77dc2362015-01-20 19:45:50 +00004243 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4244 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4245
4246 if (!Size.empty())
4247 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4248 else
4249 CmdArgs.push_back("-mstack-probe-size=0");
4250 }
4251
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004252 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4253 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004254 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4255
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004256 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4257 options::OPT_mno_restrict_it)) {
4258 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4259 CmdArgs.push_back("-backend-option");
4260 CmdArgs.push_back("-arm-restrict-it");
4261 } else {
4262 CmdArgs.push_back("-backend-option");
4263 CmdArgs.push_back("-arm-no-restrict-it");
4264 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004265 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4266 TT.getArch() == llvm::Triple::thumb)) {
4267 // Windows on ARM expects restricted IT blocks
4268 CmdArgs.push_back("-backend-option");
4269 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004270 }
4271
Daniel Dunbard18049a2009-04-07 21:16:11 +00004272 // Forward -f options with positive and negative forms; we translate
4273 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004274 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4275 StringRef fname = A->getValue();
4276 if (!llvm::sys::fs::exists(fname))
4277 D.Diag(diag::err_drv_no_such_file) << fname;
4278 else
4279 A->render(Args, CmdArgs);
4280 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004281
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004282 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004283 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004284 CmdArgs.push_back("-fapple-kext");
4285 if (!Args.hasArg(options::OPT_fbuiltin))
4286 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004287 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004288 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004289 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004290 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004291 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004292
Nuno Lopes13c88c72009-12-16 16:59:22 +00004293 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4294 options::OPT_fno_assume_sane_operator_new))
4295 CmdArgs.push_back("-fno-assume-sane-operator-new");
4296
Daniel Dunbar4930e332009-11-17 08:07:36 +00004297 // -fblocks=0 is default.
4298 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004299 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004300 (Args.hasArg(options::OPT_fgnu_runtime) &&
4301 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4302 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004303 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004304
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004305 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004306 !getToolChain().hasBlocksRuntime())
4307 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004308 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004309
Richard Smith47972af2015-06-16 00:08:24 +00004310 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004311 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004312 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004313 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004314 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004315 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4316 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004317 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004318 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004319 HaveModules = true;
4320 }
4321 }
4322
Richard Smith47972af2015-06-16 00:08:24 +00004323 // -fmodule-maps enables implicit reading of module map files. By default,
4324 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004325 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4326 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004327 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004328 }
4329
Daniel Jasperac42b752013-10-21 06:34:34 +00004330 // -fmodules-decluse checks that modules used are declared so (off by
4331 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004332 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004333 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004334 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004335 }
4336
Daniel Jasper962b38e2014-04-11 11:47:45 +00004337 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4338 // all #included headers are part of modules.
4339 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004340 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004341 CmdArgs.push_back("-fmodules-strict-decluse");
4342 }
4343
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004344 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4345 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4346 options::OPT_fno_implicit_modules)) {
4347 CmdArgs.push_back("-fno-implicit-modules");
4348 }
4349
Daniel Jasperac42b752013-10-21 06:34:34 +00004350 // -fmodule-name specifies the module that is currently being built (or
4351 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004352 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004353
Richard Smith9887d792014-10-17 01:42:53 +00004354 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004355 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004356 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004357
Richard Smithe842a472014-10-22 02:05:46 +00004358 // -fmodule-file can be used to specify files containing precompiled modules.
4359 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4360
4361 // -fmodule-cache-path specifies where our implicitly-built module files
4362 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004363 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004364 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004365 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004366 if (HaveModules) {
4367 if (C.isForDiagnostics()) {
4368 // When generating crash reports, we want to emit the modules along with
4369 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004370 Path = Output.getFilename();
4371 llvm::sys::path::replace_extension(Path, ".cache");
4372 llvm::sys::path::append(Path, "modules");
4373 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004374 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004375 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004376 llvm::sys::path::append(Path, "org.llvm.clang.");
4377 appendUserToPath(Path);
4378 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004379 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004380 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004381 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4382 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004383 }
4384
4385 // When building modules and generating crashdumps, we need to dump a module
4386 // dependency VFS alongside the output.
4387 if (HaveModules && C.isForDiagnostics()) {
4388 SmallString<128> VFSDir(Output.getFilename());
4389 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004390 // Add the cache directory as a temp so the crash diagnostics pick it up.
4391 C.addTempFile(Args.MakeArgString(VFSDir));
4392
Justin Bognera88f0122014-06-20 22:59:50 +00004393 llvm::sys::path::append(VFSDir, "vfs");
4394 CmdArgs.push_back("-module-dependency-dir");
4395 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004396 }
4397
Richard Smith9887d792014-10-17 01:42:53 +00004398 if (HaveModules)
4399 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004400
Douglas Gregor35b04d62013-02-07 19:01:24 +00004401 // Pass through all -fmodules-ignore-macro arguments.
4402 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004403 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4404 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004405
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004406 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4407
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004408 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4409 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4410 D.Diag(diag::err_drv_argument_not_allowed_with)
4411 << A->getAsString(Args) << "-fbuild-session-timestamp";
4412
4413 llvm::sys::fs::file_status Status;
4414 if (llvm::sys::fs::status(A->getValue(), Status))
4415 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004416 CmdArgs.push_back(Args.MakeArgString(
4417 "-fbuild-session-timestamp=" +
4418 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004419 }
4420
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004421 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004422 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4423 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004424 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4425
4426 Args.AddLastArg(CmdArgs,
4427 options::OPT_fmodules_validate_once_per_build_session);
4428 }
4429
Ben Langmuirdcf73862014-03-12 00:06:17 +00004430 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4431
John McCalldfea9982010-04-09 19:12:06 +00004432 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004433 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004434 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004435 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004436
Anders Carlssond470fef2010-11-21 00:09:52 +00004437 // -felide-constructors is the default.
4438 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004439 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004440 CmdArgs.push_back("-fno-elide-constructors");
4441
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004442 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004443
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004444 if (KernelOrKext || (types::isCXX(InputType) &&
4445 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4446 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004447 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004448
Tony Linthicum76329bf2011-12-12 21:14:55 +00004449 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004450 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4451 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004452 CmdArgs.push_back("-fshort-enums");
4453
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004454 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004455 if (Arg *A = Args.getLastArg(
4456 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4457 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4458 if (A->getOption().matches(options::OPT_funsigned_char) ||
4459 A->getOption().matches(options::OPT_fno_signed_char)) {
4460 CmdArgs.push_back("-fno-signed-char");
4461 }
4462 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004463 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004464 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004465
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004466 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004467 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4468 options::OPT_fno_use_cxa_atexit,
4469 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004470 getToolChain().getArch() != llvm::Triple::hexagon &&
4471 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004472 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004473 CmdArgs.push_back("-fno-use-cxa-atexit");
4474
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004475 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004476 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004477 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004478 CmdArgs.push_back("-fms-extensions");
4479
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004480 // -fno-use-line-directives is default.
4481 if (Args.hasFlag(options::OPT_fuse_line_directives,
4482 options::OPT_fno_use_line_directives, false))
4483 CmdArgs.push_back("-fuse-line-directives");
4484
Francois Pichet1b4f1632011-09-17 04:32:15 +00004485 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004486 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004487 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004488 (IsWindowsMSVC &&
4489 Args.hasFlag(options::OPT_fms_extensions,
4490 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004491 CmdArgs.push_back("-fms-compatibility");
4492
David Majnemerc371ff02015-03-22 08:39:22 +00004493 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004494 VersionTuple MSVT = visualstudio::getMSVCVersion(
4495 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4496 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004497 CmdArgs.push_back(
4498 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004499
David Majnemer8db91762015-05-18 04:49:30 +00004500 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4501 if (ImplyVCPPCXXVer) {
4502 if (IsMSVC2015Compatible)
4503 CmdArgs.push_back("-std=c++14");
4504 else
4505 CmdArgs.push_back("-std=c++11");
4506 }
4507
Eric Christopher5ecce122013-02-18 00:38:31 +00004508 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004509 if (Args.hasFlag(options::OPT_fborland_extensions,
4510 options::OPT_fno_borland_extensions, false))
4511 CmdArgs.push_back("-fborland-extensions");
4512
David Majnemerc371ff02015-03-22 08:39:22 +00004513 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4514 // than 19.
4515 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4516 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004517 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004518 CmdArgs.push_back("-fno-threadsafe-statics");
4519
Francois Pichet02744872011-09-01 16:38:08 +00004520 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4521 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004522 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004523 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004524 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004525
Chandler Carruthe03aa552010-04-17 20:17:31 +00004526 // -fgnu-keywords default varies depending on language; only pass if
4527 // specified.
4528 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004529 options::OPT_fno_gnu_keywords))
4530 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004531
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004532 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004533 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004534 CmdArgs.push_back("-fgnu89-inline");
4535
Chad Rosier9c76d242012-03-15 22:31:42 +00004536 if (Args.hasArg(options::OPT_fno_inline))
4537 CmdArgs.push_back("-fno-inline");
4538
Chad Rosier64d6be92012-03-06 21:17:19 +00004539 if (Args.hasArg(options::OPT_fno_inline_functions))
4540 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004541
John McCall5fb5df92012-06-20 06:18:46 +00004542 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004543
John McCall5fb5df92012-06-20 06:18:46 +00004544 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004545 // legacy is the default. Except for deployment taget of 10.5,
4546 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4547 // gets ignored silently.
4548 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004549 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4550 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004551 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004552 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004553 if (getToolChain().UseObjCMixedDispatch())
4554 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4555 else
4556 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4557 }
4558 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004559
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004560 // When ObjectiveC legacy runtime is in effect on MacOSX,
4561 // turn on the option to do Array/Dictionary subscripting
4562 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004563 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004564 getToolChain().getTriple().isMacOSX() &&
4565 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4566 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004567 objcRuntime.isNeXTFamily())
4568 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004569
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004570 // -fencode-extended-block-signature=1 is default.
4571 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4572 CmdArgs.push_back("-fencode-extended-block-signature");
4573 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004574
John McCall24fc0de2011-07-06 00:26:06 +00004575 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4576 // NOTE: This logic is duplicated in ToolChains.cpp.
4577 bool ARC = isObjCAutoRefCount(Args);
4578 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004579 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004580
John McCall24fc0de2011-07-06 00:26:06 +00004581 CmdArgs.push_back("-fobjc-arc");
4582
Chandler Carruth491db322011-11-04 07:34:47 +00004583 // FIXME: It seems like this entire block, and several around it should be
4584 // wrapped in isObjC, but for now we just use it here as this is where it
4585 // was being used previously.
4586 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4587 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4588 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4589 else
4590 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4591 }
4592
John McCall24fc0de2011-07-06 00:26:06 +00004593 // Allow the user to enable full exceptions code emission.
4594 // We define off for Objective-CC, on for Objective-C++.
4595 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4596 options::OPT_fno_objc_arc_exceptions,
4597 /*default*/ types::isCXX(InputType)))
4598 CmdArgs.push_back("-fobjc-arc-exceptions");
4599 }
4600
4601 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4602 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004603 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004604 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004605
John McCall24fc0de2011-07-06 00:26:06 +00004606 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4607 // takes precedence.
4608 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4609 if (!GCArg)
4610 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4611 if (GCArg) {
4612 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004613 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004614 } else if (getToolChain().SupportsObjCGC()) {
4615 GCArg->render(Args, CmdArgs);
4616 } else {
4617 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004618 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004619 }
4620 }
4621
Bob Wilsonb111ec92015-03-02 19:01:14 +00004622 if (Args.hasFlag(options::OPT_fapplication_extension,
4623 options::OPT_fno_application_extension, false))
4624 CmdArgs.push_back("-fapplication-extension");
4625
Reid Klecknerc542d372014-06-27 17:02:02 +00004626 // Handle GCC-style exception args.
4627 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004628 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4629 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004630
4631 if (getToolChain().UseSjLjExceptions())
4632 CmdArgs.push_back("-fsjlj-exceptions");
4633
4634 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004635 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4636 options::OPT_fno_assume_sane_operator_new))
4637 CmdArgs.push_back("-fno-assume-sane-operator-new");
4638
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004639 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4640 // most platforms.
4641 if (Args.hasFlag(options::OPT_fsized_deallocation,
4642 options::OPT_fno_sized_deallocation, false))
4643 CmdArgs.push_back("-fsized-deallocation");
4644
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004645 // -fconstant-cfstrings is default, and may be subject to argument translation
4646 // on Darwin.
4647 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4648 options::OPT_fno_constant_cfstrings) ||
4649 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4650 options::OPT_mno_constant_cfstrings))
4651 CmdArgs.push_back("-fno-constant-cfstrings");
4652
John Thompsoned4e2952009-11-05 20:14:16 +00004653 // -fshort-wchar default varies depending on platform; only
4654 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004655 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4656 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004657 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004658
Hans Wennborg28c96312013-07-31 23:39:13 +00004659 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004660 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004661 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004662 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004663
Daniel Dunbar096ed292011-10-05 21:04:55 +00004664 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4665 // -fno-pack-struct doesn't apply to -fpack-struct=.
4666 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004667 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004668 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004669 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004670 } else if (Args.hasFlag(options::OPT_fpack_struct,
4671 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004672 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004673 }
4674
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004675 // Handle -fmax-type-align=N and -fno-type-align
4676 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4677 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4678 if (!SkipMaxTypeAlign) {
4679 std::string MaxTypeAlignStr = "-fmax-type-align=";
4680 MaxTypeAlignStr += A->getValue();
4681 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4682 }
4683 } else if (getToolChain().getTriple().isOSDarwin()) {
4684 if (!SkipMaxTypeAlign) {
4685 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4686 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4687 }
4688 }
4689
Robert Lytton0e076492013-08-13 09:43:10 +00004690 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004691 if (!Args.hasArg(options::OPT_fcommon))
4692 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004693 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004694 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004695
Daniel Dunbard18049a2009-04-07 21:16:11 +00004696 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004697 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004698 CmdArgs.push_back("-fno-common");
4699
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004700 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004701 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004702 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004703 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004704 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004705 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004706
Daniel Dunbar6358d682010-10-15 22:30:42 +00004707 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004708 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004709 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004710 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004711
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004712 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004713 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4714 StringRef value = inputCharset->getValue();
4715 if (value != "UTF-8")
4716 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4717 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004718 }
4719
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004720 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004721 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4722 StringRef value = execCharset->getValue();
4723 if (value != "UTF-8")
4724 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4725 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004726 }
4727
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004728 // -fcaret-diagnostics is default.
4729 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4730 options::OPT_fno_caret_diagnostics, true))
4731 CmdArgs.push_back("-fno-caret-diagnostics");
4732
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004733 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004734 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004735 options::OPT_fno_diagnostics_fixit_info))
4736 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004737
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004738 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004739 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004740 options::OPT_fno_diagnostics_show_option))
4741 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004742
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004743 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004744 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004745 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004746 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004747 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004748
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004749 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004750 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004751 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004752 }
4753
Chandler Carruthb6766f02011-03-27 01:50:55 +00004754 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004755 options::OPT_fdiagnostics_show_note_include_stack,
4756 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004757 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004758 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004759 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4760 else
4761 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4762 }
4763
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004764 // Color diagnostics are the default, unless the terminal doesn't support
4765 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004766 // Support both clang's -f[no-]color-diagnostics and gcc's
4767 // -f[no-]diagnostics-colors[=never|always|auto].
4768 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004769 for (const auto &Arg : Args) {
4770 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004771 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4772 !O.matches(options::OPT_fdiagnostics_color) &&
4773 !O.matches(options::OPT_fno_color_diagnostics) &&
4774 !O.matches(options::OPT_fno_diagnostics_color) &&
4775 !O.matches(options::OPT_fdiagnostics_color_EQ))
4776 continue;
4777
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004778 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004779 if (O.matches(options::OPT_fcolor_diagnostics) ||
4780 O.matches(options::OPT_fdiagnostics_color)) {
4781 ShowColors = Colors_On;
4782 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4783 O.matches(options::OPT_fno_diagnostics_color)) {
4784 ShowColors = Colors_Off;
4785 } else {
4786 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004787 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004788 if (value == "always")
4789 ShowColors = Colors_On;
4790 else if (value == "never")
4791 ShowColors = Colors_Off;
4792 else if (value == "auto")
4793 ShowColors = Colors_Auto;
4794 else
4795 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004796 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004797 }
4798 }
4799 if (ShowColors == Colors_On ||
4800 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004801 CmdArgs.push_back("-fcolor-diagnostics");
4802
Nico Rieck7857d462013-09-11 00:38:02 +00004803 if (Args.hasArg(options::OPT_fansi_escape_codes))
4804 CmdArgs.push_back("-fansi-escape-codes");
4805
Daniel Dunbardb097022009-06-08 21:13:54 +00004806 if (!Args.hasFlag(options::OPT_fshow_source_location,
4807 options::OPT_fno_show_source_location))
4808 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004809
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004811 true))
4812 CmdArgs.push_back("-fno-show-column");
4813
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004814 if (!Args.hasFlag(options::OPT_fspell_checking,
4815 options::OPT_fno_spell_checking))
4816 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004817
Chad Rosierc8e56e82012-12-05 21:08:21 +00004818 // -fno-asm-blocks is default.
4819 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4820 false))
4821 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004822
Steven Wucb0d13f2015-01-16 23:05:28 +00004823 // -fgnu-inline-asm is default.
4824 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4825 options::OPT_fno_gnu_inline_asm, true))
4826 CmdArgs.push_back("-fno-gnu-inline-asm");
4827
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004828 // Enable vectorization per default according to the optimization level
4829 // selected. For optimization levels that want vectorization we use the alias
4830 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004831 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004832 OptSpecifier VectorizeAliasOption =
4833 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004834 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004835 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004836 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004837
Chad Rosier136d67d2014-04-28 19:30:57 +00004838 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004839 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004840 OptSpecifier SLPVectAliasOption =
4841 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004842 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004843 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004844 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004845
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004846 // -fno-slp-vectorize-aggressive is default.
4847 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004848 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004849 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004850
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004851 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4852 A->render(Args, CmdArgs);
4853
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004854 // -fdollars-in-identifiers default varies depending on platform and
4855 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004856 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004857 options::OPT_fno_dollars_in_identifiers)) {
4858 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004859 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004860 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004861 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004862 }
4863
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004864 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4865 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004866 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004867 options::OPT_fno_unit_at_a_time)) {
4868 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004869 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004870 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004871
Eli Friedman055c9702011-11-02 01:53:16 +00004872 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4873 options::OPT_fno_apple_pragma_pack, false))
4874 CmdArgs.push_back("-fapple-pragma-pack");
4875
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004876 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004877 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4878 // by default.
4879 if (getToolChain().getArch() == llvm::Triple::le32) {
4880 CmdArgs.push_back("-fno-math-builtin");
4881 }
4882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004883// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4884//
4885// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004886#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004887 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004888 (getToolChain().getArch() == llvm::Triple::arm ||
4889 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004890 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4891 CmdArgs.push_back("-fno-builtin-strcat");
4892 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4893 CmdArgs.push_back("-fno-builtin-strcpy");
4894 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004895#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004896
Justin Bognera88f0122014-06-20 22:59:50 +00004897 // Enable rewrite includes if the user's asked for it or if we're generating
4898 // diagnostics.
4899 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4900 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004901 if (Args.hasFlag(options::OPT_frewrite_includes,
4902 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004903 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004904 CmdArgs.push_back("-frewrite-includes");
4905
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004906 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004907 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004908 options::OPT_traditional_cpp)) {
4909 if (isa<PreprocessJobAction>(JA))
4910 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004911 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004912 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004913 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004914
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004915 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004916 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004917
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004918 // Handle serialized diagnostics.
4919 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4920 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004921 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004922 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004923
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004924 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4925 CmdArgs.push_back("-fretain-comments-from-system-headers");
4926
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004927 // Forward -fcomment-block-commands to -cc1.
4928 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004929 // Forward -fparse-all-comments to -cc1.
4930 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004931
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004932 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4933 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004934 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004935 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4936 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004937
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004938 // We translate this by hand to the -cc1 argument, since nightly test uses
4939 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004940 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004941 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004942 } else
Sean Silva14facf32015-06-09 01:57:17 +00004943 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004944 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004945
Bob Wilson23a55f12014-12-21 07:00:00 +00004946 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004947 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4948 // by the frontend.
4949 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4950 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004951
Daniel Dunbard67a3222009-03-30 06:36:42 +00004952 if (Output.getType() == types::TY_Dependencies) {
4953 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004954 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004955 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004956 CmdArgs.push_back(Output.getFilename());
4957 } else {
4958 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004959 }
4960
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004961 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004962
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004963 if (Input.isFilename())
4964 CmdArgs.push_back(Input.getFilename());
4965 else
4966 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004967
Chris Lattnere9d7d782009-11-03 19:50:27 +00004968 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4969
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004970 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004971
4972 // Optionally embed the -cc1 level arguments into the debug info, for build
4973 // analysis.
4974 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004975 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004976 for (const auto &Arg : Args)
4977 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004978
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004979 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004980 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004981 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004982 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004983 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004984 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004985 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004986 }
4987 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004988 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004989 }
4990
Eric Christopherd3804002013-02-22 20:12:52 +00004991 // Add the split debug info name to the command lines here so we
4992 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00004993 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004994 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4995 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004996 const char *SplitDwarfOut;
4997 if (SplitDwarf) {
4998 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004999 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005000 CmdArgs.push_back(SplitDwarfOut);
5001 }
5002
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005003 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5004 // Include them with -fcuda-include-gpubinary.
5005 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005006 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005007 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005008 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005009 }
5010
Eric Christopherd3804002013-02-22 20:12:52 +00005011 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005012 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005013 Output.getType() == types::TY_Object &&
5014 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005015 auto CLCommand =
5016 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005017 C.addCommand(llvm::make_unique<FallbackCommand>(
5018 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005019 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005020 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005021 }
5022
Eric Christopherf1545832013-02-22 23:50:16 +00005023 // Handle the debug info splitting at object creation time if we're
5024 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005025 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005026 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005027 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005028
Roman Divacky178e01602011-02-10 16:52:03 +00005029 if (Arg *A = Args.getLastArg(options::OPT_pg))
5030 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005031 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5032 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005033
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005034 // Claim some arguments which clang supports automatically.
5035
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005036 // -fpch-preprocess is used with gcc to add a special marker in the output to
5037 // include the PCH file. Clang's PTH solution is completely transparent, so we
5038 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005039 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005040
Daniel Dunbar17731772009-03-23 19:03:36 +00005041 // Claim some arguments which clang doesn't support, but we don't
5042 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005043 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5044 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005045
Rafael Espindolab0092d72013-09-04 19:37:35 +00005046 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005047 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005048}
5049
John McCall5fb5df92012-06-20 06:18:46 +00005050/// Add options related to the Objective-C runtime/ABI.
5051///
5052/// Returns true if the runtime is non-fragile.
5053ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5054 ArgStringList &cmdArgs,
5055 RewriteKind rewriteKind) const {
5056 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005057 Arg *runtimeArg =
5058 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5059 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005060
5061 // Just forward -fobjc-runtime= to the frontend. This supercedes
5062 // options about fragility.
5063 if (runtimeArg &&
5064 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5065 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005066 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005067 if (runtime.tryParse(value)) {
5068 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005069 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005070 }
5071
5072 runtimeArg->render(args, cmdArgs);
5073 return runtime;
5074 }
5075
5076 // Otherwise, we'll need the ABI "version". Version numbers are
5077 // slightly confusing for historical reasons:
5078 // 1 - Traditional "fragile" ABI
5079 // 2 - Non-fragile ABI, version 1
5080 // 3 - Non-fragile ABI, version 2
5081 unsigned objcABIVersion = 1;
5082 // If -fobjc-abi-version= is present, use that to set the version.
5083 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005084 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005085 if (value == "1")
5086 objcABIVersion = 1;
5087 else if (value == "2")
5088 objcABIVersion = 2;
5089 else if (value == "3")
5090 objcABIVersion = 3;
5091 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005092 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005093 } else {
5094 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005095 bool nonFragileABIIsDefault =
5096 (rewriteKind == RK_NonFragile ||
5097 (rewriteKind == RK_None &&
5098 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005099 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5100 options::OPT_fno_objc_nonfragile_abi,
5101 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005102// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005103#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5104 unsigned nonFragileABIVersion = 1;
5105#else
5106 unsigned nonFragileABIVersion = 2;
5107#endif
5108
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005109 if (Arg *abiArg =
5110 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005111 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005112 if (value == "1")
5113 nonFragileABIVersion = 1;
5114 else if (value == "2")
5115 nonFragileABIVersion = 2;
5116 else
5117 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005118 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005119 }
5120
5121 objcABIVersion = 1 + nonFragileABIVersion;
5122 } else {
5123 objcABIVersion = 1;
5124 }
5125 }
5126
5127 // We don't actually care about the ABI version other than whether
5128 // it's non-fragile.
5129 bool isNonFragile = objcABIVersion != 1;
5130
5131 // If we have no runtime argument, ask the toolchain for its default runtime.
5132 // However, the rewriter only really supports the Mac runtime, so assume that.
5133 ObjCRuntime runtime;
5134 if (!runtimeArg) {
5135 switch (rewriteKind) {
5136 case RK_None:
5137 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5138 break;
5139 case RK_Fragile:
5140 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5141 break;
5142 case RK_NonFragile:
5143 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5144 break;
5145 }
5146
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005147 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005148 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5149 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005150 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005151 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5152
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005153 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005154 } else {
5155 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5156 }
5157
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005158 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005159 } else {
5160 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005161 // Legacy behaviour is to target the gnustep runtime if we are i
5162 // non-fragile mode or the GCC runtime in fragile mode.
5163 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005165 else
5166 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005167 }
5168
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 cmdArgs.push_back(
5170 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005171 return runtime;
5172}
5173
Reid Klecknerc542d372014-06-27 17:02:02 +00005174static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5175 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5176 I += HaveDash;
5177 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005178}
Reid Klecknerc542d372014-06-27 17:02:02 +00005179
5180struct EHFlags {
5181 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5182 bool Synch;
5183 bool Asynch;
5184 bool NoExceptC;
5185};
5186
5187/// /EH controls whether to run destructor cleanups when exceptions are
5188/// thrown. There are three modifiers:
5189/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5190/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5191/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5192/// - c: Assume that extern "C" functions are implicitly noexcept. This
5193/// modifier is an optimization, so we ignore it for now.
5194/// The default is /EHs-c-, meaning cleanups are disabled.
5195static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5196 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005197
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005198 std::vector<std::string> EHArgs =
5199 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005200 for (auto EHVal : EHArgs) {
5201 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5202 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005203 case 'a':
5204 EH.Asynch = maybeConsumeDash(EHVal, I);
5205 continue;
5206 case 'c':
5207 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5208 continue;
5209 case 's':
5210 EH.Synch = maybeConsumeDash(EHVal, I);
5211 continue;
5212 default:
5213 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005214 }
5215 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5216 break;
5217 }
5218 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005219
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005220 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5221 // can use -Xclang to manually enable C++ EH until then.
5222 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005223
Reid Klecknerc542d372014-06-27 17:02:02 +00005224 return EH;
5225}
5226
Hans Wennborg75958c42013-08-08 00:17:41 +00005227void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5228 unsigned RTOptionID = options::OPT__SLASH_MT;
5229
Hans Wennborgf1a74252013-09-10 20:18:04 +00005230 if (Args.hasArg(options::OPT__SLASH_LDd))
5231 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5232 // but defining _DEBUG is sticky.
5233 RTOptionID = options::OPT__SLASH_MTd;
5234
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005235 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005236 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005237
David Majnemere2afb472015-07-24 06:49:13 +00005238 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005239 switch (RTOptionID) {
5240 case options::OPT__SLASH_MD:
5241 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005242 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005243 CmdArgs.push_back("-D_MT");
5244 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005245 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005246 break;
5247 case options::OPT__SLASH_MDd:
5248 CmdArgs.push_back("-D_DEBUG");
5249 CmdArgs.push_back("-D_MT");
5250 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005251 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005252 break;
5253 case options::OPT__SLASH_MT:
5254 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005255 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005256 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005257 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005258 break;
5259 case options::OPT__SLASH_MTd:
5260 CmdArgs.push_back("-D_DEBUG");
5261 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005262 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005263 break;
5264 default:
5265 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005266 }
5267
David Majnemere2afb472015-07-24 06:49:13 +00005268 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5269 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5270 } else {
5271 CmdArgs.push_back(FlagForCRT.data());
5272
5273 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5274 // users want. The /Za flag to cl.exe turns this off, but it's not
5275 // implemented in clang.
5276 CmdArgs.push_back("--dependent-lib=oldnames");
5277 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005278
Hans Wennborg8858a032014-07-21 23:42:07 +00005279 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5280 // would produce interleaved output, so ignore /showIncludes in such cases.
5281 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5282 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5283 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005284
David Majnemerf6072342014-07-01 22:24:56 +00005285 // This controls whether or not we emit RTTI data for polymorphic types.
5286 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5287 /*default=*/false))
5288 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005289
Reid Kleckner124955a2015-08-05 18:51:13 +00005290 // Emit CodeView if -Z7 is present.
5291 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5292 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5293 // If we are emitting CV but not DWARF, don't build information that LLVM
5294 // can't yet process.
5295 if (EmitCodeView && !EmitDwarf)
5296 CmdArgs.push_back("-gline-tables-only");
5297 if (EmitCodeView)
5298 CmdArgs.push_back("-gcodeview");
5299
Reid Klecknerc542d372014-06-27 17:02:02 +00005300 const Driver &D = getToolChain().getDriver();
5301 EHFlags EH = parseClangCLEHFlags(D, Args);
5302 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005303 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005304 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005305 CmdArgs.push_back("-fexceptions");
5306 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005307
Hans Wennborge50cec32014-06-13 20:59:54 +00005308 // /EP should expand to -E -P.
5309 if (Args.hasArg(options::OPT__SLASH_EP)) {
5310 CmdArgs.push_back("-E");
5311 CmdArgs.push_back("-P");
5312 }
5313
David Majnemera5b195a2015-02-14 01:35:12 +00005314 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005315 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5316 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005317 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5318 else
5319 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5320
5321 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5322 VolatileOptionID = A->getOption().getID();
5323
5324 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5325 CmdArgs.push_back("-fms-volatile");
5326
David Majnemer86c318f2014-02-11 21:05:00 +00005327 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5328 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5329 if (MostGeneralArg && BestCaseArg)
5330 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5331 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5332
5333 if (MostGeneralArg) {
5334 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5335 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5336 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5337
5338 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5339 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5340 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5341 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5342 << FirstConflict->getAsString(Args)
5343 << SecondConflict->getAsString(Args);
5344
5345 if (SingleArg)
5346 CmdArgs.push_back("-fms-memptr-rep=single");
5347 else if (MultipleArg)
5348 CmdArgs.push_back("-fms-memptr-rep=multiple");
5349 else
5350 CmdArgs.push_back("-fms-memptr-rep=virtual");
5351 }
5352
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005353 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5354 A->render(Args, CmdArgs);
5355
Hans Wennborg81f74482013-09-10 01:07:07 +00005356 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5357 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005358 if (Args.hasArg(options::OPT__SLASH_fallback))
5359 CmdArgs.push_back("msvc-fallback");
5360 else
5361 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005362 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005363}
5364
Douglas Katzman95354292015-06-23 20:42:09 +00005365visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005366 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005367 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005368 return CLFallback.get();
5369}
5370
Daniel Sanders7f933f42015-01-30 17:35:23 +00005371void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5372 ArgStringList &CmdArgs) const {
5373 StringRef CPUName;
5374 StringRef ABIName;
5375 const llvm::Triple &Triple = getToolChain().getTriple();
5376 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5377
5378 CmdArgs.push_back("-target-abi");
5379 CmdArgs.push_back(ABIName.data());
5380}
5381
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005382void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005383 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005384 const ArgList &Args,
5385 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005386 ArgStringList CmdArgs;
5387
5388 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5389 const InputInfo &Input = Inputs[0];
5390
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005391 // Don't warn about "clang -w -c foo.s"
5392 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005393 // and "clang -emit-llvm -c foo.s"
5394 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005395
Rafael Espindola577637a2015-01-03 00:06:04 +00005396 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005397
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005398 // Invoke ourselves in -cc1as mode.
5399 //
5400 // FIXME: Implement custom jobs for internal actions.
5401 CmdArgs.push_back("-cc1as");
5402
5403 // Add the "effective" target triple.
5404 CmdArgs.push_back("-triple");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005405 std::string TripleStr =
5406 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005407 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5408
5409 // Set the output mode, we currently only expect to be used as a real
5410 // assembler.
5411 CmdArgs.push_back("-filetype");
5412 CmdArgs.push_back("obj");
5413
Eric Christopher45f2e712012-12-18 00:31:10 +00005414 // Set the main file name, so that debug info works even with
5415 // -save-temps or preprocessed assembly.
5416 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005417 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005418
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005419 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005420 const llvm::Triple Triple(TripleStr);
Renato Golin7c542b42015-07-27 23:44:45 +00005421 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005422 if (!CPU.empty()) {
5423 CmdArgs.push_back("-target-cpu");
5424 CmdArgs.push_back(Args.MakeArgString(CPU));
5425 }
5426
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005427 // Add the target features
5428 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005429 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005430
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005431 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005432 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005433
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005434 // Pass along any -I options so we get proper .include search paths.
5435 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5436
Eric Christopherfc3ee562012-01-10 00:38:01 +00005437 // Determine the original source input.
5438 const Action *SourceAction = &JA;
5439 while (SourceAction->getKind() != Action::InputClass) {
5440 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5441 SourceAction = SourceAction->getInputs()[0];
5442 }
5443
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005444 // Forward -g and handle debug info related flags, assuming we are dealing
5445 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005446 if (SourceAction->getType() == types::TY_Asm ||
5447 SourceAction->getType() == types::TY_PP_Asm) {
5448 Args.ClaimAllArgs(options::OPT_g_Group);
5449 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5450 if (!A->getOption().matches(options::OPT_g0))
5451 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005452
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005453 if (Args.hasArg(options::OPT_gdwarf_2))
5454 CmdArgs.push_back("-gdwarf-2");
5455 if (Args.hasArg(options::OPT_gdwarf_3))
5456 CmdArgs.push_back("-gdwarf-3");
5457 if (Args.hasArg(options::OPT_gdwarf_4))
5458 CmdArgs.push_back("-gdwarf-4");
5459
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005460 // Add the -fdebug-compilation-dir flag if needed.
5461 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005462
5463 // Set the AT_producer to the clang version when using the integrated
5464 // assembler on assembly source files.
5465 CmdArgs.push_back("-dwarf-debug-producer");
5466 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005467
5468 // And pass along -I options
5469 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005470 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005471
5472 // Optionally embed the -cc1as level arguments into the debug info, for build
5473 // analysis.
5474 if (getToolChain().UseDwarfDebugFlags()) {
5475 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005476 for (const auto &Arg : Args)
5477 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005478
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005479 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005480 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5481 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005482 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005483 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005484 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005485 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005486 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005487 }
5488 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005489 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005490 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005491
5492 // FIXME: Add -static support, once we have it.
5493
Daniel Sanders7f933f42015-01-30 17:35:23 +00005494 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005495 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005496 default:
5497 break;
5498
5499 case llvm::Triple::mips:
5500 case llvm::Triple::mipsel:
5501 case llvm::Triple::mips64:
5502 case llvm::Triple::mips64el:
5503 AddMIPSTargetArgs(Args, CmdArgs);
5504 break;
5505 }
5506
David Blaikie372d9502014-01-17 03:17:40 +00005507 // Consume all the warning flags. Usually this would be handled more
5508 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5509 // doesn't handle that so rather than warning about unused flags that are
5510 // actually used, we'll lie by omission instead.
5511 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005512 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5513 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005514
David Blaikie9260ed62013-07-25 21:19:01 +00005515 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5516 getToolChain().getDriver());
5517
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005518 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005519
5520 assert(Output.isFilename() && "Unexpected lipo output.");
5521 CmdArgs.push_back("-o");
5522 CmdArgs.push_back(Output.getFilename());
5523
Daniel Dunbarb440f562010-08-02 02:38:21 +00005524 assert(Input.isFilename() && "Invalid input.");
5525 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005526
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005527 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005528 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005529
5530 // Handle the debug info splitting at object creation time if we're
5531 // creating an object.
5532 // TODO: Currently only works on linux with newer objcopy.
5533 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005534 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005535 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005536 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005537}
5538
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005539void GnuTool::anchor() {}
5540
Daniel Dunbara3246a02009-03-18 08:07:30 +00005541void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005542 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005543 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005544 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005545 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005546 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005547
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005548 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005549 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005550 // Don't forward any -g arguments to assembly steps.
5551 if (isa<AssembleJobAction>(JA) &&
5552 A->getOption().matches(options::OPT_g_Group))
5553 continue;
5554
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005555 // Don't forward any -W arguments to assembly and link steps.
5556 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5557 A->getOption().matches(options::OPT_W_Group))
5558 continue;
5559
Daniel Dunbar2da02722009-03-19 07:55:12 +00005560 // It is unfortunate that we have to claim here, as this means
5561 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005562 // platforms using a generic gcc, even if we are just using gcc
5563 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005564 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005565 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005566 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005567 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005568
Daniel Dunbar4e295052010-01-25 22:35:08 +00005569 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005570
5571 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005572 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005573 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005574 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005575 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005576 }
5577
Daniel Dunbar5716d872009-05-02 21:41:52 +00005578 // Try to force gcc to match the tool chain we want, if we recognize
5579 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005580 //
5581 // FIXME: The triple class should directly provide the information we want
5582 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005583 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005584 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005585 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005586 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5587 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005588 CmdArgs.push_back("-m64");
5589
Daniel Dunbarb440f562010-08-02 02:38:21 +00005590 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005591 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005592 CmdArgs.push_back(Output.getFilename());
5593 } else {
5594 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005595 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005596 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005597
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005598 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005599
5600 // Only pass -x if gcc will understand it; otherwise hope gcc
5601 // understands the suffix correctly. The main use case this would go
5602 // wrong in is for linker inputs if they happened to have an odd
5603 // suffix; really the only way to get this to happen is a command
5604 // like '-x foobar a.c' which will treat a.c like a linker input.
5605 //
5606 // FIXME: For the linker case specifically, can we safely convert
5607 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005608 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005609 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005610 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5611 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005612 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005613 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005614 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005615 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005616 else if (II.getType() == types::TY_ModuleFile)
5617 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005618 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005619
Daniel Dunbara3246a02009-03-18 08:07:30 +00005620 if (types::canTypeBeUserSpecified(II.getType())) {
5621 CmdArgs.push_back("-x");
5622 CmdArgs.push_back(types::getTypeName(II.getType()));
5623 }
5624
Daniel Dunbarb440f562010-08-02 02:38:21 +00005625 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005626 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005627 else {
5628 const Arg &A = II.getInputArg();
5629
5630 // Reverse translate some rewritten options.
5631 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5632 CmdArgs.push_back("-lstdc++");
5633 continue;
5634 }
5635
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005636 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005637 A.render(Args, CmdArgs);
5638 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005639 }
5640
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005641 const std::string customGCCName = D.getCCCGenericGCCName();
5642 const char *GCCName;
5643 if (!customGCCName.empty())
5644 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005645 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005646 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005647 } else
5648 GCCName = "gcc";
5649
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005650 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005652}
5653
Douglas Katzman95354292015-06-23 20:42:09 +00005654void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5655 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005656 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005657}
5658
Douglas Katzman95354292015-06-23 20:42:09 +00005659void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5660 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005661 const Driver &D = getToolChain().getDriver();
5662
Eric Christophercc7ff502015-01-29 00:56:17 +00005663 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005664 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005665 case types::TY_LLVM_IR:
5666 case types::TY_LTO_IR:
5667 case types::TY_LLVM_BC:
5668 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005669 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005670 break;
5671 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005672 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005673 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005674 case types::TY_Nothing:
5675 CmdArgs.push_back("-fsyntax-only");
5676 break;
5677 default:
5678 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005679 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005680}
5681
Douglas Katzman95354292015-06-23 20:42:09 +00005682void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5683 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005684 // The types are (hopefully) good enough.
5685}
5686
Tony Linthicum76329bf2011-12-12 21:14:55 +00005687// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005688void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5689 ArgStringList &CmdArgs) const {}
5690void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5691 const InputInfo &Output,
5692 const InputInfoList &Inputs,
5693 const ArgList &Args,
5694 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005695 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005696
5697 const Driver &D = getToolChain().getDriver();
5698 ArgStringList CmdArgs;
5699
5700 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005701 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005702 CmdArgs.push_back(Args.MakeArgString(MarchString));
5703
5704 RenderExtraToolArgs(JA, CmdArgs);
5705
5706 if (Output.isFilename()) {
5707 CmdArgs.push_back("-o");
5708 CmdArgs.push_back(Output.getFilename());
5709 } else {
5710 assert(Output.isNothing() && "Unexpected output");
5711 CmdArgs.push_back("-fsyntax-only");
5712 }
5713
Douglas Katzman54366072015-07-27 16:53:08 +00005714 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005715 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005717 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005718
Tony Linthicum76329bf2011-12-12 21:14:55 +00005719 // Only pass -x if gcc will understand it; otherwise hope gcc
5720 // understands the suffix correctly. The main use case this would go
5721 // wrong in is for linker inputs if they happened to have an odd
5722 // suffix; really the only way to get this to happen is a command
5723 // like '-x foobar a.c' which will treat a.c like a linker input.
5724 //
5725 // FIXME: For the linker case specifically, can we safely convert
5726 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005727 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005728 // Don't try to pass LLVM or AST inputs to a generic gcc.
5729 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5730 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5731 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005732 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005733 else if (II.getType() == types::TY_AST)
5734 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005735 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005736 else if (II.getType() == types::TY_ModuleFile)
5737 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005738 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005739
5740 if (II.isFilename())
5741 CmdArgs.push_back(II.getFilename());
5742 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005743 // Don't render as input, we need gcc to do the translations.
5744 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005745 II.getInputArg().render(Args, CmdArgs);
5746 }
5747
5748 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005749 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005750 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005751}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005752
Douglas Katzman95354292015-06-23 20:42:09 +00005753void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5754 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005755 // The types are (hopefully) good enough.
5756}
5757
Douglas Katzman54366072015-07-27 16:53:08 +00005758static void
5759constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5760 const toolchains::HexagonToolChain &ToolChain,
5761 const InputInfo &Output, const InputInfoList &Inputs,
5762 const ArgList &Args, ArgStringList &CmdArgs,
5763 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005764
Matthew Curtise689b052012-12-06 15:46:07 +00005765 const Driver &D = ToolChain.getDriver();
5766
Matthew Curtise689b052012-12-06 15:46:07 +00005767 //----------------------------------------------------------------------------
5768 //
5769 //----------------------------------------------------------------------------
5770 bool hasStaticArg = Args.hasArg(options::OPT_static);
5771 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005772 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005773 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5774 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5775 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005776 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005777 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005778
Matthew Curtise689b052012-12-06 15:46:07 +00005779 //----------------------------------------------------------------------------
5780 // Silence warnings for various options
5781 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005782
Matthew Curtise689b052012-12-06 15:46:07 +00005783 Args.ClaimAllArgs(options::OPT_g_Group);
5784 Args.ClaimAllArgs(options::OPT_emit_llvm);
5785 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5786 // handled somewhere else.
5787 Args.ClaimAllArgs(options::OPT_static_libgcc);
5788
5789 //----------------------------------------------------------------------------
5790 //
5791 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005792 for (const auto &Opt : ToolChain.ExtraOpts)
5793 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005794
Douglas Katzman54366072015-07-27 16:53:08 +00005795 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005796 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005797
Matthew Curtise689b052012-12-06 15:46:07 +00005798 if (buildingLib) {
5799 CmdArgs.push_back("-shared");
5800 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5801 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005802 }
5803
Matthew Curtise689b052012-12-06 15:46:07 +00005804 if (hasStaticArg)
5805 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005806
Matthew Curtise8f80a12012-12-06 17:49:03 +00005807 if (buildPIE && !buildingLib)
5808 CmdArgs.push_back("-pie");
5809
Douglas Katzman54366072015-07-27 16:53:08 +00005810 if (const char *v =
5811 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005812 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005813 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005814 }
5815
Matthew Curtise689b052012-12-06 15:46:07 +00005816 //----------------------------------------------------------------------------
5817 //
5818 //----------------------------------------------------------------------------
5819 CmdArgs.push_back("-o");
5820 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005821
Matthew Curtise689b052012-12-06 15:46:07 +00005822 const std::string MarchSuffix = "/" + MarchString;
5823 const std::string G0Suffix = "/G0";
5824 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005825 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005826 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005827 const std::string StartFilesDir =
5828 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005829
5830 //----------------------------------------------------------------------------
5831 // moslib
5832 //----------------------------------------------------------------------------
5833 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005834 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005835
Sean Silva14facf32015-06-09 01:57:17 +00005836 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5837 A->claim();
5838 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005839 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005840 }
Matthew Curtise689b052012-12-06 15:46:07 +00005841 if (oslibs.empty()) {
5842 oslibs.push_back("standalone");
5843 hasStandalone = true;
5844 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005845
Matthew Curtise689b052012-12-06 15:46:07 +00005846 //----------------------------------------------------------------------------
5847 // Start Files
5848 //----------------------------------------------------------------------------
5849 if (incStdLib && incStartFiles) {
5850
5851 if (!buildingLib) {
5852 if (hasStandalone) {
5853 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005854 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005855 }
5856 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5857 }
5858 std::string initObj = useShared ? "/initS.o" : "/init.o";
5859 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5860 }
5861
5862 //----------------------------------------------------------------------------
5863 // Library Search Paths
5864 //----------------------------------------------------------------------------
5865 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005866 for (const auto &LibPath : LibPaths)
5867 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005868
5869 //----------------------------------------------------------------------------
5870 //
5871 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005872 Args.AddAllArgs(CmdArgs,
5873 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5874 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005875
5876 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5877
5878 //----------------------------------------------------------------------------
5879 // Libraries
5880 //----------------------------------------------------------------------------
5881 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005882 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005883 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5884 CmdArgs.push_back("-lm");
5885 }
5886
5887 CmdArgs.push_back("--start-group");
5888
5889 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005890 for (const std::string &Lib : oslibs)
5891 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005892 CmdArgs.push_back("-lc");
5893 }
5894 CmdArgs.push_back("-lgcc");
5895
5896 CmdArgs.push_back("--end-group");
5897 }
5898
5899 //----------------------------------------------------------------------------
5900 // End files
5901 //----------------------------------------------------------------------------
5902 if (incStdLib && incStartFiles) {
5903 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5904 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5905 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005906}
5907
Douglas Katzman95354292015-06-23 20:42:09 +00005908void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5909 const InputInfo &Output,
5910 const InputInfoList &Inputs,
5911 const ArgList &Args,
5912 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005913
Douglas Katzman54366072015-07-27 16:53:08 +00005914 const toolchains::HexagonToolChain &ToolChain =
5915 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005916
5917 ArgStringList CmdArgs;
5918 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5919 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005920
5921 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005922 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005923 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005924}
5925// Hexagon tools end.
5926
Tom Stellard8fa33092015-07-18 01:49:05 +00005927void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5928 const InputInfo &Output,
5929 const InputInfoList &Inputs,
5930 const ArgList &Args,
5931 const char *LinkingOutput) const {
5932
5933 std::string Linker = getToolChain().GetProgramPath(getShortName());
5934 ArgStringList CmdArgs;
5935 CmdArgs.push_back("-flavor");
5936 CmdArgs.push_back("gnu");
5937 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00005938 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00005939 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5940 CmdArgs.push_back("-o");
5941 CmdArgs.push_back(Output.getFilename());
5942 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5943 CmdArgs, Inputs));
5944}
5945// AMDGPU tools end.
5946
Renato Golin7c542b42015-07-27 23:44:45 +00005947const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005948 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00005949 if (!Arch.empty())
5950 MArch = Arch;
5951 else
Bernard Ogden31561762013-12-12 13:27:11 +00005952 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005953 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005954
5955 // Handle -march=native.
5956 if (MArch == "native") {
5957 std::string CPU = llvm::sys::getHostCPUName();
5958 if (CPU != "generic") {
5959 // Translate the native cpu into the architecture suffix for that CPU.
5960 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5961 // If there is no valid architecture suffix for this CPU we don't know how
5962 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005963 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005964 MArch = "";
5965 else
5966 MArch = std::string("arm") + Suffix;
5967 }
5968 }
5969
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005970 return MArch;
5971}
5972/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005973const char *arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00005974 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005975 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5976 // here means an -march=native that we can't handle, so instead return no CPU.
5977 if (MArch.empty())
5978 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005979
John Brawna95c1a82015-05-08 12:52:18 +00005980 // We need to return an empty string here on invalid MArch values as the
5981 // various places that call this function can't cope with a null result.
5982 const char *result = Triple.getARMCPUForArch(MArch);
5983 if (result)
5984 return result;
5985 else
5986 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005987}
5988
5989/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005990std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005991 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005992 // FIXME: Warn on inconsistent use of -mcpu and -march.
5993 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00005994 if (!CPU.empty()) {
5995 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005996 // Handle -mcpu=native.
5997 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005998 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005999 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006000 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006001 }
6002
Renato Goline17c5802015-07-27 23:44:42 +00006003 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006004}
6005
6006/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006007/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006008// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006009const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00006010 if (CPU == "generic" &&
6011 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
6012 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006013
Renato Golin3c007252015-05-28 15:05:53 +00006014 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
6015 if (ArchKind == llvm::ARM::AK_INVALID)
6016 return "";
6017 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006018}
6019
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006020void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006021 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006022 if (Args.hasArg(options::OPT_r))
6023 return;
6024
John Brawn94fd9632015-05-21 12:19:49 +00006025 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6026 // to generate BE-8 executables.
6027 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6028 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006029}
6030
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006031mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6032 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6033 .Case("mips1", NanLegacy)
6034 .Case("mips2", NanLegacy)
6035 .Case("mips3", NanLegacy)
6036 .Case("mips4", NanLegacy)
6037 .Case("mips5", NanLegacy)
6038 .Case("mips32", NanLegacy)
6039 .Case("mips32r2", NanLegacy)
6040 .Case("mips32r3", NanLegacy | Nan2008)
6041 .Case("mips32r5", NanLegacy | Nan2008)
6042 .Case("mips32r6", Nan2008)
6043 .Case("mips64", NanLegacy)
6044 .Case("mips64r2", NanLegacy)
6045 .Case("mips64r3", NanLegacy | Nan2008)
6046 .Case("mips64r5", NanLegacy | Nan2008)
6047 .Case("mips64r6", Nan2008)
6048 .Default(NanLegacy);
6049}
6050
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006051bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6052 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6053 return A && (A->getValue() == StringRef(Value));
6054}
6055
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006056bool mips::isUCLibc(const ArgList &Args) {
6057 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006058 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006059}
6060
Daniel Sanders2bf13662014-07-10 14:40:57 +00006061bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006062 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6063 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006064 .Case("2008", true)
6065 .Case("legacy", false)
6066 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006067
6068 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006069 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006070 .Cases("mips32r6", "mips64r6", true)
6071 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006072
6073 return false;
6074}
6075
Daniel Sanders379d44b2014-07-16 11:52:23 +00006076bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006077 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006078 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006079 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006080 return false;
6081
6082 if (ABIName != "32")
6083 return false;
6084
Toma Tabacu94ea6862015-06-16 13:54:13 +00006085 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6086 // present.
6087 if (FloatABI == "soft")
6088 return false;
6089
Daniel Sanders379d44b2014-07-16 11:52:23 +00006090 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006091 .Cases("mips2", "mips3", "mips4", "mips5", true)
6092 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6093 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6094 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006095}
6096
Toma Tabacu94ea6862015-06-16 13:54:13 +00006097bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6098 StringRef CPUName, StringRef ABIName,
6099 StringRef FloatABI) {
6100 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6101
6102 // FPXX shouldn't be used if -msingle-float is present.
6103 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6104 options::OPT_mdouble_float))
6105 if (A->getOption().matches(options::OPT_msingle_float))
6106 UseFPXX = false;
6107
6108 return UseFPXX;
6109}
6110
Tim Northover157d9112014-01-16 08:48:16 +00006111llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006112 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6113 // archs which Darwin doesn't use.
6114
6115 // The matching this routine does is fairly pointless, since it is neither the
6116 // complete architecture list, nor a reasonable subset. The problem is that
6117 // historically the driver driver accepts this and also ties its -march=
6118 // handling to the architecture name, so we need to be careful before removing
6119 // support for it.
6120
6121 // This code must be kept in sync with Clang's Darwin specific argument
6122 // translation.
6123
6124 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006125 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6126 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6127 .Case("ppc64", llvm::Triple::ppc64)
6128 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6129 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6130 llvm::Triple::x86)
6131 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6132 // This is derived from the driver driver.
6133 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6134 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6135 .Cases("armv7s", "xscale", llvm::Triple::arm)
6136 .Case("arm64", llvm::Triple::aarch64)
6137 .Case("r600", llvm::Triple::r600)
6138 .Case("amdgcn", llvm::Triple::amdgcn)
6139 .Case("nvptx", llvm::Triple::nvptx)
6140 .Case("nvptx64", llvm::Triple::nvptx64)
6141 .Case("amdil", llvm::Triple::amdil)
6142 .Case("spir", llvm::Triple::spir)
6143 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006144}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006145
Tim Northover157d9112014-01-16 08:48:16 +00006146void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006147 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006148 T.setArch(Arch);
6149
6150 if (Str == "x86_64h")
6151 T.setArchName(Str);
6152 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6153 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006154 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006155 }
6156}
6157
Bob Wilsondecc03e2012-11-23 06:14:39 +00006158const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006159 const InputInfo &Input) {
6160 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006161}
6162
Bob Wilsondecc03e2012-11-23 06:14:39 +00006163const char *Clang::getBaseInputStem(const ArgList &Args,
6164 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006165 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006166
Chris Lattner906bb902011-01-16 08:14:11 +00006167 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006168 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006169
6170 return Str;
6171}
6172
Bob Wilsondecc03e2012-11-23 06:14:39 +00006173const char *Clang::getDependencyFileName(const ArgList &Args,
6174 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006175 // FIXME: Think about this more.
6176 std::string Res;
6177
6178 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006179 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006180 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006181 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006182 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006183 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006184 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006185}
6186
Douglas Katzman95354292015-06-23 20:42:09 +00006187void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6188 const InputInfo &Output,
6189 const InputInfoList &Inputs,
6190 const ArgList &Args,
6191 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006192 const ToolChain &ToolChain = getToolChain();
6193 const Driver &D = ToolChain.getDriver();
6194 ArgStringList CmdArgs;
6195
6196 // Silence warning for "clang -g foo.o -o foo"
6197 Args.ClaimAllArgs(options::OPT_g_Group);
6198 // and "clang -emit-llvm foo.o -o foo"
6199 Args.ClaimAllArgs(options::OPT_emit_llvm);
6200 // and for "clang -w foo.o -o foo". Other warning options are already
6201 // handled somewhere else.
6202 Args.ClaimAllArgs(options::OPT_w);
6203
6204 if (!D.SysRoot.empty())
6205 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6206
6207 // CloudABI only supports static linkage.
6208 CmdArgs.push_back("-Bstatic");
6209 CmdArgs.push_back("--eh-frame-hdr");
6210 CmdArgs.push_back("--gc-sections");
6211
6212 if (Output.isFilename()) {
6213 CmdArgs.push_back("-o");
6214 CmdArgs.push_back(Output.getFilename());
6215 } else {
6216 assert(Output.isNothing() && "Invalid output.");
6217 }
6218
6219 if (!Args.hasArg(options::OPT_nostdlib) &&
6220 !Args.hasArg(options::OPT_nostartfiles)) {
6221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6222 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6223 }
6224
6225 Args.AddAllArgs(CmdArgs, options::OPT_L);
6226 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6227 for (const auto &Path : Paths)
6228 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006229 Args.AddAllArgs(CmdArgs,
6230 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6231 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006232
Alexey Samsonov907880e2015-06-19 19:57:46 +00006233 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006234 AddGoldPlugin(ToolChain, Args, CmdArgs);
6235
6236 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6237
6238 if (!Args.hasArg(options::OPT_nostdlib) &&
6239 !Args.hasArg(options::OPT_nodefaultlibs)) {
6240 if (D.CCCIsCXX())
6241 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6242 CmdArgs.push_back("-lc");
6243 CmdArgs.push_back("-lcompiler_rt");
6244 }
6245
6246 if (!Args.hasArg(options::OPT_nostdlib) &&
6247 !Args.hasArg(options::OPT_nostartfiles))
6248 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6249
6250 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006251 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006252}
6253
Douglas Katzman95354292015-06-23 20:42:09 +00006254void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6255 const InputInfo &Output,
6256 const InputInfoList &Inputs,
6257 const ArgList &Args,
6258 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006259 ArgStringList CmdArgs;
6260
6261 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6262 const InputInfo &Input = Inputs[0];
6263
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006264 // Determine the original source input.
6265 const Action *SourceAction = &JA;
6266 while (SourceAction->getKind() != Action::InputClass) {
6267 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6268 SourceAction = SourceAction->getInputs()[0];
6269 }
6270
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006271 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006272 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006273 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6274 // FIXME: at run-time detect assembler capabilities or rely on version
6275 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006276 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006277 const llvm::Triple &T(getToolChain().getTriple());
6278 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006279 CmdArgs.push_back("-Q");
6280 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006281
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006282 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006283 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006284 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006285 if (Args.hasArg(options::OPT_gstabs))
6286 CmdArgs.push_back("--gstabs");
6287 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006288 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006289 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006290
Daniel Dunbarbe220842009-03-20 16:06:39 +00006291 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006292 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006293
Daniel Dunbar6d484762010-07-22 01:47:22 +00006294 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006295 if (getToolChain().getArch() == llvm::Triple::x86 ||
6296 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006297 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6298 CmdArgs.push_back("-force_cpusubtype_ALL");
6299
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006300 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006301 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006302 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006303 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006304 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006305 CmdArgs.push_back("-static");
6306
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006307 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006308
6309 assert(Output.isFilename() && "Unexpected lipo output.");
6310 CmdArgs.push_back("-o");
6311 CmdArgs.push_back(Output.getFilename());
6312
Daniel Dunbarb440f562010-08-02 02:38:21 +00006313 assert(Input.isFilename() && "Invalid input.");
6314 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006315
6316 // asm_final spec is empty.
6317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006318 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006319 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006320}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006321
Tim Northover157d9112014-01-16 08:48:16 +00006322void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006323
Tim Northover157d9112014-01-16 08:48:16 +00006324void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6325 ArgStringList &CmdArgs) const {
6326 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006327
Daniel Dunbarc1964212009-03-26 16:23:12 +00006328 // Derived from darwin_arch spec.
6329 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006330 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006331
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006332 // FIXME: Is this needed anymore?
6333 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006334 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006335}
6336
Douglas Katzman95354292015-06-23 20:42:09 +00006337bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006338 // We only need to generate a temp path for LTO if we aren't compiling object
6339 // files. When compiling source files, we run 'dsymutil' after linking. We
6340 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006341 for (const auto &Input : Inputs)
6342 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006343 return true;
6344
6345 return false;
6346}
6347
Douglas Katzman95354292015-06-23 20:42:09 +00006348void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6349 ArgStringList &CmdArgs,
6350 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006351 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006352 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006354 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006355 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6356 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006357 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6358 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006359 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006360 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006361 }
6362
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006363 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006364 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006365 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6366 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006367
Bob Wilson3d27dad2013-08-02 22:25:34 +00006368 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6369 CmdArgs.push_back("-export_dynamic");
6370
Bob Wilsonb111ec92015-03-02 19:01:14 +00006371 // If we are using App Extension restrictions, pass a flag to the linker
6372 // telling it that the compiled code has been audited.
6373 if (Args.hasFlag(options::OPT_fapplication_extension,
6374 options::OPT_fno_application_extension, false))
6375 CmdArgs.push_back("-application_extension");
6376
Bill Wendling313b6bf2012-11-16 23:03:00 +00006377 // If we are using LTO, then automatically create a temporary file path for
6378 // the linker to use, so that it's lifetime will extend past a possible
6379 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006380 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006381 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006382 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006383 C.addTempFile(TmpPath);
6384 CmdArgs.push_back("-object_path_lto");
6385 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006386 }
6387
Daniel Dunbarc1964212009-03-26 16:23:12 +00006388 // Derived from the "link" spec.
6389 Args.AddAllArgs(CmdArgs, options::OPT_static);
6390 if (!Args.hasArg(options::OPT_static))
6391 CmdArgs.push_back("-dynamic");
6392 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6393 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6394 // here. How do we wish to handle such things?
6395 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006396
Daniel Dunbarc1964212009-03-26 16:23:12 +00006397 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006398 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006399 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006400 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006401
6402 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6403 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6404 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6405
6406 Arg *A;
6407 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6408 (A = Args.getLastArg(options::OPT_current__version)) ||
6409 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006410 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6411 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006412
6413 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6414 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6415 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6416 } else {
6417 CmdArgs.push_back("-dylib");
6418
6419 Arg *A;
6420 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6421 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6422 (A = Args.getLastArg(options::OPT_client__name)) ||
6423 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6424 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6425 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006426 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6427 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006428
Daniel Dunbarc1964212009-03-26 16:23:12 +00006429 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6430 "-dylib_compatibility_version");
6431 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6432 "-dylib_current_version");
6433
Tim Northover157d9112014-01-16 08:48:16 +00006434 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006435
6436 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6437 "-dylib_install_name");
6438 }
6439
6440 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6441 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6442 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006443 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006444 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006445 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6446 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6447 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6448 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6449 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6450 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006451 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006452 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6453 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6454 Args.AddAllArgs(CmdArgs, options::OPT_init);
6455
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006456 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006457 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006458
Daniel Dunbarc1964212009-03-26 16:23:12 +00006459 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6460 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6461 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6462 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6463 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006464
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006465 if (const Arg *A =
6466 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6467 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006468 if (A->getOption().matches(options::OPT_fpie) ||
6469 A->getOption().matches(options::OPT_fPIE))
6470 CmdArgs.push_back("-pie");
6471 else
6472 CmdArgs.push_back("-no_pie");
6473 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006474
6475 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6476 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6477 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6478 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6479 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6480 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6481 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6482 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6483 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6484 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6485 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6486 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6487 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6488 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6489 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6490 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006491
Daniel Dunbar84384642011-05-02 21:03:47 +00006492 // Give --sysroot= preference, over the Apple specific behavior to also use
6493 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006494 StringRef sysroot = C.getSysRoot();
6495 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006496 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006497 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006498 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6499 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006500 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006501 }
6502
Daniel Dunbarc1964212009-03-26 16:23:12 +00006503 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6504 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6505 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6506 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6507 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006508 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006509 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6510 Args.AddAllArgs(CmdArgs, options::OPT_y);
6511 Args.AddLastArg(CmdArgs, options::OPT_w);
6512 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6513 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6514 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6515 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6516 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6517 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6518 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6519 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6520 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6521 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6522 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6523 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6524}
6525
Douglas Katzman95354292015-06-23 20:42:09 +00006526void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6527 const InputInfo &Output,
6528 const InputInfoList &Inputs,
6529 const ArgList &Args,
6530 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006531 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006532
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006533 // If the number of arguments surpasses the system limits, we will encode the
6534 // input files in a separate file, shortening the command line. To this end,
6535 // build a list of input file names that can be passed via a file with the
6536 // -filelist linker option.
6537 llvm::opt::ArgStringList InputFileList;
6538
Daniel Dunbarc1964212009-03-26 16:23:12 +00006539 // The logic here is derived from gcc's behavior; most of which
6540 // comes from specs (starting with link_command). Consult gcc for
6541 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006542 ArgStringList CmdArgs;
6543
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006544 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6545 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6546 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006547 for (const auto &Arg : Args)
6548 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006549 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006550 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006551 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006552 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006553 return;
6554 }
6555
Daniel Dunbarc1964212009-03-26 16:23:12 +00006556 // I'm not sure why this particular decomposition exists in gcc, but
6557 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006558 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006559
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006560 // It seems that the 'e' option is completely ignored for dynamic executables
6561 // (the default), and with static executables, the last one wins, as expected.
6562 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6563 options::OPT_Z_Flag, options::OPT_u_Group,
6564 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006565
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006566 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6567 // members of static archive libraries which implement Objective-C classes or
6568 // categories.
6569 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6570 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006571
Daniel Dunbarc1964212009-03-26 16:23:12 +00006572 CmdArgs.push_back("-o");
6573 CmdArgs.push_back(Output.getFilename());
6574
Chad Rosier06fd3c62012-05-16 23:45:12 +00006575 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006576 !Args.hasArg(options::OPT_nostartfiles))
6577 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006578
Peter Collingbournec4122c12015-06-15 21:08:13 +00006579 // SafeStack requires its own runtime libraries
6580 // These libraries should be linked first, to make sure the
6581 // __safestack_init constructor executes before everything else
6582 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6583 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6584 "libclang_rt.safestack_osx.a",
6585 /*AlwaysLink=*/true);
6586 }
6587
Daniel Dunbarc1964212009-03-26 16:23:12 +00006588 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006589
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006590 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6591 options::OPT_fno_openmp, false)) {
6592 switch (getOpenMPRuntime(getToolChain(), Args)) {
6593 case OMPRT_OMP:
6594 CmdArgs.push_back("-lomp");
6595 break;
6596 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006597 CmdArgs.push_back("-lgomp");
6598 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006599 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006600 CmdArgs.push_back("-liomp5");
6601 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006602 case OMPRT_Unknown:
6603 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006604 break;
6605 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006606 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006607
Douglas Gregor9295df02012-05-15 21:00:27 +00006608 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006609 // Build the input file for -filelist (list of linker input files) in case we
6610 // need it later
6611 for (const auto &II : Inputs) {
6612 if (!II.isFilename()) {
6613 // This is a linker input argument.
6614 // We cannot mix input arguments and file names in a -filelist input, thus
6615 // we prematurely stop our list (remaining files shall be passed as
6616 // arguments).
6617 if (InputFileList.size() > 0)
6618 break;
6619
6620 continue;
6621 }
6622
6623 InputFileList.push_back(II.getFilename());
6624 }
6625
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006626 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006627 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006628 // We use arclite library for both ARC and subscripting support.
6629 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6630
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006631 CmdArgs.push_back("-framework");
6632 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006633 // Link libobj.
6634 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006635 }
John McCall31168b02011-06-15 23:02:42 +00006636
Daniel Dunbarc1964212009-03-26 16:23:12 +00006637 if (LinkingOutput) {
6638 CmdArgs.push_back("-arch_multiple");
6639 CmdArgs.push_back("-final_output");
6640 CmdArgs.push_back(LinkingOutput);
6641 }
6642
Daniel Dunbarc1964212009-03-26 16:23:12 +00006643 if (Args.hasArg(options::OPT_fnested_functions))
6644 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006645
Justin Bognerc7701242015-05-12 05:44:36 +00006646 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6647 // paths are different enough from other toolchains that this needs a fair
6648 // amount of refactoring done first.
6649 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6650
Daniel Dunbarc1964212009-03-26 16:23:12 +00006651 if (!Args.hasArg(options::OPT_nostdlib) &&
6652 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006653 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006654 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006655
Daniel Dunbarc1964212009-03-26 16:23:12 +00006656 // link_ssp spec is empty.
6657
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006658 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006659 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006660 }
6661
Chad Rosier06fd3c62012-05-16 23:45:12 +00006662 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006663 !Args.hasArg(options::OPT_nostartfiles)) {
6664 // endfile_spec is empty.
6665 }
6666
6667 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6668 Args.AddAllArgs(CmdArgs, options::OPT_F);
6669
Steven Wu3ffb61b2015-02-06 18:08:29 +00006670 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006671 for (const Arg *A : Args.filtered(options::OPT_iframework))
6672 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006673
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006674 if (!Args.hasArg(options::OPT_nostdlib) &&
6675 !Args.hasArg(options::OPT_nodefaultlibs)) {
6676 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6677 if (A->getValue() == StringRef("Accelerate")) {
6678 CmdArgs.push_back("-framework");
6679 CmdArgs.push_back("Accelerate");
6680 }
6681 }
6682 }
6683
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006684 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006685 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006686 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006687 Cmd->setInputFileList(std::move(InputFileList));
6688 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006689}
6690
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006691void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006692 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006693 const InputInfoList &Inputs,
6694 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006695 const char *LinkingOutput) const {
6696 ArgStringList CmdArgs;
6697
6698 CmdArgs.push_back("-create");
6699 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006700
6701 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006702 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006703
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006704 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006705 assert(II.isFilename() && "Unexpected lipo input.");
6706 CmdArgs.push_back(II.getFilename());
6707 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006708
6709 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006710 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006711}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006712
Daniel Dunbar88299622010-06-04 18:28:36 +00006713void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006714 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006715 const InputInfoList &Inputs,
6716 const ArgList &Args,
6717 const char *LinkingOutput) const {
6718 ArgStringList CmdArgs;
6719
Daniel Dunbareb86b042011-05-09 17:23:16 +00006720 CmdArgs.push_back("-o");
6721 CmdArgs.push_back(Output.getFilename());
6722
Daniel Dunbar88299622010-06-04 18:28:36 +00006723 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6724 const InputInfo &Input = Inputs[0];
6725 assert(Input.isFilename() && "Unexpected dsymutil input.");
6726 CmdArgs.push_back(Input.getFilename());
6727
Daniel Dunbar88299622010-06-04 18:28:36 +00006728 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006729 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006730 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006731}
6732
Eric Christopher551ef452011-08-23 17:56:55 +00006733void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006734 const InputInfo &Output,
6735 const InputInfoList &Inputs,
6736 const ArgList &Args,
6737 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006738 ArgStringList CmdArgs;
6739 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006740 CmdArgs.push_back("--debug-info");
6741 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006742 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006743
6744 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6745 const InputInfo &Input = Inputs[0];
6746 assert(Input.isFilename() && "Unexpected verify input");
6747
6748 // Grabbing the output of the earlier dsymutil run.
6749 CmdArgs.push_back(Input.getFilename());
6750
6751 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006752 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006754}
6755
Douglas Katzman95354292015-06-23 20:42:09 +00006756void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006757 const InputInfo &Output,
6758 const InputInfoList &Inputs,
6759 const ArgList &Args,
6760 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006761 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006762 ArgStringList CmdArgs;
6763
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006764 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006765
6766 CmdArgs.push_back("-o");
6767 CmdArgs.push_back(Output.getFilename());
6768
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006769 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006770 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006771
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006772 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006773 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006774}
6775
Douglas Katzman95354292015-06-23 20:42:09 +00006776void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6777 const InputInfo &Output,
6778 const InputInfoList &Inputs,
6779 const ArgList &Args,
6780 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006781 // FIXME: Find a real GCC, don't hard-code versions here
6782 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6783 const llvm::Triple &T = getToolChain().getTriple();
6784 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006785 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006786 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006787 case llvm::Triple::x86:
6788 GCCLibPath +=
6789 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6790 break;
6791 case llvm::Triple::x86_64:
6792 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6793 GCCLibPath += "/4.5.2/amd64/";
6794 LibPath += "amd64/";
6795 break;
6796 default:
6797 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006798 }
6799
6800 ArgStringList CmdArgs;
6801
David Chisnall272a0712012-02-29 15:06:12 +00006802 // Demangle C++ names in errors
6803 CmdArgs.push_back("-C");
6804
David Chisnallf571cde2012-02-15 13:39:01 +00006805 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6806 (!Args.hasArg(options::OPT_shared))) {
6807 CmdArgs.push_back("-e");
6808 CmdArgs.push_back("_start");
6809 }
6810
6811 if (Args.hasArg(options::OPT_static)) {
6812 CmdArgs.push_back("-Bstatic");
6813 CmdArgs.push_back("-dn");
6814 } else {
6815 CmdArgs.push_back("-Bdynamic");
6816 if (Args.hasArg(options::OPT_shared)) {
6817 CmdArgs.push_back("-shared");
6818 } else {
6819 CmdArgs.push_back("--dynamic-linker");
6820 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6821 }
6822 }
6823
6824 if (Output.isFilename()) {
6825 CmdArgs.push_back("-o");
6826 CmdArgs.push_back(Output.getFilename());
6827 } else {
6828 assert(Output.isNothing() && "Invalid output.");
6829 }
6830
6831 if (!Args.hasArg(options::OPT_nostdlib) &&
6832 !Args.hasArg(options::OPT_nostartfiles)) {
6833 if (!Args.hasArg(options::OPT_shared)) {
6834 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6835 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006836 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006837 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6838 } else {
6839 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006840 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6841 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006842 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006843 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006844 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006845 }
6846
6847 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6848
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006849 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6850 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006851
6852 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6853
6854 if (!Args.hasArg(options::OPT_nostdlib) &&
6855 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006856 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006857 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006858 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006859 if (!Args.hasArg(options::OPT_shared)) {
6860 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006861 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006862 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006863 }
David Chisnallf571cde2012-02-15 13:39:01 +00006864 }
6865
6866 if (!Args.hasArg(options::OPT_nostdlib) &&
6867 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006868 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006869 }
David Chisnall96de9932012-02-16 16:00:47 +00006870 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006871
Alexey Samsonov7811d192014-02-20 13:57:37 +00006872 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006873
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006874 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006875 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006876}
6877
Douglas Katzman95354292015-06-23 20:42:09 +00006878void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6879 const InputInfo &Output,
6880 const InputInfoList &Inputs,
6881 const ArgList &Args,
6882 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006883 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006884 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006885 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006886
Rafael Espindolacc126272014-02-28 01:55:21 +00006887 switch (getToolChain().getArch()) {
6888 case llvm::Triple::x86:
6889 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6890 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006891 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006892 break;
6893
6894 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006895 CmdArgs.push_back("-mppc");
6896 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006897 break;
6898
6899 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006900 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006901 CmdArgs.push_back("-32");
6902 NeedsKPIC = true;
6903 break;
6904
6905 case llvm::Triple::sparcv9:
6906 CmdArgs.push_back("-64");
6907 CmdArgs.push_back("-Av9a");
6908 NeedsKPIC = true;
6909 break;
6910
6911 case llvm::Triple::mips64:
6912 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006913 StringRef CPUName;
6914 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006915 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006916
6917 CmdArgs.push_back("-mabi");
6918 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6919
6920 if (getToolChain().getArch() == llvm::Triple::mips64)
6921 CmdArgs.push_back("-EB");
6922 else
6923 CmdArgs.push_back("-EL");
6924
Rafael Espindolacc126272014-02-28 01:55:21 +00006925 NeedsKPIC = true;
6926 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006927 }
6928
Rafael Espindolacc126272014-02-28 01:55:21 +00006929 default:
6930 break;
6931 }
6932
6933 if (NeedsKPIC)
6934 addAssemblerKPIC(Args, CmdArgs);
6935
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006936 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006937
6938 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006939 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006940
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006941 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006942 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006944 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006945 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006946}
6947
Douglas Katzman95354292015-06-23 20:42:09 +00006948void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6949 const InputInfo &Output,
6950 const InputInfoList &Inputs,
6951 const ArgList &Args,
6952 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006953 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006954 ArgStringList CmdArgs;
6955
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006956 // Silence warning for "clang -g foo.o -o foo"
6957 Args.ClaimAllArgs(options::OPT_g_Group);
6958 // and "clang -emit-llvm foo.o -o foo"
6959 Args.ClaimAllArgs(options::OPT_emit_llvm);
6960 // and for "clang -w foo.o -o foo". Other warning options are already
6961 // handled somewhere else.
6962 Args.ClaimAllArgs(options::OPT_w);
6963
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006964 if (getToolChain().getArch() == llvm::Triple::mips64)
6965 CmdArgs.push_back("-EB");
6966 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6967 CmdArgs.push_back("-EL");
6968
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006969 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006970 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006971 CmdArgs.push_back("-e");
6972 CmdArgs.push_back("__start");
6973 }
6974
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006975 if (Args.hasArg(options::OPT_static)) {
6976 CmdArgs.push_back("-Bstatic");
6977 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006978 if (Args.hasArg(options::OPT_rdynamic))
6979 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006980 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006981 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006982 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006983 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006984 } else {
6985 CmdArgs.push_back("-dynamic-linker");
6986 CmdArgs.push_back("/usr/libexec/ld.so");
6987 }
6988 }
6989
Rafael Espindola044f7832013-06-05 04:28:55 +00006990 if (Args.hasArg(options::OPT_nopie))
6991 CmdArgs.push_back("-nopie");
6992
Daniel Dunbarb440f562010-08-02 02:38:21 +00006993 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006994 CmdArgs.push_back("-o");
6995 CmdArgs.push_back(Output.getFilename());
6996 } else {
6997 assert(Output.isNothing() && "Invalid output.");
6998 }
6999
7000 if (!Args.hasArg(options::OPT_nostdlib) &&
7001 !Args.hasArg(options::OPT_nostartfiles)) {
7002 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007003 if (Args.hasArg(options::OPT_pg))
7004 CmdArgs.push_back(
7005 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007006 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007007 CmdArgs.push_back(
7008 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7009 CmdArgs.push_back(
7010 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007011 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007012 CmdArgs.push_back(
7013 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007014 }
7015 }
7016
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007017 std::string Triple = getToolChain().getTripleString();
7018 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007019 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007020 CmdArgs.push_back(
7021 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007022
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007023 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7024 options::OPT_e, options::OPT_s, options::OPT_t,
7025 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007026
Daniel Dunbar54423b22010-09-17 00:24:54 +00007027 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007028
7029 if (!Args.hasArg(options::OPT_nostdlib) &&
7030 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007031 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007032 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007033 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007034 CmdArgs.push_back("-lm_p");
7035 else
7036 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007037 }
7038
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007039 // FIXME: For some reason GCC passes -lgcc before adding
7040 // the default system libraries. Just mimic this for now.
7041 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007042
Eric Christopher17674ec2012-09-13 06:32:34 +00007043 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007044 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7045 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007046 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007047 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007048 }
7049
Chandler Carruth45661652011-12-17 22:32:42 +00007050 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007051 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007052 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007053 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007054 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007055 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007056
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007057 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007058 }
7059
7060 if (!Args.hasArg(options::OPT_nostdlib) &&
7061 !Args.hasArg(options::OPT_nostartfiles)) {
7062 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007063 CmdArgs.push_back(
7064 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007065 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007066 CmdArgs.push_back(
7067 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007068 }
7069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007070 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007071 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007072}
Ed Schoutene33194b2009-04-02 19:13:12 +00007073
Douglas Katzman95354292015-06-23 20:42:09 +00007074void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7075 const InputInfo &Output,
7076 const InputInfoList &Inputs,
7077 const ArgList &Args,
7078 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007079 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007080 ArgStringList CmdArgs;
7081
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007082 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007083
7084 CmdArgs.push_back("-o");
7085 CmdArgs.push_back(Output.getFilename());
7086
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007087 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007088 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007089
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007090 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007091 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007092}
7093
Douglas Katzman95354292015-06-23 20:42:09 +00007094void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7095 const InputInfo &Output,
7096 const InputInfoList &Inputs,
7097 const ArgList &Args,
7098 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007099 const Driver &D = getToolChain().getDriver();
7100 ArgStringList CmdArgs;
7101
7102 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7103 (!Args.hasArg(options::OPT_shared))) {
7104 CmdArgs.push_back("-e");
7105 CmdArgs.push_back("__start");
7106 }
7107
7108 if (Args.hasArg(options::OPT_static)) {
7109 CmdArgs.push_back("-Bstatic");
7110 } else {
7111 if (Args.hasArg(options::OPT_rdynamic))
7112 CmdArgs.push_back("-export-dynamic");
7113 CmdArgs.push_back("--eh-frame-hdr");
7114 CmdArgs.push_back("-Bdynamic");
7115 if (Args.hasArg(options::OPT_shared)) {
7116 CmdArgs.push_back("-shared");
7117 } else {
7118 CmdArgs.push_back("-dynamic-linker");
7119 CmdArgs.push_back("/usr/libexec/ld.so");
7120 }
7121 }
7122
7123 if (Output.isFilename()) {
7124 CmdArgs.push_back("-o");
7125 CmdArgs.push_back(Output.getFilename());
7126 } else {
7127 assert(Output.isNothing() && "Invalid output.");
7128 }
7129
7130 if (!Args.hasArg(options::OPT_nostdlib) &&
7131 !Args.hasArg(options::OPT_nostartfiles)) {
7132 if (!Args.hasArg(options::OPT_shared)) {
7133 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007134 CmdArgs.push_back(
7135 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007136 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007137 CmdArgs.push_back(
7138 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7139 CmdArgs.push_back(
7140 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007141 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007142 CmdArgs.push_back(
7143 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007144 }
7145 }
7146
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007147 Args.AddAllArgs(CmdArgs,
7148 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007149
7150 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7151
7152 if (!Args.hasArg(options::OPT_nostdlib) &&
7153 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007154 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007155 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7156 if (Args.hasArg(options::OPT_pg))
7157 CmdArgs.push_back("-lm_p");
7158 else
7159 CmdArgs.push_back("-lm");
7160 }
7161
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007162 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007163 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007164 CmdArgs.push_back("-lpthread_p");
7165 else
7166 CmdArgs.push_back("-lpthread");
7167 }
7168
Eli Friedman9fa28852012-08-08 23:57:20 +00007169 if (!Args.hasArg(options::OPT_shared)) {
7170 if (Args.hasArg(options::OPT_pg))
7171 CmdArgs.push_back("-lc_p");
7172 else
7173 CmdArgs.push_back("-lc");
7174 }
7175
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007176 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007177 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007178 case llvm::Triple::arm:
7179 MyArch = "arm";
7180 break;
7181 case llvm::Triple::x86:
7182 MyArch = "i386";
7183 break;
7184 case llvm::Triple::x86_64:
7185 MyArch = "amd64";
7186 break;
7187 default:
7188 llvm_unreachable("Unsupported architecture");
7189 }
7190 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007191 }
7192
7193 if (!Args.hasArg(options::OPT_nostdlib) &&
7194 !Args.hasArg(options::OPT_nostartfiles)) {
7195 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007196 CmdArgs.push_back(
7197 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007198 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007199 CmdArgs.push_back(
7200 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007201 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007202
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007203 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007204 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007205}
7206
Douglas Katzman95354292015-06-23 20:42:09 +00007207void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7208 const InputInfo &Output,
7209 const InputInfoList &Inputs,
7210 const ArgList &Args,
7211 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007212 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007213 ArgStringList CmdArgs;
7214
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007215 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7216 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007217 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007218 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007219 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007220 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007221 else if (getToolChain().getArch() == llvm::Triple::mips ||
7222 getToolChain().getArch() == llvm::Triple::mipsel ||
7223 getToolChain().getArch() == llvm::Triple::mips64 ||
7224 getToolChain().getArch() == llvm::Triple::mips64el) {
7225 StringRef CPUName;
7226 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007227 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007228
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007229 CmdArgs.push_back("-march");
7230 CmdArgs.push_back(CPUName.data());
7231
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007232 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007233 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007234
7235 if (getToolChain().getArch() == llvm::Triple::mips ||
7236 getToolChain().getArch() == llvm::Triple::mips64)
7237 CmdArgs.push_back("-EB");
7238 else
7239 CmdArgs.push_back("-EL");
7240
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007241 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007242 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007243 getToolChain().getArch() == llvm::Triple::armeb ||
7244 getToolChain().getArch() == llvm::Triple::thumb ||
7245 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007246 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007247 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007248 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7249
7250 if (FloatABI == "hard") {
7251 CmdArgs.push_back("-mfpu=vfp");
7252 } else {
7253 CmdArgs.push_back("-mfpu=softvfp");
7254 }
7255
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007256 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007257 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007258 case llvm::Triple::GNUEABI:
7259 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007260 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007261 break;
7262
7263 default:
7264 CmdArgs.push_back("-matpcs");
7265 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007266 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007267 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007268 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007269 if (getToolChain().getArch() == llvm::Triple::sparc)
7270 CmdArgs.push_back("-Av8plusa");
7271 else
7272 CmdArgs.push_back("-Av9a");
7273
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007274 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007275 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007276
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007277 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007278
7279 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007280 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007281
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007282 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007283 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007284
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007285 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007286 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007287}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007288
Douglas Katzman95354292015-06-23 20:42:09 +00007289void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7290 const InputInfo &Output,
7291 const InputInfoList &Inputs,
7292 const ArgList &Args,
7293 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007294 const toolchains::FreeBSD &ToolChain =
7295 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007296 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007297 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007298 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007299 !Args.hasArg(options::OPT_shared) &&
7300 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007301 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007302
7303 // Silence warning for "clang -g foo.o -o foo"
7304 Args.ClaimAllArgs(options::OPT_g_Group);
7305 // and "clang -emit-llvm foo.o -o foo"
7306 Args.ClaimAllArgs(options::OPT_emit_llvm);
7307 // and for "clang -w foo.o -o foo". Other warning options are already
7308 // handled somewhere else.
7309 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007310
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007311 if (!D.SysRoot.empty())
7312 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7313
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007314 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007315 CmdArgs.push_back("-pie");
7316
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007317 if (Args.hasArg(options::OPT_static)) {
7318 CmdArgs.push_back("-Bstatic");
7319 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007320 if (Args.hasArg(options::OPT_rdynamic))
7321 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007322 CmdArgs.push_back("--eh-frame-hdr");
7323 if (Args.hasArg(options::OPT_shared)) {
7324 CmdArgs.push_back("-Bshareable");
7325 } else {
7326 CmdArgs.push_back("-dynamic-linker");
7327 CmdArgs.push_back("/libexec/ld-elf.so.1");
7328 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007329 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007330 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7331 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7332 CmdArgs.push_back("--hash-style=both");
7333 }
7334 }
7335 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007336 }
7337
7338 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7339 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007340 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007341 CmdArgs.push_back("-m");
7342 CmdArgs.push_back("elf_i386_fbsd");
7343 }
7344
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007345 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007346 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007347 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007348 }
7349
Daniel Dunbarb440f562010-08-02 02:38:21 +00007350 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007351 CmdArgs.push_back("-o");
7352 CmdArgs.push_back(Output.getFilename());
7353 } else {
7354 assert(Output.isNothing() && "Invalid output.");
7355 }
7356
7357 if (!Args.hasArg(options::OPT_nostdlib) &&
7358 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007359 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007360 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007361 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007362 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007363 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007364 crt1 = "Scrt1.o";
7365 else
7366 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007367 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007368 if (crt1)
7369 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7370
7371 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7372
Craig Topper92fc2df2014-05-17 16:56:41 +00007373 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007374 if (Args.hasArg(options::OPT_static))
7375 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007376 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007377 crtbegin = "crtbeginS.o";
7378 else
7379 crtbegin = "crtbegin.o";
7380
7381 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007382 }
7383
7384 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007385 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007386 for (const auto &Path : Paths)
7387 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007388 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7389 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007390 Args.AddAllArgs(CmdArgs, options::OPT_s);
7391 Args.AddAllArgs(CmdArgs, options::OPT_t);
7392 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7393 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007394
Alexey Samsonov907880e2015-06-19 19:57:46 +00007395 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007396 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007397
Alexey Samsonov52550342014-09-15 19:58:40 +00007398 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007399 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007400
7401 if (!Args.hasArg(options::OPT_nostdlib) &&
7402 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007403 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007404 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007405 if (Args.hasArg(options::OPT_pg))
7406 CmdArgs.push_back("-lm_p");
7407 else
7408 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007409 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007410 if (NeedsSanitizerDeps)
7411 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007412 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7413 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007414 if (Args.hasArg(options::OPT_pg))
7415 CmdArgs.push_back("-lgcc_p");
7416 else
7417 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007418 if (Args.hasArg(options::OPT_static)) {
7419 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007420 } else if (Args.hasArg(options::OPT_pg)) {
7421 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007422 } else {
7423 CmdArgs.push_back("--as-needed");
7424 CmdArgs.push_back("-lgcc_s");
7425 CmdArgs.push_back("--no-as-needed");
7426 }
7427
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007428 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007429 if (Args.hasArg(options::OPT_pg))
7430 CmdArgs.push_back("-lpthread_p");
7431 else
7432 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007433 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007434
Roman Divacky66f22762011-02-10 16:59:40 +00007435 if (Args.hasArg(options::OPT_pg)) {
7436 if (Args.hasArg(options::OPT_shared))
7437 CmdArgs.push_back("-lc");
7438 else
7439 CmdArgs.push_back("-lc_p");
7440 CmdArgs.push_back("-lgcc_p");
7441 } else {
7442 CmdArgs.push_back("-lc");
7443 CmdArgs.push_back("-lgcc");
7444 }
7445
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007446 if (Args.hasArg(options::OPT_static)) {
7447 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007448 } else if (Args.hasArg(options::OPT_pg)) {
7449 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007450 } else {
7451 CmdArgs.push_back("--as-needed");
7452 CmdArgs.push_back("-lgcc_s");
7453 CmdArgs.push_back("--no-as-needed");
7454 }
7455 }
7456
7457 if (!Args.hasArg(options::OPT_nostdlib) &&
7458 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007459 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007460 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007461 else
7462 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007463 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007464 }
7465
Alexey Samsonov7811d192014-02-20 13:57:37 +00007466 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007467
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007468 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007469 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007470}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007471
Douglas Katzman95354292015-06-23 20:42:09 +00007472void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007473 const InputInfo &Output,
7474 const InputInfoList &Inputs,
7475 const ArgList &Args,
7476 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007477 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007478 ArgStringList CmdArgs;
7479
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007480 // GNU as needs different flags for creating the correct output format
7481 // on architectures with different ABIs or optional feature sets.
7482 switch (getToolChain().getArch()) {
7483 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007484 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007485 break;
7486 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007487 case llvm::Triple::armeb:
7488 case llvm::Triple::thumb:
7489 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007490 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007491 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7492 std::string Arch =
7493 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007494 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007495 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007496 }
7497
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007498 case llvm::Triple::mips:
7499 case llvm::Triple::mipsel:
7500 case llvm::Triple::mips64:
7501 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007502 StringRef CPUName;
7503 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007504 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007505
7506 CmdArgs.push_back("-march");
7507 CmdArgs.push_back(CPUName.data());
7508
7509 CmdArgs.push_back("-mabi");
7510 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7511
7512 if (getToolChain().getArch() == llvm::Triple::mips ||
7513 getToolChain().getArch() == llvm::Triple::mips64)
7514 CmdArgs.push_back("-EB");
7515 else
7516 CmdArgs.push_back("-EL");
7517
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007518 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007519 break;
7520 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007521
7522 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007523 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007524 CmdArgs.push_back("-32");
7525 addAssemblerKPIC(Args, CmdArgs);
7526 break;
7527
7528 case llvm::Triple::sparcv9:
7529 CmdArgs.push_back("-64");
7530 CmdArgs.push_back("-Av9");
7531 addAssemblerKPIC(Args, CmdArgs);
7532 break;
7533
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007534 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007535 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007536 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007537
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007538 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007539
7540 CmdArgs.push_back("-o");
7541 CmdArgs.push_back(Output.getFilename());
7542
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007543 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007544 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007545
David Chisnallddbd68f2011-09-27 22:03:18 +00007546 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007547 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007548}
7549
Douglas Katzman95354292015-06-23 20:42:09 +00007550void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7551 const InputInfo &Output,
7552 const InputInfoList &Inputs,
7553 const ArgList &Args,
7554 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007555 const Driver &D = getToolChain().getDriver();
7556 ArgStringList CmdArgs;
7557
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007558 if (!D.SysRoot.empty())
7559 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7560
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007561 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007562 if (Args.hasArg(options::OPT_static)) {
7563 CmdArgs.push_back("-Bstatic");
7564 } else {
7565 if (Args.hasArg(options::OPT_rdynamic))
7566 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007567 if (Args.hasArg(options::OPT_shared)) {
7568 CmdArgs.push_back("-Bshareable");
7569 } else {
7570 CmdArgs.push_back("-dynamic-linker");
7571 CmdArgs.push_back("/libexec/ld.elf_so");
7572 }
7573 }
7574
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007575 // Many NetBSD architectures support more than one ABI.
7576 // Determine the correct emulation for ld.
7577 switch (getToolChain().getArch()) {
7578 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007579 CmdArgs.push_back("-m");
7580 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007581 break;
7582 case llvm::Triple::arm:
7583 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007584 CmdArgs.push_back("-m");
7585 switch (getToolChain().getTriple().getEnvironment()) {
7586 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007587 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007588 CmdArgs.push_back("armelf_nbsd_eabi");
7589 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007590 case llvm::Triple::EABIHF:
7591 case llvm::Triple::GNUEABIHF:
7592 CmdArgs.push_back("armelf_nbsd_eabihf");
7593 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007594 default:
7595 CmdArgs.push_back("armelf_nbsd");
7596 break;
7597 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007598 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007599 case llvm::Triple::armeb:
7600 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007601 arm::appendEBLinkFlags(
7602 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007603 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007604 CmdArgs.push_back("-m");
7605 switch (getToolChain().getTriple().getEnvironment()) {
7606 case llvm::Triple::EABI:
7607 case llvm::Triple::GNUEABI:
7608 CmdArgs.push_back("armelfb_nbsd_eabi");
7609 break;
7610 case llvm::Triple::EABIHF:
7611 case llvm::Triple::GNUEABIHF:
7612 CmdArgs.push_back("armelfb_nbsd_eabihf");
7613 break;
7614 default:
7615 CmdArgs.push_back("armelfb_nbsd");
7616 break;
7617 }
7618 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007619 case llvm::Triple::mips64:
7620 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007621 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007622 CmdArgs.push_back("-m");
7623 if (getToolChain().getArch() == llvm::Triple::mips64)
7624 CmdArgs.push_back("elf32btsmip");
7625 else
7626 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007627 } else if (mips::hasMipsAbiArg(Args, "64")) {
7628 CmdArgs.push_back("-m");
7629 if (getToolChain().getArch() == llvm::Triple::mips64)
7630 CmdArgs.push_back("elf64btsmip");
7631 else
7632 CmdArgs.push_back("elf64ltsmip");
7633 }
7634 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007635 case llvm::Triple::ppc:
7636 CmdArgs.push_back("-m");
7637 CmdArgs.push_back("elf32ppc_nbsd");
7638 break;
7639
7640 case llvm::Triple::ppc64:
7641 case llvm::Triple::ppc64le:
7642 CmdArgs.push_back("-m");
7643 CmdArgs.push_back("elf64ppc");
7644 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007645
7646 case llvm::Triple::sparc:
7647 CmdArgs.push_back("-m");
7648 CmdArgs.push_back("elf32_sparc");
7649 break;
7650
7651 case llvm::Triple::sparcv9:
7652 CmdArgs.push_back("-m");
7653 CmdArgs.push_back("elf64_sparc");
7654 break;
7655
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007656 default:
7657 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007658 }
7659
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007660 if (Output.isFilename()) {
7661 CmdArgs.push_back("-o");
7662 CmdArgs.push_back(Output.getFilename());
7663 } else {
7664 assert(Output.isNothing() && "Invalid output.");
7665 }
7666
7667 if (!Args.hasArg(options::OPT_nostdlib) &&
7668 !Args.hasArg(options::OPT_nostartfiles)) {
7669 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007670 CmdArgs.push_back(
7671 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7672 CmdArgs.push_back(
7673 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7674 CmdArgs.push_back(
7675 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007676 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007677 CmdArgs.push_back(
7678 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7679 CmdArgs.push_back(
7680 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007681 }
7682 }
7683
7684 Args.AddAllArgs(CmdArgs, options::OPT_L);
7685 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7686 Args.AddAllArgs(CmdArgs, options::OPT_e);
7687 Args.AddAllArgs(CmdArgs, options::OPT_s);
7688 Args.AddAllArgs(CmdArgs, options::OPT_t);
7689 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7690 Args.AddAllArgs(CmdArgs, options::OPT_r);
7691
7692 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7693
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007694 unsigned Major, Minor, Micro;
7695 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7696 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007697 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007698 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007699 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007700 case llvm::Triple::arm:
7701 case llvm::Triple::armeb:
7702 case llvm::Triple::thumb:
7703 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007704 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007705 case llvm::Triple::ppc64:
7706 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007707 case llvm::Triple::x86:
7708 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007709 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007710 break;
7711 default:
7712 break;
7713 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007714 }
7715
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007716 if (!Args.hasArg(options::OPT_nostdlib) &&
7717 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007718 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007719 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7720 CmdArgs.push_back("-lm");
7721 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007722 if (Args.hasArg(options::OPT_pthread))
7723 CmdArgs.push_back("-lpthread");
7724 CmdArgs.push_back("-lc");
7725
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007726 if (useLibgcc) {
7727 if (Args.hasArg(options::OPT_static)) {
7728 // libgcc_eh depends on libc, so resolve as much as possible,
7729 // pull in any new requirements from libc and then get the rest
7730 // of libgcc.
7731 CmdArgs.push_back("-lgcc_eh");
7732 CmdArgs.push_back("-lc");
7733 CmdArgs.push_back("-lgcc");
7734 } else {
7735 CmdArgs.push_back("-lgcc");
7736 CmdArgs.push_back("--as-needed");
7737 CmdArgs.push_back("-lgcc_s");
7738 CmdArgs.push_back("--no-as-needed");
7739 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007740 }
7741 }
7742
7743 if (!Args.hasArg(options::OPT_nostdlib) &&
7744 !Args.hasArg(options::OPT_nostartfiles)) {
7745 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007746 CmdArgs.push_back(
7747 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007748 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007749 CmdArgs.push_back(
7750 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7751 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007752 }
7753
Alexey Samsonov7811d192014-02-20 13:57:37 +00007754 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007755
Logan Chieneb9162f2014-06-26 14:23:45 +00007756 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007757 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007758}
7759
Douglas Katzman95354292015-06-23 20:42:09 +00007760void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7761 const InputInfo &Output,
7762 const InputInfoList &Inputs,
7763 const ArgList &Args,
7764 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007765 claimNoWarnArgs(Args);
7766
Rafael Espindola92b00932010-08-10 00:25:48 +00007767 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007768 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007769
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007770 switch (getToolChain().getArch()) {
7771 default:
7772 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007773 // Add --32/--64 to make sure we get the format we want.
7774 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007775 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007776 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007777 break;
7778 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007779 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7780 CmdArgs.push_back("--x32");
7781 else
7782 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007783 break;
7784 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007785 CmdArgs.push_back("-a32");
7786 CmdArgs.push_back("-mppc");
7787 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007788 break;
7789 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007790 CmdArgs.push_back("-a64");
7791 CmdArgs.push_back("-mppc64");
7792 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007793 break;
7794 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007795 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007796 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007797 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007798 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007799 break;
7800 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007801 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007802 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007803 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007804 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007805 break;
7806 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007807 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007808 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007809 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007810 break;
7811 case llvm::Triple::arm:
7812 case llvm::Triple::armeb:
7813 case llvm::Triple::thumb:
7814 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007815 const llvm::Triple &Triple = getToolChain().getTriple();
7816 switch (Triple.getSubArch()) {
7817 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007818 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007819 break;
7820 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007821 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007822 break;
7823 default:
7824 break;
7825 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007826
Tim Northover9c7e0352013-12-12 11:55:52 +00007827 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007828 getToolChain().getDriver(), Args,
7829 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007830 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007831
7832 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007833
7834 // FIXME: remove krait check when GNU tools support krait cpu
7835 // for now replace it with -march=armv7-a to avoid a lower
7836 // march from being picked in the absence of a cpu flag.
7837 Arg *A;
7838 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007839 StringRef(A->getValue()).lower() == "krait")
7840 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007841 else
7842 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007843 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007844 break;
7845 }
7846 case llvm::Triple::mips:
7847 case llvm::Triple::mipsel:
7848 case llvm::Triple::mips64:
7849 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007850 StringRef CPUName;
7851 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007852 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007853 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007854
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007855 CmdArgs.push_back("-march");
7856 CmdArgs.push_back(CPUName.data());
7857
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007858 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007859 CmdArgs.push_back(ABIName.data());
7860
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007861 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7862 // or -mshared (not implemented) is in effect.
7863 bool IsPicOrPie = false;
7864 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7865 options::OPT_fpic, options::OPT_fno_pic,
7866 options::OPT_fPIE, options::OPT_fno_PIE,
7867 options::OPT_fpie, options::OPT_fno_pie)) {
7868 if (A->getOption().matches(options::OPT_fPIC) ||
7869 A->getOption().matches(options::OPT_fpic) ||
7870 A->getOption().matches(options::OPT_fPIE) ||
7871 A->getOption().matches(options::OPT_fpie))
7872 IsPicOrPie = true;
7873 }
7874 if (!IsPicOrPie)
7875 CmdArgs.push_back("-mno-shared");
7876
Daniel Sanders379d44b2014-07-16 11:52:23 +00007877 // LLVM doesn't support -mplt yet and acts as if it is always given.
7878 // However, -mplt has no effect with the N64 ABI.
7879 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007880
7881 if (getToolChain().getArch() == llvm::Triple::mips ||
7882 getToolChain().getArch() == llvm::Triple::mips64)
7883 CmdArgs.push_back("-EB");
7884 else
7885 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007886
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007887 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7888 if (StringRef(A->getValue()) == "2008")
7889 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7890 }
7891
Daniel Sanders379d44b2014-07-16 11:52:23 +00007892 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007893 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007894 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7895 options::OPT_mfp64)) {
7896 A->claim();
7897 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007898 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7899 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007900 CmdArgs.push_back("-mfpxx");
7901
7902 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7903 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007904 if (Arg *A =
7905 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007906 if (A->getOption().matches(options::OPT_mips16)) {
7907 A->claim();
7908 A->render(Args, CmdArgs);
7909 } else {
7910 A->claim();
7911 CmdArgs.push_back("-no-mips16");
7912 }
7913 }
7914
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007915 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7916 options::OPT_mno_micromips);
7917 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7918 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7919
Simon Atanasyanbd986632013-11-26 11:58:04 +00007920 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7921 // Do not use AddLastArg because not all versions of MIPS assembler
7922 // support -mmsa / -mno-msa options.
7923 if (A->getOption().matches(options::OPT_mmsa))
7924 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7925 }
7926
Daniel Sanders379d44b2014-07-16 11:52:23 +00007927 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7928 options::OPT_msoft_float);
7929
Toma Tabacub36d6102015-06-11 12:13:18 +00007930 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7931 options::OPT_msingle_float);
7932
Daniel Sanders379d44b2014-07-16 11:52:23 +00007933 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7934 options::OPT_mno_odd_spreg);
7935
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007936 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007937 break;
7938 }
7939 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007940 // Always pass an -march option, since our default of z10 is later
7941 // than the GNU assembler's default.
7942 StringRef CPUName = getSystemZTargetCPU(Args);
7943 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007944 break;
7945 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007946 }
7947
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007948 if (NeedsKPIC)
7949 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007950
Renato Golina74bbc72015-07-22 15:32:36 +00007951 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007952 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007953
7954 CmdArgs.push_back("-o");
7955 CmdArgs.push_back(Output.getFilename());
7956
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007957 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007958 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007959
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007960 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007961 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007962
7963 // Handle the debug info splitting at object creation time if we're
7964 // creating an object.
7965 // TODO: Currently only works on linux with newer objcopy.
7966 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007967 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007968 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007969 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007970}
7971
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007972static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007973 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007974 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00007975 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007976 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7977 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007978 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007979 CmdArgs.push_back("-lgcc");
7980
Logan Chien3d3373c2012-11-19 12:04:11 +00007981 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007982 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007983 CmdArgs.push_back("-lgcc");
7984 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00007985 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007986 CmdArgs.push_back("--as-needed");
7987 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00007988 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007989 CmdArgs.push_back("--no-as-needed");
7990 }
7991
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007992 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007993 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007994 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007995 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007996
7997 // According to Android ABI, we have to link with libdl if we are
7998 // linking with non-static libgcc.
7999 //
8000 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8001 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8002 if (isAndroid && !StaticLibgcc)
8003 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008004}
8005
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008006static std::string getLinuxDynamicLinker(const ArgList &Args,
8007 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008008 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8009
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008010 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8011 if (ToolChain.getTriple().isArch64Bit())
8012 return "/system/bin/linker64";
8013 else
8014 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008015 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8016 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008017 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008018 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008019 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008020 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008021 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008022 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008023 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8024 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008025 return "/lib/ld-linux-armhf.so.3";
8026 else
8027 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008028 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8029 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008030 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8031 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008032 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008033 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008034 return "/lib/ld-linux.so.3";
8035 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8036 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008037 StringRef CPUName;
8038 StringRef ABIName;
8039 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8040 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8041
8042 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8043 .Case("o32", "/lib")
8044 .Case("n32", "/lib32")
8045 .Case("n64", "/lib64")
8046 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008047 StringRef LibName;
8048 if (mips::isUCLibc(Args))
8049 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8050 else
8051 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008052
8053 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008054 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008055 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008056 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008057 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8058 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008059 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008060 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008061 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8062 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008063 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008064 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00008065 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008066 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008067 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008068 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008069 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8070 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008071 else
8072 return "/lib64/ld-linux-x86-64.so.2";
8073}
8074
Renato Golinc4b49242014-02-13 10:01:16 +00008075static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008076 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008077 // Make use of compiler-rt if --rtlib option is used
8078 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8079
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008080 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008081 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008082 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008083 default:
8084 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008085 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008086 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008087 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008088 break;
8089 }
Renato Golinc4b49242014-02-13 10:01:16 +00008090 break;
8091 case ToolChain::RLT_Libgcc:
8092 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8093 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008094 }
8095}
8096
Rafael Espindola1e085772014-08-15 17:14:35 +00008097static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8098 switch (T.getArch()) {
8099 case llvm::Triple::x86:
8100 return "elf_i386";
8101 case llvm::Triple::aarch64:
8102 return "aarch64linux";
8103 case llvm::Triple::aarch64_be:
8104 return "aarch64_be_linux";
8105 case llvm::Triple::arm:
8106 case llvm::Triple::thumb:
8107 return "armelf_linux_eabi";
8108 case llvm::Triple::armeb:
8109 case llvm::Triple::thumbeb:
8110 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8111 case llvm::Triple::ppc:
8112 return "elf32ppclinux";
8113 case llvm::Triple::ppc64:
8114 return "elf64ppc";
8115 case llvm::Triple::ppc64le:
8116 return "elf64lppc";
8117 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008118 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008119 return "elf32_sparc";
8120 case llvm::Triple::sparcv9:
8121 return "elf64_sparc";
8122 case llvm::Triple::mips:
8123 return "elf32btsmip";
8124 case llvm::Triple::mipsel:
8125 return "elf32ltsmip";
8126 case llvm::Triple::mips64:
8127 if (mips::hasMipsAbiArg(Args, "n32"))
8128 return "elf32btsmipn32";
8129 return "elf64btsmip";
8130 case llvm::Triple::mips64el:
8131 if (mips::hasMipsAbiArg(Args, "n32"))
8132 return "elf32ltsmipn32";
8133 return "elf64ltsmip";
8134 case llvm::Triple::systemz:
8135 return "elf64_s390";
8136 case llvm::Triple::x86_64:
8137 if (T.getEnvironment() == llvm::Triple::GNUX32)
8138 return "elf32_x86_64";
8139 return "elf_x86_64";
8140 default:
8141 llvm_unreachable("Unexpected arch");
8142 }
8143}
8144
Douglas Katzman95354292015-06-23 20:42:09 +00008145void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8146 const InputInfo &Output,
8147 const InputInfoList &Inputs,
8148 const ArgList &Args,
8149 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008150 const toolchains::Linux &ToolChain =
8151 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008152 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008153 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008154 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008155 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008156 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008157 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8158 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008159
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008160 ArgStringList CmdArgs;
8161
Rafael Espindolad1002f62010-11-15 18:28:16 +00008162 // Silence warning for "clang -g foo.o -o foo"
8163 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008164 // and "clang -emit-llvm foo.o -o foo"
8165 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008166 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008167 // handled somewhere else.
8168 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008169
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008170 if (!D.SysRoot.empty())
8171 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008172
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008173 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008174 CmdArgs.push_back("-pie");
8175
Rafael Espindola1c76c592010-11-07 22:57:16 +00008176 if (Args.hasArg(options::OPT_rdynamic))
8177 CmdArgs.push_back("-export-dynamic");
8178
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008179 if (Args.hasArg(options::OPT_s))
8180 CmdArgs.push_back("-s");
8181
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008182 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
8183 arm::appendEBLinkFlags(
8184 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008185 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008186
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008187 for (const auto &Opt : ToolChain.ExtraOpts)
8188 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008189
8190 if (!Args.hasArg(options::OPT_static)) {
8191 CmdArgs.push_back("--eh-frame-hdr");
8192 }
8193
8194 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008195 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008196
8197 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008198 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8199 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008200 CmdArgs.push_back("-Bstatic");
8201 else
8202 CmdArgs.push_back("-static");
8203 } else if (Args.hasArg(options::OPT_shared)) {
8204 CmdArgs.push_back("-shared");
8205 }
8206
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008207 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8208 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008209 (!Args.hasArg(options::OPT_static) &&
8210 !Args.hasArg(options::OPT_shared))) {
8211 CmdArgs.push_back("-dynamic-linker");
8212 CmdArgs.push_back(Args.MakeArgString(
8213 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8214 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008215
8216 CmdArgs.push_back("-o");
8217 CmdArgs.push_back(Output.getFilename());
8218
Rafael Espindola81937ec2010-12-01 01:52:43 +00008219 if (!Args.hasArg(options::OPT_nostdlib) &&
8220 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008221 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008222 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008223 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008224 if (Args.hasArg(options::OPT_pg))
8225 crt1 = "gcrt1.o";
8226 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008227 crt1 = "Scrt1.o";
8228 else
8229 crt1 = "crt1.o";
8230 }
8231 if (crt1)
8232 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008233
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008234 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8235 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008236
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008237 const char *crtbegin;
8238 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008239 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008240 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008241 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008242 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008243 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008244 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008245 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008246 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008247
8248 // Add crtfastmath.o if available and fast math is enabled.
8249 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008250 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008251
8252 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008253 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008254
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008255 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008256
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008257 for (const auto &Path : Paths)
8258 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008259
Alexey Samsonov907880e2015-06-19 19:57:46 +00008260 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008261 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008262
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008263 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8264 CmdArgs.push_back("--no-demangle");
8265
Alexey Samsonov52550342014-09-15 19:58:40 +00008266 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008267 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008268 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008269 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008270
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008271 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008272 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008273 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008274 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008275 if (OnlyLibstdcxxStatic)
8276 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008277 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008278 if (OnlyLibstdcxxStatic)
8279 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008280 CmdArgs.push_back("-lm");
8281 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008282 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8283 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008284
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008285 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008286 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8287 if (Args.hasArg(options::OPT_static))
8288 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008289
Alexey Samsonov52550342014-09-15 19:58:40 +00008290 if (NeedsSanitizerDeps)
8291 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8292
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008293 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8294 Args.hasArg(options::OPT_pthreads);
8295
8296 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8297 options::OPT_fno_openmp, false)) {
8298 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8299 // FIXME: Does this really make sense for all GNU toolchains?
8300 WantPthread = true;
8301
8302 // Also link the particular OpenMP runtimes.
8303 switch (getOpenMPRuntime(ToolChain, Args)) {
8304 case OMPRT_OMP:
8305 CmdArgs.push_back("-lomp");
8306 break;
8307 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008308 CmdArgs.push_back("-lgomp");
8309
8310 // FIXME: Exclude this for platforms with libgomp that don't require
8311 // librt. Most modern Linux platforms require it, but some may not.
8312 CmdArgs.push_back("-lrt");
8313 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008314 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008315 CmdArgs.push_back("-liomp5");
8316 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008317 case OMPRT_Unknown:
8318 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008319 break;
8320 }
Chandler Carruth01538002013-01-17 13:19:29 +00008321 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008322
Renato Golinc4b49242014-02-13 10:01:16 +00008323 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008324
Richard Smith31d1de22015-05-20 22:48:44 +00008325 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008326 CmdArgs.push_back("-lpthread");
8327
8328 CmdArgs.push_back("-lc");
8329
8330 if (Args.hasArg(options::OPT_static))
8331 CmdArgs.push_back("--end-group");
8332 else
Renato Golinc4b49242014-02-13 10:01:16 +00008333 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008334 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008335
Rafael Espindola81937ec2010-12-01 01:52:43 +00008336 if (!Args.hasArg(options::OPT_nostartfiles)) {
8337 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008338 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008339 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008340 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008341 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008342 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008343 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008344
Rafael Espindola81937ec2010-12-01 01:52:43 +00008345 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008346 if (!isAndroid)
8347 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008348 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008349 }
8350
Justin Bognerd3371d82015-07-17 03:35:54 +00008351 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8352 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008353}
8354
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008355// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8356// for the various SFI requirements like register masking. The assembly tool
8357// inserts the file containing the macros as an input into all the assembly
8358// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008359void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8360 const InputInfo &Output,
8361 const InputInfoList &Inputs,
8362 const ArgList &Args,
8363 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008364 const toolchains::NaClToolChain &ToolChain =
8365 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008366 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8367 "nacl-arm-macros.s");
8368 InputInfoList NewInputs;
8369 NewInputs.push_back(NaClMacros);
8370 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008371 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8372 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008373}
8374
Douglas Katzman750cfc52015-06-29 18:42:16 +00008375// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008376// we use static by default, do not yet support sanitizers or LTO, and a few
8377// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008378// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008379void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8380 const InputInfo &Output,
8381 const InputInfoList &Inputs,
8382 const ArgList &Args,
8383 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008384
Douglas Katzman54366072015-07-27 16:53:08 +00008385 const toolchains::NaClToolChain &ToolChain =
8386 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008387 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008388 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008389 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008390 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008391
8392 ArgStringList CmdArgs;
8393
8394 // Silence warning for "clang -g foo.o -o foo"
8395 Args.ClaimAllArgs(options::OPT_g_Group);
8396 // and "clang -emit-llvm foo.o -o foo"
8397 Args.ClaimAllArgs(options::OPT_emit_llvm);
8398 // and for "clang -w foo.o -o foo". Other warning options are already
8399 // handled somewhere else.
8400 Args.ClaimAllArgs(options::OPT_w);
8401
8402 if (!D.SysRoot.empty())
8403 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8404
8405 if (Args.hasArg(options::OPT_rdynamic))
8406 CmdArgs.push_back("-export-dynamic");
8407
8408 if (Args.hasArg(options::OPT_s))
8409 CmdArgs.push_back("-s");
8410
Douglas Katzman54366072015-07-27 16:53:08 +00008411 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8412 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008413 CmdArgs.push_back("--build-id");
8414
8415 if (!IsStatic)
8416 CmdArgs.push_back("--eh-frame-hdr");
8417
8418 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008419 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008420 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008421 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008422 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008423 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008424 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008425 else if (Arch == llvm::Triple::mipsel)
8426 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008427 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008428 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8429 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008430
8431 if (IsStatic)
8432 CmdArgs.push_back("-static");
8433 else if (Args.hasArg(options::OPT_shared))
8434 CmdArgs.push_back("-shared");
8435
8436 CmdArgs.push_back("-o");
8437 CmdArgs.push_back(Output.getFilename());
8438 if (!Args.hasArg(options::OPT_nostdlib) &&
8439 !Args.hasArg(options::OPT_nostartfiles)) {
8440 if (!Args.hasArg(options::OPT_shared))
8441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8442 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8443
8444 const char *crtbegin;
8445 if (IsStatic)
8446 crtbegin = "crtbeginT.o";
8447 else if (Args.hasArg(options::OPT_shared))
8448 crtbegin = "crtbeginS.o";
8449 else
8450 crtbegin = "crtbegin.o";
8451 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8452 }
8453
8454 Args.AddAllArgs(CmdArgs, options::OPT_L);
8455 Args.AddAllArgs(CmdArgs, options::OPT_u);
8456
8457 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8458
8459 for (const auto &Path : Paths)
8460 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8461
8462 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8463 CmdArgs.push_back("--no-demangle");
8464
8465 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8466
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008467 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008468 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008469 bool OnlyLibstdcxxStatic =
8470 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008471 if (OnlyLibstdcxxStatic)
8472 CmdArgs.push_back("-Bstatic");
8473 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8474 if (OnlyLibstdcxxStatic)
8475 CmdArgs.push_back("-Bdynamic");
8476 CmdArgs.push_back("-lm");
8477 }
8478
8479 if (!Args.hasArg(options::OPT_nostdlib)) {
8480 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8481 // Always use groups, since it has no effect on dynamic libraries.
8482 CmdArgs.push_back("--start-group");
8483 CmdArgs.push_back("-lc");
8484 // NaCl's libc++ currently requires libpthread, so just always include it
8485 // in the group for C++.
8486 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008487 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008488 // Gold, used by Mips, handles nested groups differently than ld, and
8489 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8490 // which is not a desired behaviour here.
8491 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8492 if (getToolChain().getArch() == llvm::Triple::mipsel)
8493 CmdArgs.push_back("-lnacl");
8494
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008495 CmdArgs.push_back("-lpthread");
8496 }
8497
8498 CmdArgs.push_back("-lgcc");
8499 CmdArgs.push_back("--as-needed");
8500 if (IsStatic)
8501 CmdArgs.push_back("-lgcc_eh");
8502 else
8503 CmdArgs.push_back("-lgcc_s");
8504 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008505
8506 // Mips needs to create and use pnacl_legacy library that contains
8507 // definitions from bitcode/pnaclmm.c and definitions for
8508 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8509 if (getToolChain().getArch() == llvm::Triple::mipsel)
8510 CmdArgs.push_back("-lpnacl_legacy");
8511
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008512 CmdArgs.push_back("--end-group");
8513 }
8514
8515 if (!Args.hasArg(options::OPT_nostartfiles)) {
8516 const char *crtend;
8517 if (Args.hasArg(options::OPT_shared))
8518 crtend = "crtendS.o";
8519 else
8520 crtend = "crtend.o";
8521
8522 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8523 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8524 }
8525 }
8526
Justin Bognerd3371d82015-07-17 03:35:54 +00008527 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8528 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008529}
8530
Douglas Katzman95354292015-06-23 20:42:09 +00008531void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8532 const InputInfo &Output,
8533 const InputInfoList &Inputs,
8534 const ArgList &Args,
8535 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008536 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008537 ArgStringList CmdArgs;
8538
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008539 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008540
8541 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008542 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008543
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008544 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008545 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008546
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008547 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008548 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008549}
8550
Douglas Katzman95354292015-06-23 20:42:09 +00008551void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8552 const InputInfo &Output,
8553 const InputInfoList &Inputs,
8554 const ArgList &Args,
8555 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008556 const Driver &D = getToolChain().getDriver();
8557 ArgStringList CmdArgs;
8558
Daniel Dunbarb440f562010-08-02 02:38:21 +00008559 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008560 CmdArgs.push_back("-o");
8561 CmdArgs.push_back(Output.getFilename());
8562 } else {
8563 assert(Output.isNothing() && "Invalid output.");
8564 }
8565
8566 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008567 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008568 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8569 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8570 CmdArgs.push_back(
8571 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8572 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008573 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008574
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008575 Args.AddAllArgs(CmdArgs,
8576 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008577
Daniel Dunbar54423b22010-09-17 00:24:54 +00008578 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008579
Alexey Samsonov7811d192014-02-20 13:57:37 +00008580 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008581
Chris Lattner3e2ee142010-07-07 16:01:42 +00008582 if (!Args.hasArg(options::OPT_nostdlib) &&
8583 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008584 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008585 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008586 CmdArgs.push_back("-lm");
8587 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008588 }
8589
8590 if (!Args.hasArg(options::OPT_nostdlib) &&
8591 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008592 if (Args.hasArg(options::OPT_pthread))
8593 CmdArgs.push_back("-lpthread");
8594 CmdArgs.push_back("-lc");
8595 CmdArgs.push_back("-lCompilerRT-Generic");
8596 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8597 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008598 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008599 }
8600
Logan Chieneb9162f2014-06-26 14:23:45 +00008601 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008602 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008603}
8604
Daniel Dunbarcc912342009-05-02 18:28:39 +00008605/// DragonFly Tools
8606
8607// For now, DragonFly Assemble does just about the same as for
8608// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008609void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8610 const InputInfo &Output,
8611 const InputInfoList &Inputs,
8612 const ArgList &Args,
8613 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008614 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008615 ArgStringList CmdArgs;
8616
8617 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8618 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008619 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008620 CmdArgs.push_back("--32");
8621
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008622 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008623
8624 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008625 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008626
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008627 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008628 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008629
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008630 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008631 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008632}
8633
Douglas Katzman95354292015-06-23 20:42:09 +00008634void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8635 const InputInfo &Output,
8636 const InputInfoList &Inputs,
8637 const ArgList &Args,
8638 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008639 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008640 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008641 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008642
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008643 if (!D.SysRoot.empty())
8644 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8645
John McCall65b8da02013-04-11 22:55:55 +00008646 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008647 if (Args.hasArg(options::OPT_static)) {
8648 CmdArgs.push_back("-Bstatic");
8649 } else {
John McCall65b8da02013-04-11 22:55:55 +00008650 if (Args.hasArg(options::OPT_rdynamic))
8651 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008652 if (Args.hasArg(options::OPT_shared))
8653 CmdArgs.push_back("-Bshareable");
8654 else {
8655 CmdArgs.push_back("-dynamic-linker");
8656 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8657 }
John McCall65b8da02013-04-11 22:55:55 +00008658 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008659 }
8660
8661 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8662 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008663 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008664 CmdArgs.push_back("-m");
8665 CmdArgs.push_back("elf_i386");
8666 }
8667
Daniel Dunbarb440f562010-08-02 02:38:21 +00008668 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008669 CmdArgs.push_back("-o");
8670 CmdArgs.push_back(Output.getFilename());
8671 } else {
8672 assert(Output.isNothing() && "Invalid output.");
8673 }
8674
8675 if (!Args.hasArg(options::OPT_nostdlib) &&
8676 !Args.hasArg(options::OPT_nostartfiles)) {
8677 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008678 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008679 CmdArgs.push_back(
8680 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008681 else {
8682 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008683 CmdArgs.push_back(
8684 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008685 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008686 CmdArgs.push_back(
8687 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008688 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008689 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008690 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008691 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008692 CmdArgs.push_back(
8693 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008694 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008695 CmdArgs.push_back(
8696 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008697 }
8698
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008699 Args.AddAllArgs(CmdArgs,
8700 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008701
Daniel Dunbar54423b22010-09-17 00:24:54 +00008702 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008703
8704 if (!Args.hasArg(options::OPT_nostdlib) &&
8705 !Args.hasArg(options::OPT_nodefaultlibs)) {
8706 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8707 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008708 if (UseGCC47)
8709 CmdArgs.push_back("-L/usr/lib/gcc47");
8710 else
8711 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008712
8713 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008714 if (UseGCC47) {
8715 CmdArgs.push_back("-rpath");
8716 CmdArgs.push_back("/usr/lib/gcc47");
8717 } else {
8718 CmdArgs.push_back("-rpath");
8719 CmdArgs.push_back("/usr/lib/gcc44");
8720 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008721 }
8722
Hans Wennborg70850d82013-07-18 20:29:38 +00008723 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008724 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008725 CmdArgs.push_back("-lm");
8726 }
8727
Daniel Dunbarcc912342009-05-02 18:28:39 +00008728 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008729 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008730
8731 if (!Args.hasArg(options::OPT_nolibc)) {
8732 CmdArgs.push_back("-lc");
8733 }
8734
John McCall65b8da02013-04-11 22:55:55 +00008735 if (UseGCC47) {
8736 if (Args.hasArg(options::OPT_static) ||
8737 Args.hasArg(options::OPT_static_libgcc)) {
8738 CmdArgs.push_back("-lgcc");
8739 CmdArgs.push_back("-lgcc_eh");
8740 } else {
8741 if (Args.hasArg(options::OPT_shared_libgcc)) {
8742 CmdArgs.push_back("-lgcc_pic");
8743 if (!Args.hasArg(options::OPT_shared))
8744 CmdArgs.push_back("-lgcc");
8745 } else {
8746 CmdArgs.push_back("-lgcc");
8747 CmdArgs.push_back("--as-needed");
8748 CmdArgs.push_back("-lgcc_pic");
8749 CmdArgs.push_back("--no-as-needed");
8750 }
8751 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008752 } else {
John McCall65b8da02013-04-11 22:55:55 +00008753 if (Args.hasArg(options::OPT_shared)) {
8754 CmdArgs.push_back("-lgcc_pic");
8755 } else {
8756 CmdArgs.push_back("-lgcc");
8757 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008758 }
8759 }
8760
8761 if (!Args.hasArg(options::OPT_nostdlib) &&
8762 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008763 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008764 CmdArgs.push_back(
8765 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008766 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008767 CmdArgs.push_back(
8768 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8769 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008770 }
8771
Alexey Samsonov7811d192014-02-20 13:57:37 +00008772 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008773
Logan Chieneb9162f2014-06-26 14:23:45 +00008774 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008775 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008776}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008777
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008778// Try to find Exe from a Visual Studio distribution. This first tries to find
8779// an installed copy of Visual Studio and, failing that, looks in the PATH,
8780// making sure that whatever executable that's found is not a same-named exe
8781// from clang itself to prevent clang from falling back to itself.
8782static std::string FindVisualStudioExecutable(const ToolChain &TC,
8783 const char *Exe,
8784 const char *ClangProgramPath) {
8785 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8786 std::string visualStudioBinDir;
8787 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8788 visualStudioBinDir)) {
8789 SmallString<128> FilePath(visualStudioBinDir);
8790 llvm::sys::path::append(FilePath, Exe);
8791 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8792 return FilePath.str();
8793 }
8794
8795 return Exe;
8796}
8797
Douglas Katzman95354292015-06-23 20:42:09 +00008798void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8799 const InputInfo &Output,
8800 const InputInfoList &Inputs,
8801 const ArgList &Args,
8802 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008803 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008804 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008805
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008806 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8807 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008808 CmdArgs.push_back(
8809 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008810
8811 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008812 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008813 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008814
Zachary Turner10d75b22014-10-22 20:40:43 +00008815 if (!llvm::sys::Process::GetEnv("LIB")) {
8816 // If the VC environment hasn't been configured (perhaps because the user
8817 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008818 // the environment variable is set however, assume the user knows what
8819 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008820 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008821 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008822 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8823 SmallString<128> LibDir(VisualStudioDir);
8824 llvm::sys::path::append(LibDir, "VC", "lib");
8825 switch (MSVC.getArch()) {
8826 case llvm::Triple::x86:
8827 // x86 just puts the libraries directly in lib
8828 break;
8829 case llvm::Triple::x86_64:
8830 llvm::sys::path::append(LibDir, "amd64");
8831 break;
8832 case llvm::Triple::arm:
8833 llvm::sys::path::append(LibDir, "arm");
8834 break;
8835 default:
8836 break;
8837 }
8838 CmdArgs.push_back(
8839 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8840 }
8841
8842 std::string WindowsSdkLibPath;
8843 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8844 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8845 WindowsSdkLibPath.c_str()));
8846 }
8847
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008848 CmdArgs.push_back("-nologo");
8849
Reid Kleckner124955a2015-08-05 18:51:13 +00008850 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008851 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008852
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008853 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008854 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008855 if (DLL) {
8856 CmdArgs.push_back(Args.MakeArgString("-dll"));
8857
8858 SmallString<128> ImplibName(Output.getFilename());
8859 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008860 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008861 }
8862
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008863 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008864 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008865 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008866 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008867 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008868 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008869 };
8870 for (const auto &Component : CompilerRTComponents)
8871 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008872 // Make sure the dynamic runtime thunk is not optimized out at link time
8873 // to ensure proper SEH handling.
8874 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008875 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008876 CmdArgs.push_back(
8877 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008878 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008879 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008880 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008881 };
8882 for (const auto &Component : CompilerRTComponents)
8883 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008884 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008885 }
8886
Hans Wennborg2e274592013-08-13 23:38:57 +00008887 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008888
Reid Kleckner337188f2014-09-16 19:22:00 +00008889 // Add filenames, libraries, and other linker inputs.
8890 for (const auto &Input : Inputs) {
8891 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008892 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008893 continue;
8894 }
8895
8896 const Arg &A = Input.getInputArg();
8897
8898 // Render -l options differently for the MSVC linker.
8899 if (A.getOption().matches(options::OPT_l)) {
8900 StringRef Lib = A.getValue();
8901 const char *LinkLibArg;
8902 if (Lib.endswith(".lib"))
8903 LinkLibArg = Args.MakeArgString(Lib);
8904 else
8905 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8906 CmdArgs.push_back(LinkLibArg);
8907 continue;
8908 }
8909
8910 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8911 // or -L. Render it, even if MSVC doesn't understand it.
8912 A.renderAsInput(Args, CmdArgs);
8913 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008914
Zachary Turner719f58c2014-12-01 23:06:47 +00008915 // We need to special case some linker paths. In the case of lld, we need to
8916 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8917 // linker, we need to use a special search algorithm.
8918 llvm::SmallString<128> linkPath;
8919 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8920 if (Linker.equals_lower("lld"))
8921 Linker = "lld-link";
8922
8923 if (Linker.equals_lower("link")) {
8924 // If we're using the MSVC linker, it's not sufficient to just use link
8925 // from the program PATH, because other environments like GnuWin32 install
8926 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008927 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008928 C.getDriver().getClangProgramPath());
8929 } else {
8930 linkPath = Linker;
8931 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008932 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008933 }
8934
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008935 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00008936 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008937}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008938
Douglas Katzman95354292015-06-23 20:42:09 +00008939void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8940 const InputInfo &Output,
8941 const InputInfoList &Inputs,
8942 const ArgList &Args,
8943 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008944 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8945}
8946
Douglas Katzman95354292015-06-23 20:42:09 +00008947std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008948 Compilation &C, const JobAction &JA, const InputInfo &Output,
8949 const InputInfoList &Inputs, const ArgList &Args,
8950 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008951 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008952 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008953 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008954 CmdArgs.push_back("/W0"); // No warnings.
8955
8956 // The goal is to be able to invoke this tool correctly based on
8957 // any flag accepted by clang-cl.
8958
8959 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008960 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008961
8962 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00008963 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
8964 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
8965 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008966 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8967 if (A->getOption().getID() == options::OPT_O0) {
8968 CmdArgs.push_back("/Od");
8969 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00008970 CmdArgs.push_back("/Og");
8971
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008972 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00008973 if (OptLevel == "s" || OptLevel == "z")
8974 CmdArgs.push_back("/Os");
8975 else
8976 CmdArgs.push_back("/Ot");
8977
8978 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008979 }
8980 }
David Majnemer015ce0f2015-07-27 07:32:11 +00008981 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
8982 options::OPT_fno_omit_frame_pointer))
8983 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
8984 ? "/Oy"
8985 : "/Oy-");
8986 if (!Args.hasArg(options::OPT_fwritable_strings))
8987 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008988
Nico Weber3f8dafb2015-03-12 19:37:10 +00008989 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008990 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8991
David Majnemerf6072342014-07-01 22:24:56 +00008992 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8993 /*default=*/false))
8994 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008995 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8996 options::OPT_fno_function_sections))
8997 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8998 ? "/Gy"
8999 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009000 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9001 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009002 CmdArgs.push_back(
9003 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009004 if (Args.hasArg(options::OPT_fsyntax_only))
9005 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009006 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9007 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009008 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009009
Nico Weber3f8dafb2015-03-12 19:37:10 +00009010 std::vector<std::string> Includes =
9011 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009012 for (const auto &Include : Includes)
9013 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009014
Hans Wennborg87cfa712013-09-19 20:32:16 +00009015 // Flags that can simply be passed through.
9016 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9017 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009018 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009019 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009020
9021 // The order of these flags is relevant, so pick the last one.
9022 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9023 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9024 A->render(Args, CmdArgs);
9025
Hans Wennborg87cfa712013-09-19 20:32:16 +00009026 // Input filename.
9027 assert(Inputs.size() == 1);
9028 const InputInfo &II = Inputs[0];
9029 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9030 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9031 if (II.isFilename())
9032 CmdArgs.push_back(II.getFilename());
9033 else
9034 II.getInputArg().renderAsInput(Args, CmdArgs);
9035
9036 // Output filename.
9037 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009038 const char *Fo =
9039 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009040 CmdArgs.push_back(Fo);
9041
Hans Wennborg188382e2013-09-20 18:16:35 +00009042 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009043 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9044 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009045 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009046 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009047}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009048
Yaron Keren1c0070c2015-07-02 04:45:27 +00009049/// MinGW Tools
9050void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9051 const InputInfo &Output,
9052 const InputInfoList &Inputs,
9053 const ArgList &Args,
9054 const char *LinkingOutput) const {
9055 claimNoWarnArgs(Args);
9056 ArgStringList CmdArgs;
9057
9058 if (getToolChain().getArch() == llvm::Triple::x86) {
9059 CmdArgs.push_back("--32");
9060 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9061 CmdArgs.push_back("--64");
9062 }
9063
9064 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9065
9066 CmdArgs.push_back("-o");
9067 CmdArgs.push_back(Output.getFilename());
9068
9069 for (const auto &II : Inputs)
9070 CmdArgs.push_back(II.getFilename());
9071
9072 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009073 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009074
9075 if (Args.hasArg(options::OPT_gsplit_dwarf))
9076 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9077 SplitDebugName(Args, Inputs[0]));
9078}
9079
9080void MinGW::Linker::AddLibGCC(const ArgList &Args,
9081 ArgStringList &CmdArgs) const {
9082 if (Args.hasArg(options::OPT_mthreads))
9083 CmdArgs.push_back("-lmingwthrd");
9084 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009085
9086 // Add libgcc or compiler-rt.
9087 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9088
Yaron Keren1c0070c2015-07-02 04:45:27 +00009089 CmdArgs.push_back("-lmoldname");
9090 CmdArgs.push_back("-lmingwex");
9091 CmdArgs.push_back("-lmsvcrt");
9092}
9093
9094void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9095 const InputInfo &Output,
9096 const InputInfoList &Inputs,
9097 const ArgList &Args,
9098 const char *LinkingOutput) const {
9099 const ToolChain &TC = getToolChain();
9100 const Driver &D = TC.getDriver();
9101 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9102
9103 ArgStringList CmdArgs;
9104
9105 // Silence warning for "clang -g foo.o -o foo"
9106 Args.ClaimAllArgs(options::OPT_g_Group);
9107 // and "clang -emit-llvm foo.o -o foo"
9108 Args.ClaimAllArgs(options::OPT_emit_llvm);
9109 // and for "clang -w foo.o -o foo". Other warning options are already
9110 // handled somewhere else.
9111 Args.ClaimAllArgs(options::OPT_w);
9112
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009113 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9114 if (LinkerName.equals_lower("lld")) {
9115 CmdArgs.push_back("-flavor");
9116 CmdArgs.push_back("gnu");
9117 }
9118
Yaron Keren1c0070c2015-07-02 04:45:27 +00009119 if (!D.SysRoot.empty())
9120 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9121
9122 if (Args.hasArg(options::OPT_s))
9123 CmdArgs.push_back("-s");
9124
9125 CmdArgs.push_back("-m");
9126 if (TC.getArch() == llvm::Triple::x86)
9127 CmdArgs.push_back("i386pe");
9128 if (TC.getArch() == llvm::Triple::x86_64)
9129 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009130 if (TC.getArch() == llvm::Triple::arm)
9131 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009132
9133 if (Args.hasArg(options::OPT_mwindows)) {
9134 CmdArgs.push_back("--subsystem");
9135 CmdArgs.push_back("windows");
9136 } else if (Args.hasArg(options::OPT_mconsole)) {
9137 CmdArgs.push_back("--subsystem");
9138 CmdArgs.push_back("console");
9139 }
9140
9141 if (Args.hasArg(options::OPT_static))
9142 CmdArgs.push_back("-Bstatic");
9143 else {
9144 if (Args.hasArg(options::OPT_mdll))
9145 CmdArgs.push_back("--dll");
9146 else if (Args.hasArg(options::OPT_shared))
9147 CmdArgs.push_back("--shared");
9148 CmdArgs.push_back("-Bdynamic");
9149 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9150 CmdArgs.push_back("-e");
9151 if (TC.getArch() == llvm::Triple::x86)
9152 CmdArgs.push_back("_DllMainCRTStartup@12");
9153 else
9154 CmdArgs.push_back("DllMainCRTStartup");
9155 CmdArgs.push_back("--enable-auto-image-base");
9156 }
9157 }
9158
9159 CmdArgs.push_back("-o");
9160 CmdArgs.push_back(Output.getFilename());
9161
9162 Args.AddAllArgs(CmdArgs, options::OPT_e);
9163 // FIXME: add -N, -n flags
9164 Args.AddLastArg(CmdArgs, options::OPT_r);
9165 Args.AddLastArg(CmdArgs, options::OPT_s);
9166 Args.AddLastArg(CmdArgs, options::OPT_t);
9167 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9168 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9169
9170 if (!Args.hasArg(options::OPT_nostdlib) &&
9171 !Args.hasArg(options::OPT_nostartfiles)) {
9172 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9173 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9174 } else {
9175 if (Args.hasArg(options::OPT_municode))
9176 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9177 else
9178 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9179 }
9180 if (Args.hasArg(options::OPT_pg))
9181 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9182 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9183 }
9184
9185 Args.AddAllArgs(CmdArgs, options::OPT_L);
9186 const ToolChain::path_list Paths = TC.getFilePaths();
9187 for (const auto &Path : Paths)
9188 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9189
9190 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9191
9192 // TODO: Add ASan stuff here
9193
9194 // TODO: Add profile stuff here
9195
9196 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9197 !Args.hasArg(options::OPT_nodefaultlibs)) {
9198 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9199 !Args.hasArg(options::OPT_static);
9200 if (OnlyLibstdcxxStatic)
9201 CmdArgs.push_back("-Bstatic");
9202 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9203 if (OnlyLibstdcxxStatic)
9204 CmdArgs.push_back("-Bdynamic");
9205 }
9206
9207 if (!Args.hasArg(options::OPT_nostdlib)) {
9208 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9209 if (Args.hasArg(options::OPT_static))
9210 CmdArgs.push_back("--start-group");
9211
9212 if (Args.hasArg(options::OPT_fstack_protector) ||
9213 Args.hasArg(options::OPT_fstack_protector_strong) ||
9214 Args.hasArg(options::OPT_fstack_protector_all)) {
9215 CmdArgs.push_back("-lssp_nonshared");
9216 CmdArgs.push_back("-lssp");
9217 }
9218 if (Args.hasArg(options::OPT_fopenmp))
9219 CmdArgs.push_back("-lgomp");
9220
9221 AddLibGCC(Args, CmdArgs);
9222
9223 if (Args.hasArg(options::OPT_pg))
9224 CmdArgs.push_back("-lgmon");
9225
Yaron Kerenadce68e2015-07-06 18:52:19 +00009226 if (Args.hasArg(options::OPT_pthread))
9227 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009228
9229 // add system libraries
9230 if (Args.hasArg(options::OPT_mwindows)) {
9231 CmdArgs.push_back("-lgdi32");
9232 CmdArgs.push_back("-lcomdlg32");
9233 }
9234 CmdArgs.push_back("-ladvapi32");
9235 CmdArgs.push_back("-lshell32");
9236 CmdArgs.push_back("-luser32");
9237 CmdArgs.push_back("-lkernel32");
9238
9239 if (Args.hasArg(options::OPT_static))
9240 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009241 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009242 AddLibGCC(Args, CmdArgs);
9243 }
9244
9245 if (!Args.hasArg(options::OPT_nostartfiles)) {
9246 // Add crtfastmath.o if available and fast math is enabled.
9247 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9248
9249 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9250 }
9251 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009252 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009253 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009254}
9255
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009256/// XCore Tools
9257// We pass assemble and link construction to the xcc tool.
9258
Douglas Katzman95354292015-06-23 20:42:09 +00009259void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9260 const InputInfo &Output,
9261 const InputInfoList &Inputs,
9262 const ArgList &Args,
9263 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009264 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009265 ArgStringList CmdArgs;
9266
9267 CmdArgs.push_back("-o");
9268 CmdArgs.push_back(Output.getFilename());
9269
9270 CmdArgs.push_back("-c");
9271
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009272 if (Args.hasArg(options::OPT_v))
9273 CmdArgs.push_back("-v");
9274
Robert Lytton894d25c2014-05-02 09:33:25 +00009275 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9276 if (!A->getOption().matches(options::OPT_g0))
9277 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009278
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009279 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9280 false))
9281 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009283 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009284
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009285 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009286 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009287
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009288 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009289 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009290}
9291
Douglas Katzman95354292015-06-23 20:42:09 +00009292void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9293 const InputInfo &Output,
9294 const InputInfoList &Inputs,
9295 const ArgList &Args,
9296 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009297 ArgStringList CmdArgs;
9298
9299 if (Output.isFilename()) {
9300 CmdArgs.push_back("-o");
9301 CmdArgs.push_back(Output.getFilename());
9302 } else {
9303 assert(Output.isNothing() && "Invalid output.");
9304 }
9305
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009306 if (Args.hasArg(options::OPT_v))
9307 CmdArgs.push_back("-v");
9308
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009309 // Pass -fexceptions through to the linker if it was present.
9310 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9311 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009312 CmdArgs.push_back("-fexceptions");
9313
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009314 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9315
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009316 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009317 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009318}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009319
Douglas Katzman95354292015-06-23 20:42:09 +00009320void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9321 const InputInfo &Output,
9322 const InputInfoList &Inputs,
9323 const ArgList &Args,
9324 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009325 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009326 const auto &TC =
9327 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9328 ArgStringList CmdArgs;
9329 const char *Exec;
9330
9331 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009332 default:
9333 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009334 case llvm::Triple::arm:
9335 case llvm::Triple::thumb:
9336 break;
9337 case llvm::Triple::x86:
9338 CmdArgs.push_back("--32");
9339 break;
9340 case llvm::Triple::x86_64:
9341 CmdArgs.push_back("--64");
9342 break;
9343 }
9344
9345 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9346
9347 CmdArgs.push_back("-o");
9348 CmdArgs.push_back(Output.getFilename());
9349
9350 for (const auto &Input : Inputs)
9351 CmdArgs.push_back(Input.getFilename());
9352
9353 const std::string Assembler = TC.GetProgramPath("as");
9354 Exec = Args.MakeArgString(Assembler);
9355
Justin Bognerd3371d82015-07-17 03:35:54 +00009356 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009357}
9358
Douglas Katzman95354292015-06-23 20:42:09 +00009359void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9360 const InputInfo &Output,
9361 const InputInfoList &Inputs,
9362 const ArgList &Args,
9363 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009364 const auto &TC =
9365 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9366 const llvm::Triple &T = TC.getTriple();
9367 const Driver &D = TC.getDriver();
9368 SmallString<128> EntryPoint;
9369 ArgStringList CmdArgs;
9370 const char *Exec;
9371
9372 // Silence warning for "clang -g foo.o -o foo"
9373 Args.ClaimAllArgs(options::OPT_g_Group);
9374 // and "clang -emit-llvm foo.o -o foo"
9375 Args.ClaimAllArgs(options::OPT_emit_llvm);
9376 // and for "clang -w foo.o -o foo"
9377 Args.ClaimAllArgs(options::OPT_w);
9378 // Other warning options are already handled somewhere else.
9379
9380 if (!D.SysRoot.empty())
9381 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9382
9383 if (Args.hasArg(options::OPT_pie))
9384 CmdArgs.push_back("-pie");
9385 if (Args.hasArg(options::OPT_rdynamic))
9386 CmdArgs.push_back("-export-dynamic");
9387 if (Args.hasArg(options::OPT_s))
9388 CmdArgs.push_back("--strip-all");
9389
9390 CmdArgs.push_back("-m");
9391 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009392 default:
9393 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009394 case llvm::Triple::arm:
9395 case llvm::Triple::thumb:
9396 // FIXME: this is incorrect for WinCE
9397 CmdArgs.push_back("thumb2pe");
9398 break;
9399 case llvm::Triple::x86:
9400 CmdArgs.push_back("i386pe");
9401 EntryPoint.append("_");
9402 break;
9403 case llvm::Triple::x86_64:
9404 CmdArgs.push_back("i386pep");
9405 break;
9406 }
9407
9408 if (Args.hasArg(options::OPT_shared)) {
9409 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009410 default:
9411 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009412 case llvm::Triple::arm:
9413 case llvm::Triple::thumb:
9414 case llvm::Triple::x86_64:
9415 EntryPoint.append("_DllMainCRTStartup");
9416 break;
9417 case llvm::Triple::x86:
9418 EntryPoint.append("_DllMainCRTStartup@12");
9419 break;
9420 }
9421
9422 CmdArgs.push_back("-shared");
9423 CmdArgs.push_back("-Bdynamic");
9424
9425 CmdArgs.push_back("--enable-auto-image-base");
9426
9427 CmdArgs.push_back("--entry");
9428 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9429 } else {
9430 EntryPoint.append("mainCRTStartup");
9431
9432 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9433 : "-Bdynamic");
9434
9435 if (!Args.hasArg(options::OPT_nostdlib) &&
9436 !Args.hasArg(options::OPT_nostartfiles)) {
9437 CmdArgs.push_back("--entry");
9438 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9439 }
9440
9441 // FIXME: handle subsystem
9442 }
9443
9444 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009445 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009446
9447 CmdArgs.push_back("-o");
9448 CmdArgs.push_back(Output.getFilename());
9449
9450 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9451 SmallString<261> ImpLib(Output.getFilename());
9452 llvm::sys::path::replace_extension(ImpLib, ".lib");
9453
9454 CmdArgs.push_back("--out-implib");
9455 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9456 }
9457
9458 if (!Args.hasArg(options::OPT_nostdlib) &&
9459 !Args.hasArg(options::OPT_nostartfiles)) {
9460 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9461 const char *CRTBegin;
9462
9463 CRTBegin =
9464 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9465 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9466 }
9467
9468 Args.AddAllArgs(CmdArgs, options::OPT_L);
9469
9470 const auto &Paths = TC.getFilePaths();
9471 for (const auto &Path : Paths)
9472 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9473
9474 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9475
9476 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9477 !Args.hasArg(options::OPT_nodefaultlibs)) {
9478 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9479 !Args.hasArg(options::OPT_static);
9480 if (StaticCXX)
9481 CmdArgs.push_back("-Bstatic");
9482 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9483 if (StaticCXX)
9484 CmdArgs.push_back("-Bdynamic");
9485 }
9486
9487 if (!Args.hasArg(options::OPT_nostdlib)) {
9488 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9489 // TODO handle /MT[d] /MD[d]
9490 CmdArgs.push_back("-lmsvcrt");
9491 AddRunTimeLibs(TC, D, CmdArgs, Args);
9492 }
9493 }
9494
9495 const std::string Linker = TC.GetProgramPath("ld");
9496 Exec = Args.MakeArgString(Linker);
9497
Justin Bognerd3371d82015-07-17 03:35:54 +00009498 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009499}
Douglas Katzman84a75642015-06-19 14:55:19 +00009500
Douglas Katzman95354292015-06-23 20:42:09 +00009501void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9502 const InputInfo &Output,
9503 const InputInfoList &Inputs,
9504 const ArgList &Args,
9505 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009506
9507 ArgStringList CmdArgs;
9508
9509 assert(Inputs.size() == 1);
9510 const InputInfo &II = Inputs[0];
9511 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9512 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9513
Douglas Katzman84a75642015-06-19 14:55:19 +00009514 CmdArgs.push_back("-DMYRIAD2");
9515 CmdArgs.push_back("-mcpu=myriad2");
9516 CmdArgs.push_back("-S");
9517
Douglas Katzmanf6071112015-08-03 14:34:22 +00009518 // Append all -I, -iquote, -isystem paths, defines/undefines,
9519 // 'f' flags, optimize flags, and warning options.
9520 // These are spelled the same way in clang and moviCompile.
9521 Args.AddAllArgs(CmdArgs,
9522 {options::OPT_I_Group, options::OPT_clang_i_Group,
9523 options::OPT_D, options::OPT_U,
9524 options::OPT_f_Group,
9525 options::OPT_f_clang_Group,
9526 options::OPT_g_Group,
9527 options::OPT_O_Group,
9528 options::OPT_W_Group});
Douglas Katzman84a75642015-06-19 14:55:19 +00009529 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9530
9531 CmdArgs.push_back(II.getFilename());
9532 CmdArgs.push_back("-o");
9533 CmdArgs.push_back(Output.getFilename());
9534
9535 std::string Exec =
9536 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009537 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9538 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009539}
9540
Douglas Katzman95354292015-06-23 20:42:09 +00009541void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9542 const InputInfo &Output,
9543 const InputInfoList &Inputs,
9544 const ArgList &Args,
9545 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009546 ArgStringList CmdArgs;
9547
9548 assert(Inputs.size() == 1);
9549 const InputInfo &II = Inputs[0];
9550 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9551 assert(Output.getType() == types::TY_Object);
9552
9553 CmdArgs.push_back("-no6thSlotCompression");
9554 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9555 CmdArgs.push_back("-noSPrefixing");
9556 CmdArgs.push_back("-a"); // Mystery option.
9557 for (auto Arg : Args.filtered(options::OPT_I)) {
9558 Arg->claim();
9559 CmdArgs.push_back(
9560 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9561 }
9562 CmdArgs.push_back("-elf"); // Output format.
9563 CmdArgs.push_back(II.getFilename());
9564 CmdArgs.push_back(
9565 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9566
9567 std::string Exec =
9568 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009569 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9570 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009571}