blob: 79d8dfb2a946fdaafe3c168b7dc1dace11695672 [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");
Evgeniy Stepanov775d90562015-08-18 20:36:11 +00002501 CmdArgs.push_back("-lutil");
Alexey Samsonov52550342014-09-15 19:58:40 +00002502 CmdArgs.push_back("-lm");
2503 // There's no libdl on FreeBSD.
2504 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2505 CmdArgs.push_back("-ldl");
2506}
2507
2508static void
2509collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2510 SmallVectorImpl<StringRef> &SharedRuntimes,
2511 SmallVectorImpl<StringRef> &StaticRuntimes,
2512 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2513 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2514 // Collect shared runtimes.
2515 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2516 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002517 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002518
Alexey Samsonov52550342014-09-15 19:58:40 +00002519 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002520 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002521 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2522 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002523 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002524 }
2525 if (SanArgs.needsAsanRt()) {
2526 if (SanArgs.needsSharedAsanRt()) {
2527 HelperStaticRuntimes.push_back("asan-preinit");
2528 } else {
2529 StaticRuntimes.push_back("asan");
2530 if (SanArgs.linkCXXRuntimes())
2531 StaticRuntimes.push_back("asan_cxx");
2532 }
2533 }
2534 if (SanArgs.needsDfsanRt())
2535 StaticRuntimes.push_back("dfsan");
2536 if (SanArgs.needsLsanRt())
2537 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002538 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002539 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002540 if (SanArgs.linkCXXRuntimes())
2541 StaticRuntimes.push_back("msan_cxx");
2542 }
2543 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002544 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002545 if (SanArgs.linkCXXRuntimes())
2546 StaticRuntimes.push_back("tsan_cxx");
2547 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002548 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002549 StaticRuntimes.push_back("ubsan_standalone");
2550 if (SanArgs.linkCXXRuntimes())
2551 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002552 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002553 if (SanArgs.needsSafeStackRt())
2554 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002555}
2556
Alexey Samsonov52550342014-09-15 19:58:40 +00002557// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2558// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2559static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002560 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002561 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2562 HelperStaticRuntimes;
2563 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2564 HelperStaticRuntimes);
2565 for (auto RT : SharedRuntimes)
2566 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2567 for (auto RT : HelperStaticRuntimes)
2568 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2569 bool AddExportDynamic = false;
2570 for (auto RT : StaticRuntimes) {
2571 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2572 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2573 }
2574 // If there is a static runtime with no dynamic list, force all the symbols
2575 // to be dynamic to be sure we export sanitizer interface functions.
2576 if (AddExportDynamic)
2577 CmdArgs.push_back("-export-dynamic");
2578 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002579}
2580
Reid Kleckner86ea7702015-02-04 23:45:07 +00002581static bool areOptimizationsEnabled(const ArgList &Args) {
2582 // Find the last -O arg and see if it is non-zero.
2583 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2584 return !A->getOption().matches(options::OPT_O0);
2585 // Defaults to -O0.
2586 return false;
2587}
2588
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002589static bool shouldUseFramePointerForTarget(const ArgList &Args,
2590 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002591 // XCore never wants frame pointers, regardless of OS.
2592 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002593 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002594 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002595
2596 if (Triple.isOSLinux()) {
2597 switch (Triple.getArch()) {
2598 // Don't use a frame pointer on linux if optimizing for certain targets.
2599 case llvm::Triple::mips64:
2600 case llvm::Triple::mips64el:
2601 case llvm::Triple::mips:
2602 case llvm::Triple::mipsel:
2603 case llvm::Triple::systemz:
2604 case llvm::Triple::x86:
2605 case llvm::Triple::x86_64:
2606 return !areOptimizationsEnabled(Args);
2607 default:
2608 return true;
2609 }
2610 }
2611
2612 if (Triple.isOSWindows()) {
2613 switch (Triple.getArch()) {
2614 case llvm::Triple::x86:
2615 return !areOptimizationsEnabled(Args);
2616 default:
2617 // All other supported Windows ISAs use xdata unwind information, so frame
2618 // pointers are not generally useful.
2619 return false;
2620 }
2621 }
2622
2623 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002624}
2625
Rafael Espindola224dd632011-12-14 21:02:23 +00002626static bool shouldUseFramePointer(const ArgList &Args,
2627 const llvm::Triple &Triple) {
2628 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2629 options::OPT_fomit_frame_pointer))
2630 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2631
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002632 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002633}
2634
Eric Christopherb7d97e92013-04-03 01:58:53 +00002635static bool shouldUseLeafFramePointer(const ArgList &Args,
2636 const llvm::Triple &Triple) {
2637 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2638 options::OPT_momit_leaf_frame_pointer))
2639 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2640
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002641 if (Triple.isPS4CPU())
2642 return false;
2643
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002644 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002645}
2646
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002647/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002648static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002649 SmallString<128> cwd;
2650 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002651 CmdArgs.push_back("-fdebug-compilation-dir");
2652 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002653 }
2654}
2655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002657 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2658 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2659 SmallString<128> T(FinalOutput->getValue());
2660 llvm::sys::path::replace_extension(T, "dwo");
2661 return Args.MakeArgString(T);
2662 } else {
2663 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002664 SmallString<128> T(
2665 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002666 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002667 llvm::sys::path::replace_extension(F, "dwo");
2668 T += F;
2669 return Args.MakeArgString(F);
2670 }
2671}
2672
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002673static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2674 const JobAction &JA, const ArgList &Args,
2675 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002676 ArgStringList ExtractArgs;
2677 ExtractArgs.push_back("--extract-dwo");
2678
2679 ArgStringList StripArgs;
2680 StripArgs.push_back("--strip-dwo");
2681
2682 // Grabbing the output of the earlier compile step.
2683 StripArgs.push_back(Output.getFilename());
2684 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002685 ExtractArgs.push_back(OutFile);
2686
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002687 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002688 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002689
2690 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002691 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002692
2693 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002694 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002695}
2696
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002697/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002698/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2699static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002700 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002701 if (A->getOption().matches(options::OPT_O4) ||
2702 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002703 return true;
2704
2705 if (A->getOption().matches(options::OPT_O0))
2706 return false;
2707
2708 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2709
Rafael Espindola91780de2013-08-26 14:05:41 +00002710 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002711 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002712 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002713 return true;
2714
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002715 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002716 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002717 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002718
2719 unsigned OptLevel = 0;
2720 if (S.getAsInteger(10, OptLevel))
2721 return false;
2722
2723 return OptLevel > 1;
2724 }
2725
2726 return false;
2727}
2728
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002729/// Add -x lang to \p CmdArgs for \p Input.
2730static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2731 ArgStringList &CmdArgs) {
2732 // When using -verify-pch, we don't want to provide the type
2733 // 'precompiled-header' if it was inferred from the file extension
2734 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2735 return;
2736
2737 CmdArgs.push_back("-x");
2738 if (Args.hasArg(options::OPT_rewrite_objc))
2739 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2740 else
2741 CmdArgs.push_back(types::getTypeName(Input.getType()));
2742}
2743
David Majnemerc371ff02015-03-22 08:39:22 +00002744static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002745 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002746 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002747
2748 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002749 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002750
2751 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002752 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002753 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002754 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002755}
2756
Rafael Espindola577637a2015-01-03 00:06:04 +00002757// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002758// options that build systems might add but are unused when assembling or only
2759// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002760static void claimNoWarnArgs(const ArgList &Args) {
2761 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002762 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002763 Args.ClaimAllArgs(options::OPT_flto);
2764 Args.ClaimAllArgs(options::OPT_fno_lto);
2765}
2766
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002767static void appendUserToPath(SmallVectorImpl<char> &Result) {
2768#ifdef LLVM_ON_UNIX
2769 const char *Username = getenv("LOGNAME");
2770#else
2771 const char *Username = getenv("USERNAME");
2772#endif
2773 if (Username) {
2774 // Validate that LoginName can be used in a path, and get its length.
2775 size_t Len = 0;
2776 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002777 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002778 Username = nullptr;
2779 break;
2780 }
2781 }
2782
2783 if (Username && Len > 0) {
2784 Result.append(Username, Username + Len);
2785 return;
2786 }
2787 }
2788
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002789// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002790#ifdef LLVM_ON_UNIX
2791 std::string UID = llvm::utostr(getuid());
2792#else
2793 // FIXME: Windows seems to have an 'SID' that might work.
2794 std::string UID = "9999";
2795#endif
2796 Result.append(UID.begin(), UID.end());
2797}
2798
David Majnemere11d3732015-06-08 00:22:46 +00002799VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2800 const llvm::Triple &Triple,
2801 const llvm::opt::ArgList &Args,
2802 bool IsWindowsMSVC) {
2803 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2804 IsWindowsMSVC) ||
2805 Args.hasArg(options::OPT_fmsc_version) ||
2806 Args.hasArg(options::OPT_fms_compatibility_version)) {
2807 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2808 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002809 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002810
2811 if (MSCVersion && MSCompatibilityVersion) {
2812 if (D)
2813 D->Diag(diag::err_drv_argument_not_allowed_with)
2814 << MSCVersion->getAsString(Args)
2815 << MSCompatibilityVersion->getAsString(Args);
2816 return VersionTuple();
2817 }
2818
2819 if (MSCompatibilityVersion) {
2820 VersionTuple MSVT;
2821 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2822 D->Diag(diag::err_drv_invalid_value)
2823 << MSCompatibilityVersion->getAsString(Args)
2824 << MSCompatibilityVersion->getValue();
2825 return MSVT;
2826 }
2827
2828 if (MSCVersion) {
2829 unsigned Version = 0;
2830 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2831 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2832 << MSCVersion->getValue();
2833 return getMSCompatibilityVersion(Version);
2834 }
2835
2836 unsigned Major, Minor, Micro;
2837 Triple.getEnvironmentVersion(Major, Minor, Micro);
2838 if (Major || Minor || Micro)
2839 return VersionTuple(Major, Minor, Micro);
2840
2841 return VersionTuple(18);
2842 }
2843 return VersionTuple();
2844}
2845
Diego Novilloa0545962015-07-10 18:00:07 +00002846static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2847 const InputInfo &Output, const ArgList &Args,
2848 ArgStringList &CmdArgs) {
2849 auto *ProfileGenerateArg = Args.getLastArg(
2850 options::OPT_fprofile_instr_generate,
2851 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002852 options::OPT_fprofile_generate_EQ,
2853 options::OPT_fno_profile_instr_generate);
2854 if (ProfileGenerateArg &&
2855 ProfileGenerateArg->getOption().matches(
2856 options::OPT_fno_profile_instr_generate))
2857 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002858
2859 auto *ProfileUseArg = Args.getLastArg(
2860 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002861 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2862 options::OPT_fno_profile_instr_use);
2863 if (ProfileUseArg &&
2864 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2865 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002866
2867 if (ProfileGenerateArg && ProfileUseArg)
2868 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002869 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002870
Diego Novillo758f3f52015-08-05 21:49:51 +00002871 if (ProfileGenerateArg) {
2872 if (ProfileGenerateArg->getOption().matches(
2873 options::OPT_fprofile_instr_generate_EQ))
2874 ProfileGenerateArg->render(Args, CmdArgs);
2875 else if (ProfileGenerateArg->getOption().matches(
2876 options::OPT_fprofile_generate_EQ)) {
2877 SmallString<128> Path(ProfileGenerateArg->getValue());
2878 llvm::sys::path::append(Path, "default.profraw");
2879 CmdArgs.push_back(
2880 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2881 } else
2882 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2883 }
Diego Novilloa0545962015-07-10 18:00:07 +00002884
Diego Novillo758f3f52015-08-05 21:49:51 +00002885 if (ProfileUseArg) {
2886 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2887 ProfileUseArg->render(Args, CmdArgs);
2888 else if ((ProfileUseArg->getOption().matches(
2889 options::OPT_fprofile_use_EQ) ||
2890 ProfileUseArg->getOption().matches(
2891 options::OPT_fprofile_instr_use))) {
2892 SmallString<128> Path(
2893 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2894 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2895 llvm::sys::path::append(Path, "default.profdata");
2896 CmdArgs.push_back(
2897 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2898 }
Diego Novilloa0545962015-07-10 18:00:07 +00002899 }
2900
2901 if (Args.hasArg(options::OPT_ftest_coverage) ||
2902 Args.hasArg(options::OPT_coverage))
2903 CmdArgs.push_back("-femit-coverage-notes");
2904 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2905 false) ||
2906 Args.hasArg(options::OPT_coverage))
2907 CmdArgs.push_back("-femit-coverage-data");
2908
Diego Novilloc4b94da2015-08-05 23:27:40 +00002909 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2910 options::OPT_fno_coverage_mapping, false) &&
2911 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002912 D.Diag(diag::err_drv_argument_only_allowed_with)
2913 << "-fcoverage-mapping"
2914 << "-fprofile-instr-generate";
2915
Diego Novilloc4b94da2015-08-05 23:27:40 +00002916 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2917 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002918 CmdArgs.push_back("-fcoverage-mapping");
2919
2920 if (C.getArgs().hasArg(options::OPT_c) ||
2921 C.getArgs().hasArg(options::OPT_S)) {
2922 if (Output.isFilename()) {
2923 CmdArgs.push_back("-coverage-file");
2924 SmallString<128> CoverageFilename;
2925 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2926 CoverageFilename = FinalOutput->getValue();
2927 } else {
2928 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2929 }
2930 if (llvm::sys::path::is_relative(CoverageFilename)) {
2931 SmallString<128> Pwd;
2932 if (!llvm::sys::fs::current_path(Pwd)) {
2933 llvm::sys::path::append(Pwd, CoverageFilename);
2934 CoverageFilename.swap(Pwd);
2935 }
2936 }
2937 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2938 }
2939 }
2940}
2941
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002942void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002943 const InputInfo &Output, const InputInfoList &Inputs,
2944 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00002945 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2946 const llvm::Triple Triple(TripleStr);
2947
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002948 bool KernelOrKext =
2949 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002950 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002951 ArgStringList CmdArgs;
2952
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002953 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002954 bool IsWindowsCygnus =
2955 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002956 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2957
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002958 // Check number of inputs for sanity. We need at least one input.
2959 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00002960 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002961 // CUDA compilation may have multiple inputs (source file + results of
2962 // device-side compilations). All other jobs are expected to have exactly one
2963 // input.
2964 bool IsCuda = types::isCuda(Input.getType());
2965 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00002966
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002967 // Invoke ourselves in -cc1 mode.
2968 //
2969 // FIXME: Implement custom jobs for internal actions.
2970 CmdArgs.push_back("-cc1");
2971
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002972 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002973 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002974 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002975
James Y Knight2db38f32015-08-15 03:45:25 +00002976 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
2977 Triple.getArch() == llvm::Triple::thumb)) {
2978 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002979 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00002980 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002981 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00002982 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00002983 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002984 }
2985
Tim Northover336f1892014-03-29 13:16:12 +00002986 // Push all default warning arguments that are specific to
2987 // the given target. These come before user provided warning options
2988 // are provided.
2989 getToolChain().addClangWarningOptions(CmdArgs);
2990
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002991 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002992 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002993
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002994 if (isa<AnalyzeJobAction>(JA)) {
2995 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2996 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002997 } else if (isa<MigrateJobAction>(JA)) {
2998 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002999 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003000 if (Output.getType() == types::TY_Dependencies)
3001 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003002 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003003 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003004 if (Args.hasArg(options::OPT_rewrite_objc) &&
3005 !Args.hasArg(options::OPT_g_Group))
3006 CmdArgs.push_back("-P");
3007 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003008 } else if (isa<AssembleJobAction>(JA)) {
3009 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003010
David Blaikie9260ed62013-07-25 21:19:01 +00003011 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003012
3013 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003014 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003015 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003016 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003017 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003018
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003019 if (JA.getType() == types::TY_Nothing)
3020 CmdArgs.push_back("-fsyntax-only");
3021 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003022 CmdArgs.push_back("-emit-pch");
3023 else
3024 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003025 } else if (isa<VerifyPCHJobAction>(JA)) {
3026 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003027 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003028 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3029 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003030
Renato Golin7c542b42015-07-27 23:44:45 +00003031 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003032 CmdArgs.push_back("-flto");
3033 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003034 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003035 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003036 } else if (JA.getType() == types::TY_LLVM_IR ||
3037 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003038 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003039 } else if (JA.getType() == types::TY_LLVM_BC ||
3040 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003041 CmdArgs.push_back("-emit-llvm-bc");
3042 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003043 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003044 } else if (JA.getType() == types::TY_AST) {
3045 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003046 } else if (JA.getType() == types::TY_ModuleFile) {
3047 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003048 } else if (JA.getType() == types::TY_RewrittenObjC) {
3049 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003050 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003051 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3052 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003053 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003054 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003055 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003056 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003057
3058 // Preserve use-list order by default when emitting bitcode, so that
3059 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3060 // same result as running passes here. For LTO, we don't need to preserve
3061 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003062 if (JA.getType() == types::TY_LLVM_BC)
3063 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003064 }
3065
Justin Bognera88f0122014-06-20 22:59:50 +00003066 // We normally speed up the clang process a bit by skipping destructors at
3067 // exit, but when we're generating diagnostics we can rely on some of the
3068 // cleanup.
3069 if (!C.isForDiagnostics())
3070 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003071
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003072// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003073#ifdef NDEBUG
3074 CmdArgs.push_back("-disable-llvm-verifier");
3075#endif
3076
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003077 // Set the main file name, so that debug info works even with
3078 // -save-temps.
3079 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003080 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003081
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003082 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003083 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003084 if (Args.hasArg(options::OPT_static))
3085 CmdArgs.push_back("-static-define");
3086
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003087 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003088 // Enable region store model by default.
3089 CmdArgs.push_back("-analyzer-store=region");
3090
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003091 // Treat blocks as analysis entry points.
3092 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3093
Ted Kremenek49c79792011-03-24 00:28:47 +00003094 CmdArgs.push_back("-analyzer-eagerly-assume");
3095
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003096 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003097 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003098 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003099
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003100 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003101 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003102
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003103 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003104 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003105
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003106 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003107
Artem Belevichba558952015-05-06 18:20:23 +00003108 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003109 CmdArgs.push_back("-analyzer-checker=cplusplus");
3110
Nico Webere8e53112014-05-11 01:04:02 +00003111 // Enable the following experimental checkers for testing.
3112 CmdArgs.push_back(
3113 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003114 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3115 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003116 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003117 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3118 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003119 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003120
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003121 // Set the output format. The default is plist, for (lame) historical
3122 // reasons.
3123 CmdArgs.push_back("-analyzer-output");
3124 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003125 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003126 else
3127 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003128
Ted Kremenekfe449a22010-03-22 22:32:05 +00003129 // Disable the presentation of standard compiler warnings when
3130 // using --analyze. We only want to show static analyzer diagnostics
3131 // or frontend errors.
3132 CmdArgs.push_back("-w");
3133
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003134 // Add -Xanalyzer arguments when running as analyzer.
3135 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003136 }
3137
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003138 CheckCodeGenerationOptions(D, Args);
3139
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003140 bool PIE = getToolChain().isPIEDefault();
3141 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003142 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003143
Alexey Bataev40e75222014-01-28 06:30:35 +00003144 // Android-specific defaults for PIC/PIE
3145 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003146 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00003147 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003148 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00003149 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003150 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00003151 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00003152 case llvm::Triple::mips:
3153 case llvm::Triple::mipsel:
3154 case llvm::Triple::mips64:
3155 case llvm::Triple::mips64el:
3156 PIC = true; // "-fpic"
3157 break;
3158
3159 case llvm::Triple::x86:
3160 case llvm::Triple::x86_64:
3161 PIC = true; // "-fPIC"
3162 IsPICLevelTwo = true;
3163 break;
3164
3165 default:
3166 break;
3167 }
3168 }
3169
Brad Smith5b05db82014-06-24 19:51:29 +00003170 // OpenBSD-specific defaults for PIE
3171 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003172 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00003173 case llvm::Triple::mips64:
3174 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003175 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00003176 case llvm::Triple::x86:
3177 case llvm::Triple::x86_64:
3178 IsPICLevelTwo = false; // "-fpie"
3179 break;
3180
3181 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00003182 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00003183 case llvm::Triple::sparcv9:
3184 IsPICLevelTwo = true; // "-fPIE"
3185 break;
3186
3187 default:
3188 break;
3189 }
3190 }
3191
Alexey Samsonov090301e2013-04-09 12:28:19 +00003192 // For the PIC and PIE flag options, this logic is different from the
3193 // legacy logic in very old versions of GCC, as that logic was just
3194 // a bug no one had ever fixed. This logic is both more rational and
3195 // consistent with GCC's new logic now that the bugs are fixed. The last
3196 // argument relating to either PIC or PIE wins, and no other argument is
3197 // used. If the last argument is any flavor of the '-fno-...' arguments,
3198 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
3199 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003200 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3201 options::OPT_fpic, options::OPT_fno_pic,
3202 options::OPT_fPIE, options::OPT_fno_PIE,
3203 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00003204 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3205 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003206 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00003207 if (LastPICArg) {
3208 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003209 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3210 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3211 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003212 PIC =
3213 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3214 IsPICLevelTwo =
3215 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003216 } else {
3217 PIE = PIC = false;
3218 }
3219 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003220 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00003221
Nick Lewycky609dd662013-10-11 03:33:53 +00003222 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00003223 // specified while enabling PIC enabled level 1 PIC, just force it back to
3224 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
3225 // informal testing).
3226 if (PIC && getToolChain().getTriple().isOSDarwin())
3227 IsPICLevelTwo |= getToolChain().isPICDefault();
3228
Chandler Carruthc0c04552012-04-08 16:40:35 +00003229 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3230 // PIC or PIE options above, if these show up, PIC is disabled.
Bob Wilson5f4346d2014-12-02 00:27:35 +00003231 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003232 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003233 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003234 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003235
Chandler Carruth76a943b2012-11-19 03:52:03 +00003236 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3237 // This is a very special mode. It trumps the other modes, almost no one
3238 // uses it, and it isn't even valid on any OS but Darwin.
3239 if (!getToolChain().getTriple().isOSDarwin())
3240 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003241 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003242
3243 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3244
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003245 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003246 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003247
Chandler Carruth76a943b2012-11-19 03:52:03 +00003248 // Only a forced PIC mode can cause the actual compile to have PIC defines
3249 // etc., no flags are sufficient. This behavior was selected to closely
3250 // match that of llvm-gcc and Apple GCC before that.
3251 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3252 CmdArgs.push_back("-pic-level");
3253 CmdArgs.push_back("2");
3254 }
3255 } else {
3256 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3257 // handled in Clang's IRGen by the -pie-level flag.
3258 CmdArgs.push_back("-mrelocation-model");
3259 CmdArgs.push_back(PIC ? "pic" : "static");
3260
3261 if (PIC) {
3262 CmdArgs.push_back("-pic-level");
3263 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3264 if (PIE) {
3265 CmdArgs.push_back("-pie-level");
3266 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3267 }
3268 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003269 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003270
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003271 CmdArgs.push_back("-mthread-model");
3272 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3273 CmdArgs.push_back(A->getValue());
3274 else
3275 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3276
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003277 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3278
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003279 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3280 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003281 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003282
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003283 // LLVM Code Generator Options.
3284
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003285 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3286 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003287 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3288 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003289 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003290 CmdArgs.push_back(A->getValue());
3291 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003292 }
3293 }
3294
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003295 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3296 StringRef v = A->getValue();
3297 CmdArgs.push_back("-mllvm");
3298 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3299 A->claim();
3300 }
3301
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003302 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3303 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003304 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003305 }
3306
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003307 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3308 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003309 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003310 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003311 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003312 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3313 CmdArgs.push_back("-fpcc-struct-return");
3314 } else {
3315 assert(A->getOption().matches(options::OPT_freg_struct_return));
3316 CmdArgs.push_back("-freg-struct-return");
3317 }
3318 }
3319
Roman Divacky65b88cd2011-03-01 17:40:53 +00003320 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3321 CmdArgs.push_back("-mrtd");
3322
Rafael Espindola224dd632011-12-14 21:02:23 +00003323 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003324 CmdArgs.push_back("-mdisable-fp-elim");
3325 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3326 options::OPT_fno_zero_initialized_in_bss))
3327 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003328
3329 bool OFastEnabled = isOptimizationLevelFast(Args);
3330 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3331 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003332 OptSpecifier StrictAliasingAliasOption =
3333 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003334 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3335 // doesn't do any TBAA.
3336 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003337 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003338 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003339 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003340 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3341 options::OPT_fno_struct_path_tbaa))
3342 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003343 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3344 false))
3345 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003346 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3347 options::OPT_fno_optimize_sibling_calls))
3348 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003349
Eric Christopher006208c2013-04-04 06:29:47 +00003350 // Handle segmented stacks.
3351 if (Args.hasArg(options::OPT_fsplit_stack))
3352 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003353
3354 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3355 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003356 OptSpecifier FastMathAliasOption =
3357 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3358
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003359 // Handle various floating point optimization flags, mapping them to the
3360 // appropriate LLVM code generation flags. The pattern for all of these is to
3361 // default off the codegen optimizations, and if any flag enables them and no
3362 // flag disables them after the flag enabling them, enable the codegen
3363 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003364 if (Arg *A = Args.getLastArg(
3365 options::OPT_ffast_math, FastMathAliasOption,
3366 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3367 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3368 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003369 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3370 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003371 A->getOption().getID() != options::OPT_fhonor_infinities)
3372 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003373 if (Arg *A = Args.getLastArg(
3374 options::OPT_ffast_math, FastMathAliasOption,
3375 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3376 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3377 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003378 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3379 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003380 A->getOption().getID() != options::OPT_fhonor_nans)
3381 CmdArgs.push_back("-menable-no-nans");
3382
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003383 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3384 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003385 if (Arg *A =
3386 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3387 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3388 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003389 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3390 // However, turning *off* -ffast_math merely restores the toolchain default
3391 // (which may be false).
3392 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3393 A->getOption().getID() == options::OPT_ffast_math ||
3394 A->getOption().getID() == options::OPT_Ofast)
3395 MathErrno = false;
3396 else if (A->getOption().getID() == options::OPT_fmath_errno)
3397 MathErrno = true;
3398 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003399 if (MathErrno)
3400 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003401
3402 // There are several flags which require disabling very specific
3403 // optimizations. Any of these being disabled forces us to turn off the
3404 // entire set of LLVM optimizations, so collect them through all the flag
3405 // madness.
3406 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003407 if (Arg *A = Args.getLastArg(
3408 options::OPT_ffast_math, FastMathAliasOption,
3409 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3410 options::OPT_fno_unsafe_math_optimizations,
3411 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003412 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3413 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003414 A->getOption().getID() != options::OPT_fno_associative_math)
3415 AssociativeMath = true;
3416 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003417 if (Arg *A = Args.getLastArg(
3418 options::OPT_ffast_math, FastMathAliasOption,
3419 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3420 options::OPT_fno_unsafe_math_optimizations,
3421 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003422 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3423 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003424 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3425 ReciprocalMath = true;
3426 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003427 if (Arg *A = Args.getLastArg(
3428 options::OPT_ffast_math, FastMathAliasOption,
3429 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3430 options::OPT_fno_unsafe_math_optimizations,
3431 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003432 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3433 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003434 A->getOption().getID() != options::OPT_fsigned_zeros)
3435 SignedZeros = false;
3436 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003437 if (Arg *A = Args.getLastArg(
3438 options::OPT_ffast_math, FastMathAliasOption,
3439 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3440 options::OPT_fno_unsafe_math_optimizations,
3441 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003442 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3443 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003444 A->getOption().getID() != options::OPT_ftrapping_math)
3445 TrappingMath = false;
3446 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3447 !TrappingMath)
3448 CmdArgs.push_back("-menable-unsafe-fp-math");
3449
Sanjay Patel76c9e092015-01-23 16:40:50 +00003450 if (!SignedZeros)
3451 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003452
Sanjay Patel359b1052015-04-09 15:03:23 +00003453 if (ReciprocalMath)
3454 CmdArgs.push_back("-freciprocal-math");
3455
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003456 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003457 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003458 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003459 options::OPT_ffp_contract)) {
3460 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003461 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003462 if (Val == "fast" || Val == "on" || Val == "off") {
3463 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3464 } else {
3465 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003466 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003467 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003468 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3469 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003470 // If fast-math is set then set the fp-contract mode to fast.
3471 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3472 }
3473 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003474
Sanjay Patel2987c292015-06-11 14:53:41 +00003475 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003476
Bob Wilson6a039162012-07-19 03:52:53 +00003477 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3478 // and if we find them, tell the frontend to provide the appropriate
3479 // preprocessor macros. This is distinct from enabling any optimizations as
3480 // these options induce language changes which must survive serialization
3481 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003482 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3483 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003484 if (!A->getOption().matches(options::OPT_fno_fast_math))
3485 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003486 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3487 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003488 if (A->getOption().matches(options::OPT_ffinite_math_only))
3489 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003490
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003491 // Decide whether to use verbose asm. Verbose assembly is the default on
3492 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003493 bool IsIntegratedAssemblerDefault =
3494 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003495 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003496 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003497 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003498 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003499
Rafael Espindolab8a12932015-05-22 20:44:03 +00003500 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3501 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003502 CmdArgs.push_back("-no-integrated-as");
3503
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003504 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3505 CmdArgs.push_back("-mdebug-pass");
3506 CmdArgs.push_back("Structure");
3507 }
3508 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3509 CmdArgs.push_back("-mdebug-pass");
3510 CmdArgs.push_back("Arguments");
3511 }
3512
John McCall8517abc2010-02-19 02:45:38 +00003513 // Enable -mconstructor-aliases except on darwin, where we have to
3514 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003515 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003516 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003517
John McCall7ef5cb32011-03-18 02:56:14 +00003518 // Darwin's kernel doesn't support guard variables; just die if we
3519 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003520 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003521 CmdArgs.push_back("-fforbid-guard-variables");
3522
Douglas Gregordbe39272011-02-01 15:15:22 +00003523 if (Args.hasArg(options::OPT_mms_bitfields)) {
3524 CmdArgs.push_back("-mms-bitfields");
3525 }
John McCall8517abc2010-02-19 02:45:38 +00003526
Daniel Dunbar306945d2009-09-16 06:17:29 +00003527 // This is a coarse approximation of what llvm-gcc actually does, both
3528 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3529 // complicated ways.
3530 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003531 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3532 options::OPT_fno_asynchronous_unwind_tables,
3533 (getToolChain().IsUnwindTablesDefault() ||
3534 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3535 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003536 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3537 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003538 CmdArgs.push_back("-munwind-tables");
3539
Chandler Carruth05fb5852012-11-21 23:40:23 +00003540 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003541
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003542 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3543 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003544 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003545 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003546
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003547 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003548 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003549
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003550 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003551 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003552 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003553 }
3554
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003555 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003556 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003557 if (!CPU.empty()) {
3558 CmdArgs.push_back("-target-cpu");
3559 CmdArgs.push_back(Args.MakeArgString(CPU));
3560 }
3561
Rafael Espindolaeb265472013-08-21 21:59:03 +00003562 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3563 CmdArgs.push_back("-mfpmath");
3564 CmdArgs.push_back(A->getValue());
3565 }
3566
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003567 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003568 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003569
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003570 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003571 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003572 default:
3573 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003574
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003575 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003576 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003577 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003578 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003579 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003580 break;
3581
Tim Northover573cbee2014-05-24 12:52:07 +00003582 case llvm::Triple::aarch64:
3583 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003584 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003585 break;
3586
Eric Christopher0b26a612010-03-02 02:41:08 +00003587 case llvm::Triple::mips:
3588 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003589 case llvm::Triple::mips64:
3590 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003591 AddMIPSTargetArgs(Args, CmdArgs);
3592 break;
3593
Ulrich Weigand8afad612014-07-28 13:17:52 +00003594 case llvm::Triple::ppc:
3595 case llvm::Triple::ppc64:
3596 case llvm::Triple::ppc64le:
3597 AddPPCTargetArgs(Args, CmdArgs);
3598 break;
3599
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003600 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003601 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003602 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003603 AddSparcTargetArgs(Args, CmdArgs);
3604 break;
3605
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003606 case llvm::Triple::x86:
3607 case llvm::Triple::x86_64:
3608 AddX86TargetArgs(Args, CmdArgs);
3609 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003610
3611 case llvm::Triple::hexagon:
3612 AddHexagonTargetArgs(Args, CmdArgs);
3613 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003614 }
3615
Hans Wennborg75958c42013-08-08 00:17:41 +00003616 // Add clang-cl arguments.
3617 if (getToolChain().getDriver().IsCLMode())
3618 AddClangCLArgs(Args, CmdArgs);
3619
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003620 // Pass the linker version in use.
3621 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3622 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003623 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003624 }
3625
Eric Christopherb7d97e92013-04-03 01:58:53 +00003626 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003627 CmdArgs.push_back("-momit-leaf-frame-pointer");
3628
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003629 // Explicitly error on some things we know we don't support and can't just
3630 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003631 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003632 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3633 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003634 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003635 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003636 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3637 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003638 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003639 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003640 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003641 }
3642
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003643 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003644 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003645 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003646 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003647 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3648 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003649 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003650 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003651 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003652
Chad Rosierbe10f982011-08-02 17:58:04 +00003653 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003654 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003655 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3656 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003657 }
3658
Manman Ren17bdb0f2013-11-20 20:22:14 +00003659 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3660 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003661 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003662 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003663 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003664 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3665 A->getOption().matches(options::OPT_g1)) &&
3666 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003667 // FIXME: we should support specifying dwarf version with
3668 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003669 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003670 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003671 const llvm::Triple &Triple = getToolChain().getTriple();
3672 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003673 Triple.getOS() == llvm::Triple::FreeBSD ||
3674 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003675 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003676 SplitDwarfArg = nullptr;
Manman Ren17bdb0f2013-11-20 20:22:14 +00003677 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003678 CmdArgs.push_back("-gdwarf-2");
3679 else if (A->getOption().matches(options::OPT_gdwarf_3))
3680 CmdArgs.push_back("-gdwarf-3");
3681 else if (A->getOption().matches(options::OPT_gdwarf_4))
3682 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003683 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003684 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003685 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003686 const llvm::Triple &Triple = getToolChain().getTriple();
3687 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003688 Triple.getOS() == llvm::Triple::FreeBSD ||
3689 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003690 CmdArgs.push_back("-gdwarf-2");
3691 else
3692 CmdArgs.push_back("-g");
3693 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003694 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003695
Reid Kleckner124955a2015-08-05 18:51:13 +00003696 // Forward -gcodeview.
3697 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3698
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003699 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3700 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003701 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3702 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003703 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003704
Eric Christopher138c32b2013-09-13 22:37:55 +00003705 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003706 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3707 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003708 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003709 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003710 CmdArgs.push_back("-g");
3711 CmdArgs.push_back("-backend-option");
3712 CmdArgs.push_back("-split-dwarf=Enable");
3713 }
3714
Eric Christopher138c32b2013-09-13 22:37:55 +00003715 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3716 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3717 CmdArgs.push_back("-backend-option");
3718 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3719 }
Eric Christophereec89c22013-06-18 00:03:50 +00003720
Eric Christopher0d403d22014-02-14 01:27:03 +00003721 // -gdwarf-aranges turns on the emission of the aranges section in the
3722 // backend.
3723 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3724 CmdArgs.push_back("-backend-option");
3725 CmdArgs.push_back("-generate-arange-section");
3726 }
3727
David Blaikief36d9ba2014-01-27 18:52:43 +00003728 if (Args.hasFlag(options::OPT_fdebug_types_section,
3729 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003730 CmdArgs.push_back("-backend-option");
3731 CmdArgs.push_back("-generate-type-units");
3732 }
Eric Christophereec89c22013-06-18 00:03:50 +00003733
Ed Schouten6e576152015-03-26 17:50:28 +00003734 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3735 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3736
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003737 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003738 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003739 CmdArgs.push_back("-ffunction-sections");
3740 }
3741
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003742 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3743 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003744 CmdArgs.push_back("-fdata-sections");
3745 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003746
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003747 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003748 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003749 CmdArgs.push_back("-fno-unique-section-names");
3750
Chris Lattner3c77a352010-06-22 00:03:40 +00003751 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3752
Diego Novilloa0545962015-07-10 18:00:07 +00003753 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003754
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003755 // Pass options for controlling the default header search paths.
3756 if (Args.hasArg(options::OPT_nostdinc)) {
3757 CmdArgs.push_back("-nostdsysteminc");
3758 CmdArgs.push_back("-nobuiltininc");
3759 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003760 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003761 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003762 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3763 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3764 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003765
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003766 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003767 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003768 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003769
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003770 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3771
Ted Kremenekf7639e12012-03-06 20:06:33 +00003772 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003773 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003774 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003775 options::OPT_ccc_arcmt_modify,
3776 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003777 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003778 switch (A->getOption().getID()) {
3779 default:
3780 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003781 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003782 CmdArgs.push_back("-arcmt-check");
3783 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003784 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003785 CmdArgs.push_back("-arcmt-modify");
3786 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003787 case options::OPT_ccc_arcmt_migrate:
3788 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003789 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003790 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003791
3792 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3793 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003794 break;
John McCalld70fb982011-06-15 23:25:17 +00003795 }
3796 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003797 } else {
3798 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3799 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3800 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003801 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003802
Ted Kremenekf7639e12012-03-06 20:06:33 +00003803 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3804 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003805 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3806 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003807 }
3808 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003809 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003810
3811 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003812 options::OPT_objcmt_migrate_subscripting,
3813 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003814 // None specified, means enable them all.
3815 CmdArgs.push_back("-objcmt-migrate-literals");
3816 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003817 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003818 } else {
3819 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3820 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003821 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003822 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003823 } else {
3824 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3825 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3826 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3827 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3828 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3829 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003830 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003831 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3832 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3833 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3834 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3835 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3836 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3837 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003838 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003839 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003840 }
3841
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003842 // Add preprocessing options like -I, -D, etc. if we are using the
3843 // preprocessor.
3844 //
3845 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003846 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003847 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003848
Rafael Espindolaa7431922011-07-21 23:40:37 +00003849 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3850 // that "The compiler can only warn and ignore the option if not recognized".
3851 // When building with ccache, it will pass -D options to clang even on
3852 // preprocessed inputs and configure concludes that -fPIC is not supported.
3853 Args.ClaimAllArgs(options::OPT_D);
3854
Alp Toker7874bdc2013-11-15 20:40:58 +00003855 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003856 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3857 if (A->getOption().matches(options::OPT_O4)) {
3858 CmdArgs.push_back("-O3");
3859 D.Diag(diag::warn_O4_is_O3);
3860 } else {
3861 A->render(Args, CmdArgs);
3862 }
3863 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003864
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003865 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003866 for (const Arg *A :
3867 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3868 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003869 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003870 }
3871
Rafael Espindola577637a2015-01-03 00:06:04 +00003872 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003873
Richard Smith3be1cb22014-08-07 00:24:21 +00003874 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003875 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003876 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3877 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003878 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003879 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003880
3881 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003882 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003883 //
3884 // If a std is supplied, only add -trigraphs if it follows the
3885 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003886 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003887 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3888 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003889 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003890 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003891 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003892 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003893 else
3894 Std->render(Args, CmdArgs);
3895
Nico Weber00721502014-12-23 22:32:37 +00003896 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003897 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003898 options::OPT_ftrigraphs,
3899 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003900 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003901 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003902 } else {
3903 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003904 //
3905 // FIXME: Clang doesn't correctly handle -std= when the input language
3906 // doesn't match. For the time being just ignore this for C++ inputs;
3907 // eventually we want to do all the standard defaulting here instead of
3908 // splitting it between the driver and clang -cc1.
3909 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003910 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3911 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003912 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003913 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003914
Nico Weber00721502014-12-23 22:32:37 +00003915 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3916 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003917 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003918
Richard Smith282b4492013-09-04 22:50:31 +00003919 // GCC's behavior for -Wwrite-strings is a bit strange:
3920 // * In C, this "warning flag" changes the types of string literals from
3921 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3922 // for the discarded qualifier.
3923 // * In C++, this is just a normal warning flag.
3924 //
3925 // Implementing this warning correctly in C is hard, so we follow GCC's
3926 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3927 // a non-const char* in C, rather than using this crude hack.
3928 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003929 // FIXME: This should behave just like a warning flag, and thus should also
3930 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3931 Arg *WriteStrings =
3932 Args.getLastArg(options::OPT_Wwrite_strings,
3933 options::OPT_Wno_write_strings, options::OPT_w);
3934 if (WriteStrings &&
3935 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003936 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003937 }
3938
Chandler Carruth61fbf622011-04-23 09:27:53 +00003939 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003940 // during C++ compilation, which it is by default. GCC keeps this define even
3941 // in the presence of '-w', match this behavior bug-for-bug.
3942 if (types::isCXX(InputType) &&
3943 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3944 true)) {
3945 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003946 }
3947
Chandler Carruthe0391482010-05-22 02:21:53 +00003948 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3949 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3950 if (Asm->getOption().matches(options::OPT_fasm))
3951 CmdArgs.push_back("-fgnu-keywords");
3952 else
3953 CmdArgs.push_back("-fno-gnu-keywords");
3954 }
3955
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003956 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3957 CmdArgs.push_back("-fno-dwarf-directory-asm");
3958
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003959 if (ShouldDisableAutolink(Args, getToolChain()))
3960 CmdArgs.push_back("-fno-autolink");
3961
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003962 // Add in -fdebug-compilation-dir if necessary.
3963 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003964
Richard Smith9a568822011-11-21 19:36:32 +00003965 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3966 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003967 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003968 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003969 }
3970
Richard Smith79c927b2013-11-06 19:31:51 +00003971 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3972 CmdArgs.push_back("-foperator-arrow-depth");
3973 CmdArgs.push_back(A->getValue());
3974 }
3975
Richard Smith9a568822011-11-21 19:36:32 +00003976 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3977 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003978 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003979 }
3980
Richard Smitha3d3bd22013-05-08 02:12:03 +00003981 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3982 CmdArgs.push_back("-fconstexpr-steps");
3983 CmdArgs.push_back(A->getValue());
3984 }
3985
Richard Smithb3a14522013-02-22 01:59:51 +00003986 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3987 CmdArgs.push_back("-fbracket-depth");
3988 CmdArgs.push_back(A->getValue());
3989 }
3990
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003991 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3992 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003993 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003994 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003995 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3996 } else
3997 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003998 }
3999
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004000 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004001 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004002
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004003 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4004 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004005 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004006 }
David Chisnall5778fce2009-08-31 16:41:57 +00004007
Chris Lattnere23003d2010-01-09 21:54:33 +00004008 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4009 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004010 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004011 }
4012
Chris Lattnerb35583d2010-04-07 20:49:23 +00004013 CmdArgs.push_back("-ferror-limit");
4014 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004015 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004016 else
4017 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004018
Chandler Carrutha77a7272010-05-06 04:55:18 +00004019 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4020 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004021 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004022 }
4023
4024 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4025 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004026 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004027 }
4028
Richard Smithf6f003a2011-12-16 19:06:07 +00004029 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4030 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004031 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004032 }
4033
Nick Lewycky24653262014-12-16 21:39:02 +00004034 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4035 CmdArgs.push_back("-fspell-checking-limit");
4036 CmdArgs.push_back(A->getValue());
4037 }
4038
Daniel Dunbar2c978472009-11-04 06:24:47 +00004039 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004040 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004041 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004042 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004043 } else {
4044 // If -fmessage-length=N was not specified, determine whether this is a
4045 // terminal and, if so, implicitly define -fmessage-length appropriately.
4046 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004047 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004048 }
4049
John McCallb4a99d32013-02-19 01:57:35 +00004050 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4051 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4052 options::OPT_fvisibility_ms_compat)) {
4053 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4054 CmdArgs.push_back("-fvisibility");
4055 CmdArgs.push_back(A->getValue());
4056 } else {
4057 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4058 CmdArgs.push_back("-fvisibility");
4059 CmdArgs.push_back("hidden");
4060 CmdArgs.push_back("-ftype-visibility");
4061 CmdArgs.push_back("default");
4062 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004063 }
4064
Douglas Gregor08329632010-06-15 17:05:35 +00004065 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004066
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004067 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4068
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004069 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004070 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4071 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004072 CmdArgs.push_back("-ffreestanding");
4073
Daniel Dunbare357d562009-12-03 18:42:11 +00004074 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004075 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004076 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004077 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4078 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004079 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004080 // Emulated TLS is enabled by default on Android, and can be enabled manually
4081 // with -femulated-tls.
4082 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4083 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4084 EmulatedTLSDefault))
4085 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004086 // AltiVec-like language extensions aren't relevant for assembling.
4087 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004088 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004089 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4090 }
Richard Trieu91844232012-06-26 18:18:47 +00004091 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4092 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004093
Alexey Bataevdb390212015-05-20 04:24:19 +00004094 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004095 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4096 options::OPT_fno_openmp, false))
4097 switch (getOpenMPRuntime(getToolChain(), Args)) {
4098 case OMPRT_OMP:
4099 case OMPRT_IOMP5:
4100 // Clang can generate useful OpenMP code for these two runtime libraries.
4101 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004102
4103 // If no option regarding the use of TLS in OpenMP codegeneration is
4104 // given, decide a default based on the target. Otherwise rely on the
4105 // options and pass the right information to the frontend.
4106 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4107 options::OPT_fnoopenmp_use_tls,
4108 getToolChain().getArch() == llvm::Triple::ppc ||
4109 getToolChain().getArch() == llvm::Triple::ppc64 ||
4110 getToolChain().getArch() == llvm::Triple::ppc64le))
4111 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004112 break;
4113 default:
4114 // By default, if Clang doesn't know how to generate useful OpenMP code
4115 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4116 // down to the actual compilation.
4117 // FIXME: It would be better to have a mode which *only* omits IR
4118 // generation based on the OpenMP support so that we get consistent
4119 // semantic analysis, etc.
4120 break;
4121 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004122
Peter Collingbourne32701642013-11-01 18:16:25 +00004123 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004124 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004125
Eric Christopher459d2712013-02-19 06:16:53 +00004126 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004127 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4128 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4129 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4130 Arch == llvm::Triple::ppc64le))
4131 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4132 << "ppc/ppc64/ppc64le";
4133 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004134
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004135 // -fzvector is incompatible with -faltivec.
4136 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4137 if (Args.hasArg(options::OPT_faltivec))
4138 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4139 << "-faltivec";
4140
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004141 if (getToolChain().SupportsProfiling())
4142 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004143
4144 // -flax-vector-conversions is default.
4145 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4146 options::OPT_fno_lax_vector_conversions))
4147 CmdArgs.push_back("-fno-lax-vector-conversions");
4148
John Brawna7b4ec02015-08-10 11:11:28 +00004149 if (Args.getLastArg(options::OPT_fapple_kext) ||
4150 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004151 CmdArgs.push_back("-fapple-kext");
4152
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004153 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004154 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004155 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004156 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4157 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004158
4159 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4160 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004161 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004162 }
4163
Bob Wilson14adb362012-02-03 06:27:22 +00004164 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004165
Chandler Carruth6e501032011-03-27 00:04:55 +00004166 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4167 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004168 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004169 if (A->getOption().matches(options::OPT_fwrapv))
4170 CmdArgs.push_back("-fwrapv");
4171 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4172 options::OPT_fno_strict_overflow)) {
4173 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4174 CmdArgs.push_back("-fwrapv");
4175 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004176
4177 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4178 options::OPT_fno_reroll_loops))
4179 if (A->getOption().matches(options::OPT_freroll_loops))
4180 CmdArgs.push_back("-freroll-loops");
4181
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004182 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004183 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4184 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004185
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004186 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4187
Daniel Dunbar4930e332009-11-17 08:07:36 +00004188 // -stack-protector=0 is default.
4189 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004190 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4191 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4192 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4193 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4194 Args.ClaimAllArgs(options::OPT_fstack_protector);
4195 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004196 options::OPT_fstack_protector_all,
4197 options::OPT_fstack_protector_strong,
4198 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004199 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004200 StackProtectorLevel = std::max<unsigned>(
4201 LangOptions::SSPOn,
4202 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004203 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004204 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004205 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004206 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004207 } else {
4208 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004209 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004210 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004211 if (StackProtectorLevel) {
4212 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004213 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004214 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004215
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004216 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004217 for (const Arg *A : Args.filtered(options::OPT__param)) {
4218 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004219 if (Str.startswith("ssp-buffer-size=")) {
4220 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004221 CmdArgs.push_back("-stack-protector-buffer-size");
4222 // FIXME: Verify the argument is a valid integer.
4223 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004224 }
Sean Silva14facf32015-06-09 01:57:17 +00004225 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004226 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004227 }
4228
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004229 // Translate -mstackrealign
4230 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4231 false)) {
4232 CmdArgs.push_back("-backend-option");
4233 CmdArgs.push_back("-force-align-stack");
4234 }
4235 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004236 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004237 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4238 }
4239
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004240 if (Args.hasArg(options::OPT_mstack_alignment)) {
4241 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4242 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004243 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004244
Hans Wennborg77dc2362015-01-20 19:45:50 +00004245 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4246 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4247
4248 if (!Size.empty())
4249 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4250 else
4251 CmdArgs.push_back("-mstack-probe-size=0");
4252 }
4253
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004254 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4255 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004256 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4257
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004258 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4259 options::OPT_mno_restrict_it)) {
4260 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4261 CmdArgs.push_back("-backend-option");
4262 CmdArgs.push_back("-arm-restrict-it");
4263 } else {
4264 CmdArgs.push_back("-backend-option");
4265 CmdArgs.push_back("-arm-no-restrict-it");
4266 }
James Y Knight2db38f32015-08-15 03:45:25 +00004267 } else if (Triple.isOSWindows() &&
4268 (Triple.getArch() == llvm::Triple::arm ||
4269 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004270 // Windows on ARM expects restricted IT blocks
4271 CmdArgs.push_back("-backend-option");
4272 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004273 }
4274
Daniel Dunbard18049a2009-04-07 21:16:11 +00004275 // Forward -f options with positive and negative forms; we translate
4276 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004277 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4278 StringRef fname = A->getValue();
4279 if (!llvm::sys::fs::exists(fname))
4280 D.Diag(diag::err_drv_no_such_file) << fname;
4281 else
4282 A->render(Args, CmdArgs);
4283 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004284
John Brawna7b4ec02015-08-10 11:11:28 +00004285 // -fbuiltin is default unless -mkernel is used
4286 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4287 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004288 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004289
Nuno Lopes13c88c72009-12-16 16:59:22 +00004290 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4291 options::OPT_fno_assume_sane_operator_new))
4292 CmdArgs.push_back("-fno-assume-sane-operator-new");
4293
Daniel Dunbar4930e332009-11-17 08:07:36 +00004294 // -fblocks=0 is default.
4295 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004296 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004297 (Args.hasArg(options::OPT_fgnu_runtime) &&
4298 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4299 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004300 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004302 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004303 !getToolChain().hasBlocksRuntime())
4304 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004305 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004306
Richard Smith47972af2015-06-16 00:08:24 +00004307 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004308 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004309 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004310 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004311 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004312 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4313 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004314 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004315 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004316 HaveModules = true;
4317 }
4318 }
4319
Richard Smith47972af2015-06-16 00:08:24 +00004320 // -fmodule-maps enables implicit reading of module map files. By default,
4321 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004322 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4323 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004324 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004325 }
4326
Daniel Jasperac42b752013-10-21 06:34:34 +00004327 // -fmodules-decluse checks that modules used are declared so (off by
4328 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004329 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004330 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004331 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004332 }
4333
Daniel Jasper962b38e2014-04-11 11:47:45 +00004334 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4335 // all #included headers are part of modules.
4336 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004337 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004338 CmdArgs.push_back("-fmodules-strict-decluse");
4339 }
4340
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004341 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4342 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4343 options::OPT_fno_implicit_modules)) {
4344 CmdArgs.push_back("-fno-implicit-modules");
4345 }
4346
Daniel Jasperac42b752013-10-21 06:34:34 +00004347 // -fmodule-name specifies the module that is currently being built (or
4348 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004349 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004350
Richard Smith9887d792014-10-17 01:42:53 +00004351 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004352 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004353 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004354
Richard Smithe842a472014-10-22 02:05:46 +00004355 // -fmodule-file can be used to specify files containing precompiled modules.
4356 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4357
4358 // -fmodule-cache-path specifies where our implicitly-built module files
4359 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004360 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004361 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004362 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004363 if (HaveModules) {
4364 if (C.isForDiagnostics()) {
4365 // When generating crash reports, we want to emit the modules along with
4366 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004367 Path = Output.getFilename();
4368 llvm::sys::path::replace_extension(Path, ".cache");
4369 llvm::sys::path::append(Path, "modules");
4370 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004371 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004372 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004373 llvm::sys::path::append(Path, "org.llvm.clang.");
4374 appendUserToPath(Path);
4375 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004376 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004377 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004378 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4379 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004380 }
4381
4382 // When building modules and generating crashdumps, we need to dump a module
4383 // dependency VFS alongside the output.
4384 if (HaveModules && C.isForDiagnostics()) {
4385 SmallString<128> VFSDir(Output.getFilename());
4386 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004387 // Add the cache directory as a temp so the crash diagnostics pick it up.
4388 C.addTempFile(Args.MakeArgString(VFSDir));
4389
Justin Bognera88f0122014-06-20 22:59:50 +00004390 llvm::sys::path::append(VFSDir, "vfs");
4391 CmdArgs.push_back("-module-dependency-dir");
4392 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004393 }
4394
Richard Smith9887d792014-10-17 01:42:53 +00004395 if (HaveModules)
4396 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004397
Douglas Gregor35b04d62013-02-07 19:01:24 +00004398 // Pass through all -fmodules-ignore-macro arguments.
4399 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004400 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4401 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004402
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004403 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4404
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004405 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4406 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4407 D.Diag(diag::err_drv_argument_not_allowed_with)
4408 << A->getAsString(Args) << "-fbuild-session-timestamp";
4409
4410 llvm::sys::fs::file_status Status;
4411 if (llvm::sys::fs::status(A->getValue(), Status))
4412 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004413 CmdArgs.push_back(Args.MakeArgString(
4414 "-fbuild-session-timestamp=" +
4415 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004416 }
4417
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004418 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004419 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4420 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004421 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4422
4423 Args.AddLastArg(CmdArgs,
4424 options::OPT_fmodules_validate_once_per_build_session);
4425 }
4426
Ben Langmuirdcf73862014-03-12 00:06:17 +00004427 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4428
John McCalldfea9982010-04-09 19:12:06 +00004429 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004430 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004431 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004432 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004433
Anders Carlssond470fef2010-11-21 00:09:52 +00004434 // -felide-constructors is the default.
4435 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004436 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004437 CmdArgs.push_back("-fno-elide-constructors");
4438
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004439 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004440
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004441 if (KernelOrKext || (types::isCXX(InputType) &&
4442 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4443 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004444 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004445
Tony Linthicum76329bf2011-12-12 21:14:55 +00004446 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004447 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4448 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004449 CmdArgs.push_back("-fshort-enums");
4450
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004451 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004452 if (Arg *A = Args.getLastArg(
4453 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4454 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4455 if (A->getOption().matches(options::OPT_funsigned_char) ||
4456 A->getOption().matches(options::OPT_fno_signed_char)) {
4457 CmdArgs.push_back("-fno-signed-char");
4458 }
4459 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004460 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004461 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004462
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004463 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004464 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4465 options::OPT_fno_use_cxa_atexit,
4466 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004467 getToolChain().getArch() != llvm::Triple::hexagon &&
4468 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004469 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004470 CmdArgs.push_back("-fno-use-cxa-atexit");
4471
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004472 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004473 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004474 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004475 CmdArgs.push_back("-fms-extensions");
4476
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004477 // -fno-use-line-directives is default.
4478 if (Args.hasFlag(options::OPT_fuse_line_directives,
4479 options::OPT_fno_use_line_directives, false))
4480 CmdArgs.push_back("-fuse-line-directives");
4481
Francois Pichet1b4f1632011-09-17 04:32:15 +00004482 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004483 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004484 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004485 (IsWindowsMSVC &&
4486 Args.hasFlag(options::OPT_fms_extensions,
4487 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004488 CmdArgs.push_back("-fms-compatibility");
4489
David Majnemerc371ff02015-03-22 08:39:22 +00004490 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004491 VersionTuple MSVT = visualstudio::getMSVCVersion(
4492 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4493 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004494 CmdArgs.push_back(
4495 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004496
David Majnemer8db91762015-05-18 04:49:30 +00004497 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4498 if (ImplyVCPPCXXVer) {
4499 if (IsMSVC2015Compatible)
4500 CmdArgs.push_back("-std=c++14");
4501 else
4502 CmdArgs.push_back("-std=c++11");
4503 }
4504
Eric Christopher5ecce122013-02-18 00:38:31 +00004505 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004506 if (Args.hasFlag(options::OPT_fborland_extensions,
4507 options::OPT_fno_borland_extensions, false))
4508 CmdArgs.push_back("-fborland-extensions");
4509
David Majnemerc371ff02015-03-22 08:39:22 +00004510 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4511 // than 19.
4512 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4513 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004514 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004515 CmdArgs.push_back("-fno-threadsafe-statics");
4516
Francois Pichet02744872011-09-01 16:38:08 +00004517 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4518 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004519 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004520 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004521 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004522
Chandler Carruthe03aa552010-04-17 20:17:31 +00004523 // -fgnu-keywords default varies depending on language; only pass if
4524 // specified.
4525 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004526 options::OPT_fno_gnu_keywords))
4527 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004528
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004529 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004530 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004531 CmdArgs.push_back("-fgnu89-inline");
4532
Chad Rosier9c76d242012-03-15 22:31:42 +00004533 if (Args.hasArg(options::OPT_fno_inline))
4534 CmdArgs.push_back("-fno-inline");
4535
Chad Rosier64d6be92012-03-06 21:17:19 +00004536 if (Args.hasArg(options::OPT_fno_inline_functions))
4537 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004538
John McCall5fb5df92012-06-20 06:18:46 +00004539 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004540
John McCall5fb5df92012-06-20 06:18:46 +00004541 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004542 // legacy is the default. Except for deployment taget of 10.5,
4543 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4544 // gets ignored silently.
4545 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004546 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4547 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004548 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004549 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004550 if (getToolChain().UseObjCMixedDispatch())
4551 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4552 else
4553 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4554 }
4555 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004556
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004557 // When ObjectiveC legacy runtime is in effect on MacOSX,
4558 // turn on the option to do Array/Dictionary subscripting
4559 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004560 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004561 getToolChain().getTriple().isMacOSX() &&
4562 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4563 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004564 objcRuntime.isNeXTFamily())
4565 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004566
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004567 // -fencode-extended-block-signature=1 is default.
4568 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4569 CmdArgs.push_back("-fencode-extended-block-signature");
4570 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004571
John McCall24fc0de2011-07-06 00:26:06 +00004572 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4573 // NOTE: This logic is duplicated in ToolChains.cpp.
4574 bool ARC = isObjCAutoRefCount(Args);
4575 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004576 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004577
John McCall24fc0de2011-07-06 00:26:06 +00004578 CmdArgs.push_back("-fobjc-arc");
4579
Chandler Carruth491db322011-11-04 07:34:47 +00004580 // FIXME: It seems like this entire block, and several around it should be
4581 // wrapped in isObjC, but for now we just use it here as this is where it
4582 // was being used previously.
4583 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4584 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4585 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4586 else
4587 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4588 }
4589
John McCall24fc0de2011-07-06 00:26:06 +00004590 // Allow the user to enable full exceptions code emission.
4591 // We define off for Objective-CC, on for Objective-C++.
4592 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4593 options::OPT_fno_objc_arc_exceptions,
4594 /*default*/ types::isCXX(InputType)))
4595 CmdArgs.push_back("-fobjc-arc-exceptions");
4596 }
4597
4598 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4599 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004600 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004601 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004602
John McCall24fc0de2011-07-06 00:26:06 +00004603 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4604 // takes precedence.
4605 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4606 if (!GCArg)
4607 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4608 if (GCArg) {
4609 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004610 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004611 } else if (getToolChain().SupportsObjCGC()) {
4612 GCArg->render(Args, CmdArgs);
4613 } else {
4614 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004615 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004616 }
4617 }
4618
Bob Wilsonb111ec92015-03-02 19:01:14 +00004619 if (Args.hasFlag(options::OPT_fapplication_extension,
4620 options::OPT_fno_application_extension, false))
4621 CmdArgs.push_back("-fapplication-extension");
4622
Reid Klecknerc542d372014-06-27 17:02:02 +00004623 // Handle GCC-style exception args.
4624 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004625 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4626 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004627
4628 if (getToolChain().UseSjLjExceptions())
4629 CmdArgs.push_back("-fsjlj-exceptions");
4630
4631 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004632 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4633 options::OPT_fno_assume_sane_operator_new))
4634 CmdArgs.push_back("-fno-assume-sane-operator-new");
4635
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004636 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4637 // most platforms.
4638 if (Args.hasFlag(options::OPT_fsized_deallocation,
4639 options::OPT_fno_sized_deallocation, false))
4640 CmdArgs.push_back("-fsized-deallocation");
4641
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004642 // -fconstant-cfstrings is default, and may be subject to argument translation
4643 // on Darwin.
4644 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4645 options::OPT_fno_constant_cfstrings) ||
4646 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4647 options::OPT_mno_constant_cfstrings))
4648 CmdArgs.push_back("-fno-constant-cfstrings");
4649
John Thompsoned4e2952009-11-05 20:14:16 +00004650 // -fshort-wchar default varies depending on platform; only
4651 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004652 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4653 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004654 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004655
Hans Wennborg28c96312013-07-31 23:39:13 +00004656 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004657 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004658 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004659 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004660
Daniel Dunbar096ed292011-10-05 21:04:55 +00004661 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4662 // -fno-pack-struct doesn't apply to -fpack-struct=.
4663 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004664 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004665 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004666 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004667 } else if (Args.hasFlag(options::OPT_fpack_struct,
4668 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004669 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004670 }
4671
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004672 // Handle -fmax-type-align=N and -fno-type-align
4673 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4674 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4675 if (!SkipMaxTypeAlign) {
4676 std::string MaxTypeAlignStr = "-fmax-type-align=";
4677 MaxTypeAlignStr += A->getValue();
4678 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4679 }
4680 } else if (getToolChain().getTriple().isOSDarwin()) {
4681 if (!SkipMaxTypeAlign) {
4682 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4683 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4684 }
4685 }
4686
John Brawna7b4ec02015-08-10 11:11:28 +00004687 // -fcommon is the default unless compiling kernel code or the target says so
4688 bool NoCommonDefault =
4689 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4690 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4691 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004692 CmdArgs.push_back("-fno-common");
4693
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004694 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004695 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004696 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004697 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004698 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004699 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004700
Daniel Dunbar6358d682010-10-15 22:30:42 +00004701 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004702 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004703 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004704 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004705
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004706 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004707 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4708 StringRef value = inputCharset->getValue();
4709 if (value != "UTF-8")
4710 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4711 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004712 }
4713
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004714 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004715 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4716 StringRef value = execCharset->getValue();
4717 if (value != "UTF-8")
4718 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4719 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004720 }
4721
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004722 // -fcaret-diagnostics is default.
4723 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4724 options::OPT_fno_caret_diagnostics, true))
4725 CmdArgs.push_back("-fno-caret-diagnostics");
4726
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004727 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004728 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004729 options::OPT_fno_diagnostics_fixit_info))
4730 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004731
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004732 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004733 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004734 options::OPT_fno_diagnostics_show_option))
4735 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004736
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004737 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004738 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004739 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004740 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004741 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004742
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004743 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004744 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004745 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004746 }
4747
Chandler Carruthb6766f02011-03-27 01:50:55 +00004748 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004749 options::OPT_fdiagnostics_show_note_include_stack,
4750 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004751 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004752 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004753 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4754 else
4755 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4756 }
4757
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004758 // Color diagnostics are the default, unless the terminal doesn't support
4759 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004760 // Support both clang's -f[no-]color-diagnostics and gcc's
4761 // -f[no-]diagnostics-colors[=never|always|auto].
4762 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004763 for (const auto &Arg : Args) {
4764 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004765 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4766 !O.matches(options::OPT_fdiagnostics_color) &&
4767 !O.matches(options::OPT_fno_color_diagnostics) &&
4768 !O.matches(options::OPT_fno_diagnostics_color) &&
4769 !O.matches(options::OPT_fdiagnostics_color_EQ))
4770 continue;
4771
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004772 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004773 if (O.matches(options::OPT_fcolor_diagnostics) ||
4774 O.matches(options::OPT_fdiagnostics_color)) {
4775 ShowColors = Colors_On;
4776 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4777 O.matches(options::OPT_fno_diagnostics_color)) {
4778 ShowColors = Colors_Off;
4779 } else {
4780 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004781 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004782 if (value == "always")
4783 ShowColors = Colors_On;
4784 else if (value == "never")
4785 ShowColors = Colors_Off;
4786 else if (value == "auto")
4787 ShowColors = Colors_Auto;
4788 else
4789 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004790 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004791 }
4792 }
4793 if (ShowColors == Colors_On ||
4794 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004795 CmdArgs.push_back("-fcolor-diagnostics");
4796
Nico Rieck7857d462013-09-11 00:38:02 +00004797 if (Args.hasArg(options::OPT_fansi_escape_codes))
4798 CmdArgs.push_back("-fansi-escape-codes");
4799
Daniel Dunbardb097022009-06-08 21:13:54 +00004800 if (!Args.hasFlag(options::OPT_fshow_source_location,
4801 options::OPT_fno_show_source_location))
4802 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004803
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004804 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004805 true))
4806 CmdArgs.push_back("-fno-show-column");
4807
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004808 if (!Args.hasFlag(options::OPT_fspell_checking,
4809 options::OPT_fno_spell_checking))
4810 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004811
Chad Rosierc8e56e82012-12-05 21:08:21 +00004812 // -fno-asm-blocks is default.
4813 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4814 false))
4815 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004816
Steven Wucb0d13f2015-01-16 23:05:28 +00004817 // -fgnu-inline-asm is default.
4818 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4819 options::OPT_fno_gnu_inline_asm, true))
4820 CmdArgs.push_back("-fno-gnu-inline-asm");
4821
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004822 // Enable vectorization per default according to the optimization level
4823 // selected. For optimization levels that want vectorization we use the alias
4824 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004825 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004826 OptSpecifier VectorizeAliasOption =
4827 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004828 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004829 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004830 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004831
Chad Rosier136d67d2014-04-28 19:30:57 +00004832 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004833 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004834 OptSpecifier SLPVectAliasOption =
4835 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004836 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004837 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004838 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004839
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004840 // -fno-slp-vectorize-aggressive is default.
4841 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004842 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004843 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004844
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004845 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4846 A->render(Args, CmdArgs);
4847
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004848 // -fdollars-in-identifiers default varies depending on platform and
4849 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004850 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004851 options::OPT_fno_dollars_in_identifiers)) {
4852 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004853 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004854 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004855 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004856 }
4857
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004858 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4859 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004860 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004861 options::OPT_fno_unit_at_a_time)) {
4862 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004863 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004864 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004865
Eli Friedman055c9702011-11-02 01:53:16 +00004866 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4867 options::OPT_fno_apple_pragma_pack, false))
4868 CmdArgs.push_back("-fapple-pragma-pack");
4869
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004870 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004871 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4872 // by default.
4873 if (getToolChain().getArch() == llvm::Triple::le32) {
4874 CmdArgs.push_back("-fno-math-builtin");
4875 }
4876
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004877// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4878//
4879// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004880#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004881 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004882 (getToolChain().getArch() == llvm::Triple::arm ||
4883 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004884 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4885 CmdArgs.push_back("-fno-builtin-strcat");
4886 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4887 CmdArgs.push_back("-fno-builtin-strcpy");
4888 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004889#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004890
Justin Bognera88f0122014-06-20 22:59:50 +00004891 // Enable rewrite includes if the user's asked for it or if we're generating
4892 // diagnostics.
4893 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4894 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004895 if (Args.hasFlag(options::OPT_frewrite_includes,
4896 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004897 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004898 CmdArgs.push_back("-frewrite-includes");
4899
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004900 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004901 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004902 options::OPT_traditional_cpp)) {
4903 if (isa<PreprocessJobAction>(JA))
4904 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004905 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004906 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004907 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004908
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004909 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004910 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004911
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004912 // Handle serialized diagnostics.
4913 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4914 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004915 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004916 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004917
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004918 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4919 CmdArgs.push_back("-fretain-comments-from-system-headers");
4920
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004921 // Forward -fcomment-block-commands to -cc1.
4922 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004923 // Forward -fparse-all-comments to -cc1.
4924 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004925
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004926 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4927 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004928 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004929 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4930 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004931
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004932 // We translate this by hand to the -cc1 argument, since nightly test uses
4933 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004934 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004935 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004936 } else
Sean Silva14facf32015-06-09 01:57:17 +00004937 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004938 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004939
Bob Wilson23a55f12014-12-21 07:00:00 +00004940 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004941 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4942 // by the frontend.
4943 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4944 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004945
Daniel Dunbard67a3222009-03-30 06:36:42 +00004946 if (Output.getType() == types::TY_Dependencies) {
4947 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004948 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004949 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004950 CmdArgs.push_back(Output.getFilename());
4951 } else {
4952 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004953 }
4954
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004955 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004956
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004957 if (Input.isFilename())
4958 CmdArgs.push_back(Input.getFilename());
4959 else
4960 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004961
Chris Lattnere9d7d782009-11-03 19:50:27 +00004962 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4963
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004964 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004965
4966 // Optionally embed the -cc1 level arguments into the debug info, for build
4967 // analysis.
4968 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004969 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004970 for (const auto &Arg : Args)
4971 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004972
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004973 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004974 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004975 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004976 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004977 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004978 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004979 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004980 }
4981 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004982 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004983 }
4984
Eric Christopherd3804002013-02-22 20:12:52 +00004985 // Add the split debug info name to the command lines here so we
4986 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00004987 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004988 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4989 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004990 const char *SplitDwarfOut;
4991 if (SplitDwarf) {
4992 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004993 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004994 CmdArgs.push_back(SplitDwarfOut);
4995 }
4996
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004997 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
4998 // Include them with -fcuda-include-gpubinary.
4999 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005000 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005001 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005002 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005003 }
5004
Eric Christopherd3804002013-02-22 20:12:52 +00005005 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005006 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005007 Output.getType() == types::TY_Object &&
5008 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005009 auto CLCommand =
5010 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005011 C.addCommand(llvm::make_unique<FallbackCommand>(
5012 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005013 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005015 }
5016
Eric Christopherf1545832013-02-22 23:50:16 +00005017 // Handle the debug info splitting at object creation time if we're
5018 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005019 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005020 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005021 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005022
Roman Divacky178e01602011-02-10 16:52:03 +00005023 if (Arg *A = Args.getLastArg(options::OPT_pg))
5024 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005025 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5026 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005027
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005028 // Claim some arguments which clang supports automatically.
5029
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005030 // -fpch-preprocess is used with gcc to add a special marker in the output to
5031 // include the PCH file. Clang's PTH solution is completely transparent, so we
5032 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005033 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005034
Daniel Dunbar17731772009-03-23 19:03:36 +00005035 // Claim some arguments which clang doesn't support, but we don't
5036 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005037 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5038 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005039
Rafael Espindolab0092d72013-09-04 19:37:35 +00005040 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005041 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005042}
5043
John McCall5fb5df92012-06-20 06:18:46 +00005044/// Add options related to the Objective-C runtime/ABI.
5045///
5046/// Returns true if the runtime is non-fragile.
5047ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5048 ArgStringList &cmdArgs,
5049 RewriteKind rewriteKind) const {
5050 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005051 Arg *runtimeArg =
5052 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5053 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005054
5055 // Just forward -fobjc-runtime= to the frontend. This supercedes
5056 // options about fragility.
5057 if (runtimeArg &&
5058 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5059 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005060 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005061 if (runtime.tryParse(value)) {
5062 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005063 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005064 }
5065
5066 runtimeArg->render(args, cmdArgs);
5067 return runtime;
5068 }
5069
5070 // Otherwise, we'll need the ABI "version". Version numbers are
5071 // slightly confusing for historical reasons:
5072 // 1 - Traditional "fragile" ABI
5073 // 2 - Non-fragile ABI, version 1
5074 // 3 - Non-fragile ABI, version 2
5075 unsigned objcABIVersion = 1;
5076 // If -fobjc-abi-version= is present, use that to set the version.
5077 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005078 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005079 if (value == "1")
5080 objcABIVersion = 1;
5081 else if (value == "2")
5082 objcABIVersion = 2;
5083 else if (value == "3")
5084 objcABIVersion = 3;
5085 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005086 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005087 } else {
5088 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005089 bool nonFragileABIIsDefault =
5090 (rewriteKind == RK_NonFragile ||
5091 (rewriteKind == RK_None &&
5092 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005093 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5094 options::OPT_fno_objc_nonfragile_abi,
5095 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005096// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005097#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5098 unsigned nonFragileABIVersion = 1;
5099#else
5100 unsigned nonFragileABIVersion = 2;
5101#endif
5102
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005103 if (Arg *abiArg =
5104 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005105 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005106 if (value == "1")
5107 nonFragileABIVersion = 1;
5108 else if (value == "2")
5109 nonFragileABIVersion = 2;
5110 else
5111 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005112 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005113 }
5114
5115 objcABIVersion = 1 + nonFragileABIVersion;
5116 } else {
5117 objcABIVersion = 1;
5118 }
5119 }
5120
5121 // We don't actually care about the ABI version other than whether
5122 // it's non-fragile.
5123 bool isNonFragile = objcABIVersion != 1;
5124
5125 // If we have no runtime argument, ask the toolchain for its default runtime.
5126 // However, the rewriter only really supports the Mac runtime, so assume that.
5127 ObjCRuntime runtime;
5128 if (!runtimeArg) {
5129 switch (rewriteKind) {
5130 case RK_None:
5131 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5132 break;
5133 case RK_Fragile:
5134 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5135 break;
5136 case RK_NonFragile:
5137 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5138 break;
5139 }
5140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005141 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005142 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5143 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005144 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005145 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5146
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005147 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005148 } else {
5149 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5150 }
5151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005152 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005153 } else {
5154 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005155 // Legacy behaviour is to target the gnustep runtime if we are i
5156 // non-fragile mode or the GCC runtime in fragile mode.
5157 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005158 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005159 else
5160 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005161 }
5162
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005163 cmdArgs.push_back(
5164 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005165 return runtime;
5166}
5167
Reid Klecknerc542d372014-06-27 17:02:02 +00005168static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5169 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5170 I += HaveDash;
5171 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005172}
Reid Klecknerc542d372014-06-27 17:02:02 +00005173
5174struct EHFlags {
5175 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5176 bool Synch;
5177 bool Asynch;
5178 bool NoExceptC;
5179};
5180
5181/// /EH controls whether to run destructor cleanups when exceptions are
5182/// thrown. There are three modifiers:
5183/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5184/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5185/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5186/// - c: Assume that extern "C" functions are implicitly noexcept. This
5187/// modifier is an optimization, so we ignore it for now.
5188/// The default is /EHs-c-, meaning cleanups are disabled.
5189static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5190 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005191
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005192 std::vector<std::string> EHArgs =
5193 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005194 for (auto EHVal : EHArgs) {
5195 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5196 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005197 case 'a':
5198 EH.Asynch = maybeConsumeDash(EHVal, I);
5199 continue;
5200 case 'c':
5201 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5202 continue;
5203 case 's':
5204 EH.Synch = maybeConsumeDash(EHVal, I);
5205 continue;
5206 default:
5207 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005208 }
5209 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5210 break;
5211 }
5212 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005213
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005214 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5215 // can use -Xclang to manually enable C++ EH until then.
5216 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005217
Reid Klecknerc542d372014-06-27 17:02:02 +00005218 return EH;
5219}
5220
Hans Wennborg75958c42013-08-08 00:17:41 +00005221void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5222 unsigned RTOptionID = options::OPT__SLASH_MT;
5223
Hans Wennborgf1a74252013-09-10 20:18:04 +00005224 if (Args.hasArg(options::OPT__SLASH_LDd))
5225 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5226 // but defining _DEBUG is sticky.
5227 RTOptionID = options::OPT__SLASH_MTd;
5228
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005229 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005230 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005231
David Majnemere2afb472015-07-24 06:49:13 +00005232 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005233 switch (RTOptionID) {
5234 case options::OPT__SLASH_MD:
5235 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005236 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005237 CmdArgs.push_back("-D_MT");
5238 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005239 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005240 break;
5241 case options::OPT__SLASH_MDd:
5242 CmdArgs.push_back("-D_DEBUG");
5243 CmdArgs.push_back("-D_MT");
5244 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005245 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005246 break;
5247 case options::OPT__SLASH_MT:
5248 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005249 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005250 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005251 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005252 break;
5253 case options::OPT__SLASH_MTd:
5254 CmdArgs.push_back("-D_DEBUG");
5255 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005256 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005257 break;
5258 default:
5259 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005260 }
5261
David Majnemere2afb472015-07-24 06:49:13 +00005262 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5263 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5264 } else {
5265 CmdArgs.push_back(FlagForCRT.data());
5266
5267 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5268 // users want. The /Za flag to cl.exe turns this off, but it's not
5269 // implemented in clang.
5270 CmdArgs.push_back("--dependent-lib=oldnames");
5271 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005272
Hans Wennborg8858a032014-07-21 23:42:07 +00005273 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5274 // would produce interleaved output, so ignore /showIncludes in such cases.
5275 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5276 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5277 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005278
David Majnemerf6072342014-07-01 22:24:56 +00005279 // This controls whether or not we emit RTTI data for polymorphic types.
5280 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5281 /*default=*/false))
5282 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005283
Reid Kleckner124955a2015-08-05 18:51:13 +00005284 // Emit CodeView if -Z7 is present.
5285 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5286 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5287 // If we are emitting CV but not DWARF, don't build information that LLVM
5288 // can't yet process.
5289 if (EmitCodeView && !EmitDwarf)
5290 CmdArgs.push_back("-gline-tables-only");
5291 if (EmitCodeView)
5292 CmdArgs.push_back("-gcodeview");
5293
Reid Klecknerc542d372014-06-27 17:02:02 +00005294 const Driver &D = getToolChain().getDriver();
5295 EHFlags EH = parseClangCLEHFlags(D, Args);
5296 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005297 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005298 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005299 CmdArgs.push_back("-fexceptions");
5300 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005301
Hans Wennborge50cec32014-06-13 20:59:54 +00005302 // /EP should expand to -E -P.
5303 if (Args.hasArg(options::OPT__SLASH_EP)) {
5304 CmdArgs.push_back("-E");
5305 CmdArgs.push_back("-P");
5306 }
5307
David Majnemera5b195a2015-02-14 01:35:12 +00005308 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005309 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5310 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005311 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5312 else
5313 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5314
5315 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5316 VolatileOptionID = A->getOption().getID();
5317
5318 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5319 CmdArgs.push_back("-fms-volatile");
5320
David Majnemer86c318f2014-02-11 21:05:00 +00005321 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5322 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5323 if (MostGeneralArg && BestCaseArg)
5324 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5325 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5326
5327 if (MostGeneralArg) {
5328 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5329 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5330 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5331
5332 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5333 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5334 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5335 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5336 << FirstConflict->getAsString(Args)
5337 << SecondConflict->getAsString(Args);
5338
5339 if (SingleArg)
5340 CmdArgs.push_back("-fms-memptr-rep=single");
5341 else if (MultipleArg)
5342 CmdArgs.push_back("-fms-memptr-rep=multiple");
5343 else
5344 CmdArgs.push_back("-fms-memptr-rep=virtual");
5345 }
5346
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005347 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5348 A->render(Args, CmdArgs);
5349
Hans Wennborg81f74482013-09-10 01:07:07 +00005350 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5351 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005352 if (Args.hasArg(options::OPT__SLASH_fallback))
5353 CmdArgs.push_back("msvc-fallback");
5354 else
5355 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005356 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005357}
5358
Douglas Katzman95354292015-06-23 20:42:09 +00005359visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005360 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005361 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005362 return CLFallback.get();
5363}
5364
Daniel Sanders7f933f42015-01-30 17:35:23 +00005365void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5366 ArgStringList &CmdArgs) const {
5367 StringRef CPUName;
5368 StringRef ABIName;
5369 const llvm::Triple &Triple = getToolChain().getTriple();
5370 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5371
5372 CmdArgs.push_back("-target-abi");
5373 CmdArgs.push_back(ABIName.data());
5374}
5375
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005376void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005377 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005378 const ArgList &Args,
5379 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005380 ArgStringList CmdArgs;
5381
5382 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5383 const InputInfo &Input = Inputs[0];
5384
James Y Knight2db38f32015-08-15 03:45:25 +00005385 std::string TripleStr =
5386 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5387 const llvm::Triple Triple(TripleStr);
5388
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005389 // Don't warn about "clang -w -c foo.s"
5390 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005391 // and "clang -emit-llvm -c foo.s"
5392 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005393
Rafael Espindola577637a2015-01-03 00:06:04 +00005394 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005395
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005396 // Invoke ourselves in -cc1as mode.
5397 //
5398 // FIXME: Implement custom jobs for internal actions.
5399 CmdArgs.push_back("-cc1as");
5400
5401 // Add the "effective" target triple.
5402 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005403 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5404
5405 // Set the output mode, we currently only expect to be used as a real
5406 // assembler.
5407 CmdArgs.push_back("-filetype");
5408 CmdArgs.push_back("obj");
5409
Eric Christopher45f2e712012-12-18 00:31:10 +00005410 // Set the main file name, so that debug info works even with
5411 // -save-temps or preprocessed assembly.
5412 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005413 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005414
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005415 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005416 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005417 if (!CPU.empty()) {
5418 CmdArgs.push_back("-target-cpu");
5419 CmdArgs.push_back(Args.MakeArgString(CPU));
5420 }
5421
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005422 // Add the target features
5423 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005424 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005425
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005426 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005427 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005428
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005429 // Pass along any -I options so we get proper .include search paths.
5430 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5431
Eric Christopherfc3ee562012-01-10 00:38:01 +00005432 // Determine the original source input.
5433 const Action *SourceAction = &JA;
5434 while (SourceAction->getKind() != Action::InputClass) {
5435 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5436 SourceAction = SourceAction->getInputs()[0];
5437 }
5438
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005439 // Forward -g and handle debug info related flags, assuming we are dealing
5440 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005441 if (SourceAction->getType() == types::TY_Asm ||
5442 SourceAction->getType() == types::TY_PP_Asm) {
5443 Args.ClaimAllArgs(options::OPT_g_Group);
5444 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5445 if (!A->getOption().matches(options::OPT_g0))
5446 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005447
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005448 if (Args.hasArg(options::OPT_gdwarf_2))
5449 CmdArgs.push_back("-gdwarf-2");
5450 if (Args.hasArg(options::OPT_gdwarf_3))
5451 CmdArgs.push_back("-gdwarf-3");
5452 if (Args.hasArg(options::OPT_gdwarf_4))
5453 CmdArgs.push_back("-gdwarf-4");
5454
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005455 // Add the -fdebug-compilation-dir flag if needed.
5456 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005457
5458 // Set the AT_producer to the clang version when using the integrated
5459 // assembler on assembly source files.
5460 CmdArgs.push_back("-dwarf-debug-producer");
5461 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005462
5463 // And pass along -I options
5464 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005465 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005466
5467 // Optionally embed the -cc1as level arguments into the debug info, for build
5468 // analysis.
5469 if (getToolChain().UseDwarfDebugFlags()) {
5470 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005471 for (const auto &Arg : Args)
5472 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005473
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005474 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005475 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5476 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005477 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005478 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005479 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005480 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005481 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005482 }
5483 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005484 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005485 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005486
5487 // FIXME: Add -static support, once we have it.
5488
Daniel Sanders7f933f42015-01-30 17:35:23 +00005489 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005490 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005491 default:
5492 break;
5493
5494 case llvm::Triple::mips:
5495 case llvm::Triple::mipsel:
5496 case llvm::Triple::mips64:
5497 case llvm::Triple::mips64el:
5498 AddMIPSTargetArgs(Args, CmdArgs);
5499 break;
5500 }
5501
David Blaikie372d9502014-01-17 03:17:40 +00005502 // Consume all the warning flags. Usually this would be handled more
5503 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5504 // doesn't handle that so rather than warning about unused flags that are
5505 // actually used, we'll lie by omission instead.
5506 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005507 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5508 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005509
David Blaikie9260ed62013-07-25 21:19:01 +00005510 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5511 getToolChain().getDriver());
5512
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005513 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005514
5515 assert(Output.isFilename() && "Unexpected lipo output.");
5516 CmdArgs.push_back("-o");
5517 CmdArgs.push_back(Output.getFilename());
5518
Daniel Dunbarb440f562010-08-02 02:38:21 +00005519 assert(Input.isFilename() && "Invalid input.");
5520 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005521
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005522 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005523 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005524
5525 // Handle the debug info splitting at object creation time if we're
5526 // creating an object.
5527 // TODO: Currently only works on linux with newer objcopy.
5528 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005529 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005530 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005531 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005532}
5533
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005534void GnuTool::anchor() {}
5535
Daniel Dunbara3246a02009-03-18 08:07:30 +00005536void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005537 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005538 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005539 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005540 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005541 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005542
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005543 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005544 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005545 // Don't forward any -g arguments to assembly steps.
5546 if (isa<AssembleJobAction>(JA) &&
5547 A->getOption().matches(options::OPT_g_Group))
5548 continue;
5549
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005550 // Don't forward any -W arguments to assembly and link steps.
5551 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5552 A->getOption().matches(options::OPT_W_Group))
5553 continue;
5554
Daniel Dunbar2da02722009-03-19 07:55:12 +00005555 // It is unfortunate that we have to claim here, as this means
5556 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005557 // platforms using a generic gcc, even if we are just using gcc
5558 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005559 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005560 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005561 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005562 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005563
Daniel Dunbar4e295052010-01-25 22:35:08 +00005564 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005565
5566 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005567 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005568 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005569 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005571 }
5572
Daniel Dunbar5716d872009-05-02 21:41:52 +00005573 // Try to force gcc to match the tool chain we want, if we recognize
5574 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005575 //
5576 // FIXME: The triple class should directly provide the information we want
5577 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005578 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005579 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005580 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005581 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5582 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005583 CmdArgs.push_back("-m64");
5584
Daniel Dunbarb440f562010-08-02 02:38:21 +00005585 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005586 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005587 CmdArgs.push_back(Output.getFilename());
5588 } else {
5589 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005590 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005591 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005592
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005594
5595 // Only pass -x if gcc will understand it; otherwise hope gcc
5596 // understands the suffix correctly. The main use case this would go
5597 // wrong in is for linker inputs if they happened to have an odd
5598 // suffix; really the only way to get this to happen is a command
5599 // like '-x foobar a.c' which will treat a.c like a linker input.
5600 //
5601 // FIXME: For the linker case specifically, can we safely convert
5602 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005603 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005604 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005605 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5606 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005607 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005608 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005609 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005610 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005611 else if (II.getType() == types::TY_ModuleFile)
5612 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005613 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005614
Daniel Dunbara3246a02009-03-18 08:07:30 +00005615 if (types::canTypeBeUserSpecified(II.getType())) {
5616 CmdArgs.push_back("-x");
5617 CmdArgs.push_back(types::getTypeName(II.getType()));
5618 }
5619
Daniel Dunbarb440f562010-08-02 02:38:21 +00005620 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005621 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005622 else {
5623 const Arg &A = II.getInputArg();
5624
5625 // Reverse translate some rewritten options.
5626 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5627 CmdArgs.push_back("-lstdc++");
5628 continue;
5629 }
5630
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005631 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005632 A.render(Args, CmdArgs);
5633 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005634 }
5635
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005636 const std::string customGCCName = D.getCCCGenericGCCName();
5637 const char *GCCName;
5638 if (!customGCCName.empty())
5639 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005640 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005641 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005642 } else
5643 GCCName = "gcc";
5644
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005645 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005646 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005647}
5648
Douglas Katzman95354292015-06-23 20:42:09 +00005649void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5650 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005651 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005652}
5653
Douglas Katzman95354292015-06-23 20:42:09 +00005654void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5655 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005656 const Driver &D = getToolChain().getDriver();
5657
Eric Christophercc7ff502015-01-29 00:56:17 +00005658 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005659 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005660 case types::TY_LLVM_IR:
5661 case types::TY_LTO_IR:
5662 case types::TY_LLVM_BC:
5663 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005664 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005665 break;
5666 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005667 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005668 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005669 case types::TY_Nothing:
5670 CmdArgs.push_back("-fsyntax-only");
5671 break;
5672 default:
5673 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005674 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005675}
5676
Douglas Katzman95354292015-06-23 20:42:09 +00005677void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5678 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005679 // The types are (hopefully) good enough.
5680}
5681
Tony Linthicum76329bf2011-12-12 21:14:55 +00005682// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005683void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5684 ArgStringList &CmdArgs) const {}
5685void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5686 const InputInfo &Output,
5687 const InputInfoList &Inputs,
5688 const ArgList &Args,
5689 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005690 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005691
5692 const Driver &D = getToolChain().getDriver();
5693 ArgStringList CmdArgs;
5694
5695 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005696 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005697 CmdArgs.push_back(Args.MakeArgString(MarchString));
5698
5699 RenderExtraToolArgs(JA, CmdArgs);
5700
5701 if (Output.isFilename()) {
5702 CmdArgs.push_back("-o");
5703 CmdArgs.push_back(Output.getFilename());
5704 } else {
5705 assert(Output.isNothing() && "Unexpected output");
5706 CmdArgs.push_back("-fsyntax-only");
5707 }
5708
Douglas Katzman54366072015-07-27 16:53:08 +00005709 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005710 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005712 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005713
Tony Linthicum76329bf2011-12-12 21:14:55 +00005714 // Only pass -x if gcc will understand it; otherwise hope gcc
5715 // understands the suffix correctly. The main use case this would go
5716 // wrong in is for linker inputs if they happened to have an odd
5717 // suffix; really the only way to get this to happen is a command
5718 // like '-x foobar a.c' which will treat a.c like a linker input.
5719 //
5720 // FIXME: For the linker case specifically, can we safely convert
5721 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005722 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005723 // Don't try to pass LLVM or AST inputs to a generic gcc.
5724 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5725 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5726 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005727 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005728 else if (II.getType() == types::TY_AST)
5729 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005730 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005731 else if (II.getType() == types::TY_ModuleFile)
5732 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005733 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005734
5735 if (II.isFilename())
5736 CmdArgs.push_back(II.getFilename());
5737 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005738 // Don't render as input, we need gcc to do the translations.
5739 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005740 II.getInputArg().render(Args, CmdArgs);
5741 }
5742
5743 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005744 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005745 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005746}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005747
Douglas Katzman95354292015-06-23 20:42:09 +00005748void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5749 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005750 // The types are (hopefully) good enough.
5751}
5752
Douglas Katzman54366072015-07-27 16:53:08 +00005753static void
5754constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5755 const toolchains::HexagonToolChain &ToolChain,
5756 const InputInfo &Output, const InputInfoList &Inputs,
5757 const ArgList &Args, ArgStringList &CmdArgs,
5758 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005759
Matthew Curtise689b052012-12-06 15:46:07 +00005760 const Driver &D = ToolChain.getDriver();
5761
Matthew Curtise689b052012-12-06 15:46:07 +00005762 //----------------------------------------------------------------------------
5763 //
5764 //----------------------------------------------------------------------------
5765 bool hasStaticArg = Args.hasArg(options::OPT_static);
5766 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005767 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005768 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5769 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5770 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005771 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005772 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005773
Matthew Curtise689b052012-12-06 15:46:07 +00005774 //----------------------------------------------------------------------------
5775 // Silence warnings for various options
5776 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005777
Matthew Curtise689b052012-12-06 15:46:07 +00005778 Args.ClaimAllArgs(options::OPT_g_Group);
5779 Args.ClaimAllArgs(options::OPT_emit_llvm);
5780 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5781 // handled somewhere else.
5782 Args.ClaimAllArgs(options::OPT_static_libgcc);
5783
5784 //----------------------------------------------------------------------------
5785 //
5786 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005787 for (const auto &Opt : ToolChain.ExtraOpts)
5788 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005789
Douglas Katzman54366072015-07-27 16:53:08 +00005790 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005791 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005792
Matthew Curtise689b052012-12-06 15:46:07 +00005793 if (buildingLib) {
5794 CmdArgs.push_back("-shared");
5795 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5796 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005797 }
5798
Matthew Curtise689b052012-12-06 15:46:07 +00005799 if (hasStaticArg)
5800 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005801
Matthew Curtise8f80a12012-12-06 17:49:03 +00005802 if (buildPIE && !buildingLib)
5803 CmdArgs.push_back("-pie");
5804
Douglas Katzman54366072015-07-27 16:53:08 +00005805 if (const char *v =
5806 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005807 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005808 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005809 }
5810
Matthew Curtise689b052012-12-06 15:46:07 +00005811 //----------------------------------------------------------------------------
5812 //
5813 //----------------------------------------------------------------------------
5814 CmdArgs.push_back("-o");
5815 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005816
Matthew Curtise689b052012-12-06 15:46:07 +00005817 const std::string MarchSuffix = "/" + MarchString;
5818 const std::string G0Suffix = "/G0";
5819 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005820 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005821 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005822 const std::string StartFilesDir =
5823 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005824
5825 //----------------------------------------------------------------------------
5826 // moslib
5827 //----------------------------------------------------------------------------
5828 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005829 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005830
Sean Silva14facf32015-06-09 01:57:17 +00005831 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5832 A->claim();
5833 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005834 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005835 }
Matthew Curtise689b052012-12-06 15:46:07 +00005836 if (oslibs.empty()) {
5837 oslibs.push_back("standalone");
5838 hasStandalone = true;
5839 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005840
Matthew Curtise689b052012-12-06 15:46:07 +00005841 //----------------------------------------------------------------------------
5842 // Start Files
5843 //----------------------------------------------------------------------------
5844 if (incStdLib && incStartFiles) {
5845
5846 if (!buildingLib) {
5847 if (hasStandalone) {
5848 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005849 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005850 }
5851 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5852 }
5853 std::string initObj = useShared ? "/initS.o" : "/init.o";
5854 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5855 }
5856
5857 //----------------------------------------------------------------------------
5858 // Library Search Paths
5859 //----------------------------------------------------------------------------
5860 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005861 for (const auto &LibPath : LibPaths)
5862 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005863
5864 //----------------------------------------------------------------------------
5865 //
5866 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005867 Args.AddAllArgs(CmdArgs,
5868 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5869 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005870
5871 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5872
5873 //----------------------------------------------------------------------------
5874 // Libraries
5875 //----------------------------------------------------------------------------
5876 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005877 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005878 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5879 CmdArgs.push_back("-lm");
5880 }
5881
5882 CmdArgs.push_back("--start-group");
5883
5884 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005885 for (const std::string &Lib : oslibs)
5886 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005887 CmdArgs.push_back("-lc");
5888 }
5889 CmdArgs.push_back("-lgcc");
5890
5891 CmdArgs.push_back("--end-group");
5892 }
5893
5894 //----------------------------------------------------------------------------
5895 // End files
5896 //----------------------------------------------------------------------------
5897 if (incStdLib && incStartFiles) {
5898 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5899 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5900 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005901}
5902
Douglas Katzman95354292015-06-23 20:42:09 +00005903void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5904 const InputInfo &Output,
5905 const InputInfoList &Inputs,
5906 const ArgList &Args,
5907 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005908
Douglas Katzman54366072015-07-27 16:53:08 +00005909 const toolchains::HexagonToolChain &ToolChain =
5910 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005911
5912 ArgStringList CmdArgs;
5913 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5914 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005915
5916 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005917 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005918 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005919}
5920// Hexagon tools end.
5921
Tom Stellard8fa33092015-07-18 01:49:05 +00005922void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5923 const InputInfo &Output,
5924 const InputInfoList &Inputs,
5925 const ArgList &Args,
5926 const char *LinkingOutput) const {
5927
5928 std::string Linker = getToolChain().GetProgramPath(getShortName());
5929 ArgStringList CmdArgs;
5930 CmdArgs.push_back("-flavor");
5931 CmdArgs.push_back("gnu");
5932 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00005933 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00005934 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5935 CmdArgs.push_back("-o");
5936 CmdArgs.push_back(Output.getFilename());
5937 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5938 CmdArgs, Inputs));
5939}
5940// AMDGPU tools end.
5941
Renato Golin7c542b42015-07-27 23:44:45 +00005942const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005943 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00005944 if (!Arch.empty())
5945 MArch = Arch;
5946 else
Bernard Ogden31561762013-12-12 13:27:11 +00005947 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005948 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005949
5950 // Handle -march=native.
5951 if (MArch == "native") {
5952 std::string CPU = llvm::sys::getHostCPUName();
5953 if (CPU != "generic") {
5954 // Translate the native cpu into the architecture suffix for that CPU.
5955 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5956 // If there is no valid architecture suffix for this CPU we don't know how
5957 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005958 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005959 MArch = "";
5960 else
5961 MArch = std::string("arm") + Suffix;
5962 }
5963 }
5964
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005965 return MArch;
5966}
5967/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005968const char *arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00005969 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005970 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5971 // here means an -march=native that we can't handle, so instead return no CPU.
5972 if (MArch.empty())
5973 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005974
John Brawna95c1a82015-05-08 12:52:18 +00005975 // We need to return an empty string here on invalid MArch values as the
5976 // various places that call this function can't cope with a null result.
5977 const char *result = Triple.getARMCPUForArch(MArch);
5978 if (result)
5979 return result;
5980 else
5981 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005982}
5983
5984/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005985std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005986 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005987 // FIXME: Warn on inconsistent use of -mcpu and -march.
5988 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00005989 if (!CPU.empty()) {
5990 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005991 // Handle -mcpu=native.
5992 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005993 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005994 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005995 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005996 }
5997
Renato Goline17c5802015-07-27 23:44:42 +00005998 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00005999}
6000
6001/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006002/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006003// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006004const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00006005 if (CPU == "generic" &&
6006 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
6007 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006008
Renato Golin3c007252015-05-28 15:05:53 +00006009 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
6010 if (ArchKind == llvm::ARM::AK_INVALID)
6011 return "";
6012 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006013}
6014
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006015void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006016 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006017 if (Args.hasArg(options::OPT_r))
6018 return;
6019
John Brawn94fd9632015-05-21 12:19:49 +00006020 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6021 // to generate BE-8 executables.
6022 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6023 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006024}
6025
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006026mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6027 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6028 .Case("mips1", NanLegacy)
6029 .Case("mips2", NanLegacy)
6030 .Case("mips3", NanLegacy)
6031 .Case("mips4", NanLegacy)
6032 .Case("mips5", NanLegacy)
6033 .Case("mips32", NanLegacy)
6034 .Case("mips32r2", NanLegacy)
6035 .Case("mips32r3", NanLegacy | Nan2008)
6036 .Case("mips32r5", NanLegacy | Nan2008)
6037 .Case("mips32r6", Nan2008)
6038 .Case("mips64", NanLegacy)
6039 .Case("mips64r2", NanLegacy)
6040 .Case("mips64r3", NanLegacy | Nan2008)
6041 .Case("mips64r5", NanLegacy | Nan2008)
6042 .Case("mips64r6", Nan2008)
6043 .Default(NanLegacy);
6044}
6045
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006046bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6047 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6048 return A && (A->getValue() == StringRef(Value));
6049}
6050
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006051bool mips::isUCLibc(const ArgList &Args) {
6052 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006053 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006054}
6055
Daniel Sanders2bf13662014-07-10 14:40:57 +00006056bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006057 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6058 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006059 .Case("2008", true)
6060 .Case("legacy", false)
6061 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006062
6063 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006064 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006065 .Cases("mips32r6", "mips64r6", true)
6066 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006067
6068 return false;
6069}
6070
Daniel Sanders379d44b2014-07-16 11:52:23 +00006071bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006072 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006073 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006074 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006075 return false;
6076
6077 if (ABIName != "32")
6078 return false;
6079
Toma Tabacu94ea6862015-06-16 13:54:13 +00006080 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6081 // present.
6082 if (FloatABI == "soft")
6083 return false;
6084
Daniel Sanders379d44b2014-07-16 11:52:23 +00006085 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006086 .Cases("mips2", "mips3", "mips4", "mips5", true)
6087 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6088 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6089 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006090}
6091
Toma Tabacu94ea6862015-06-16 13:54:13 +00006092bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6093 StringRef CPUName, StringRef ABIName,
6094 StringRef FloatABI) {
6095 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6096
6097 // FPXX shouldn't be used if -msingle-float is present.
6098 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6099 options::OPT_mdouble_float))
6100 if (A->getOption().matches(options::OPT_msingle_float))
6101 UseFPXX = false;
6102
6103 return UseFPXX;
6104}
6105
Tim Northover157d9112014-01-16 08:48:16 +00006106llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006107 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6108 // archs which Darwin doesn't use.
6109
6110 // The matching this routine does is fairly pointless, since it is neither the
6111 // complete architecture list, nor a reasonable subset. The problem is that
6112 // historically the driver driver accepts this and also ties its -march=
6113 // handling to the architecture name, so we need to be careful before removing
6114 // support for it.
6115
6116 // This code must be kept in sync with Clang's Darwin specific argument
6117 // translation.
6118
6119 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006120 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6121 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6122 .Case("ppc64", llvm::Triple::ppc64)
6123 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6124 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6125 llvm::Triple::x86)
6126 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6127 // This is derived from the driver driver.
6128 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6129 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6130 .Cases("armv7s", "xscale", llvm::Triple::arm)
6131 .Case("arm64", llvm::Triple::aarch64)
6132 .Case("r600", llvm::Triple::r600)
6133 .Case("amdgcn", llvm::Triple::amdgcn)
6134 .Case("nvptx", llvm::Triple::nvptx)
6135 .Case("nvptx64", llvm::Triple::nvptx64)
6136 .Case("amdil", llvm::Triple::amdil)
6137 .Case("spir", llvm::Triple::spir)
6138 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006139}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140
Tim Northover157d9112014-01-16 08:48:16 +00006141void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006142 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006143 T.setArch(Arch);
6144
6145 if (Str == "x86_64h")
6146 T.setArchName(Str);
6147 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6148 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006149 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006150 }
6151}
6152
Bob Wilsondecc03e2012-11-23 06:14:39 +00006153const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006154 const InputInfo &Input) {
6155 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006156}
6157
Bob Wilsondecc03e2012-11-23 06:14:39 +00006158const char *Clang::getBaseInputStem(const ArgList &Args,
6159 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006160 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006161
Chris Lattner906bb902011-01-16 08:14:11 +00006162 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006163 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006164
6165 return Str;
6166}
6167
Bob Wilsondecc03e2012-11-23 06:14:39 +00006168const char *Clang::getDependencyFileName(const ArgList &Args,
6169 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006170 // FIXME: Think about this more.
6171 std::string Res;
6172
6173 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006174 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006175 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006176 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006177 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006178 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006179 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006180}
6181
Douglas Katzman95354292015-06-23 20:42:09 +00006182void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6183 const InputInfo &Output,
6184 const InputInfoList &Inputs,
6185 const ArgList &Args,
6186 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006187 const ToolChain &ToolChain = getToolChain();
6188 const Driver &D = ToolChain.getDriver();
6189 ArgStringList CmdArgs;
6190
6191 // Silence warning for "clang -g foo.o -o foo"
6192 Args.ClaimAllArgs(options::OPT_g_Group);
6193 // and "clang -emit-llvm foo.o -o foo"
6194 Args.ClaimAllArgs(options::OPT_emit_llvm);
6195 // and for "clang -w foo.o -o foo". Other warning options are already
6196 // handled somewhere else.
6197 Args.ClaimAllArgs(options::OPT_w);
6198
6199 if (!D.SysRoot.empty())
6200 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6201
6202 // CloudABI only supports static linkage.
6203 CmdArgs.push_back("-Bstatic");
6204 CmdArgs.push_back("--eh-frame-hdr");
6205 CmdArgs.push_back("--gc-sections");
6206
6207 if (Output.isFilename()) {
6208 CmdArgs.push_back("-o");
6209 CmdArgs.push_back(Output.getFilename());
6210 } else {
6211 assert(Output.isNothing() && "Invalid output.");
6212 }
6213
6214 if (!Args.hasArg(options::OPT_nostdlib) &&
6215 !Args.hasArg(options::OPT_nostartfiles)) {
6216 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6217 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6218 }
6219
6220 Args.AddAllArgs(CmdArgs, options::OPT_L);
6221 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6222 for (const auto &Path : Paths)
6223 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006224 Args.AddAllArgs(CmdArgs,
6225 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6226 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006227
Alexey Samsonov907880e2015-06-19 19:57:46 +00006228 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006229 AddGoldPlugin(ToolChain, Args, CmdArgs);
6230
6231 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6232
6233 if (!Args.hasArg(options::OPT_nostdlib) &&
6234 !Args.hasArg(options::OPT_nodefaultlibs)) {
6235 if (D.CCCIsCXX())
6236 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6237 CmdArgs.push_back("-lc");
6238 CmdArgs.push_back("-lcompiler_rt");
6239 }
6240
6241 if (!Args.hasArg(options::OPT_nostdlib) &&
6242 !Args.hasArg(options::OPT_nostartfiles))
6243 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6244
6245 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006246 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006247}
6248
Douglas Katzman95354292015-06-23 20:42:09 +00006249void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6250 const InputInfo &Output,
6251 const InputInfoList &Inputs,
6252 const ArgList &Args,
6253 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006254 ArgStringList CmdArgs;
6255
6256 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6257 const InputInfo &Input = Inputs[0];
6258
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006259 // Determine the original source input.
6260 const Action *SourceAction = &JA;
6261 while (SourceAction->getKind() != Action::InputClass) {
6262 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6263 SourceAction = SourceAction->getInputs()[0];
6264 }
6265
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006266 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006267 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006268 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6269 // FIXME: at run-time detect assembler capabilities or rely on version
6270 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006271 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006272 const llvm::Triple &T(getToolChain().getTriple());
6273 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006274 CmdArgs.push_back("-Q");
6275 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006276
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006277 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006278 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006279 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006280 if (Args.hasArg(options::OPT_gstabs))
6281 CmdArgs.push_back("--gstabs");
6282 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006283 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006284 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006285
Daniel Dunbarbe220842009-03-20 16:06:39 +00006286 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006287 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006288
Daniel Dunbar6d484762010-07-22 01:47:22 +00006289 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006290 if (getToolChain().getArch() == llvm::Triple::x86 ||
6291 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006292 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6293 CmdArgs.push_back("-force_cpusubtype_ALL");
6294
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006295 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006296 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006297 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006298 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006299 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006300 CmdArgs.push_back("-static");
6301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006302 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006303
6304 assert(Output.isFilename() && "Unexpected lipo output.");
6305 CmdArgs.push_back("-o");
6306 CmdArgs.push_back(Output.getFilename());
6307
Daniel Dunbarb440f562010-08-02 02:38:21 +00006308 assert(Input.isFilename() && "Invalid input.");
6309 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006310
6311 // asm_final spec is empty.
6312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006313 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006314 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006315}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006316
Tim Northover157d9112014-01-16 08:48:16 +00006317void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006318
Tim Northover157d9112014-01-16 08:48:16 +00006319void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6320 ArgStringList &CmdArgs) const {
6321 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006322
Daniel Dunbarc1964212009-03-26 16:23:12 +00006323 // Derived from darwin_arch spec.
6324 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006325 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006326
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006327 // FIXME: Is this needed anymore?
6328 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006329 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006330}
6331
Douglas Katzman95354292015-06-23 20:42:09 +00006332bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006333 // We only need to generate a temp path for LTO if we aren't compiling object
6334 // files. When compiling source files, we run 'dsymutil' after linking. We
6335 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006336 for (const auto &Input : Inputs)
6337 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006338 return true;
6339
6340 return false;
6341}
6342
Douglas Katzman95354292015-06-23 20:42:09 +00006343void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6344 ArgStringList &CmdArgs,
6345 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006346 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006347 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006348
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006349 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006350 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6351 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006352 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6353 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006354 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006355 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006356 }
6357
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006358 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006359 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006360 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6361 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006362
Bob Wilson3d27dad2013-08-02 22:25:34 +00006363 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6364 CmdArgs.push_back("-export_dynamic");
6365
Bob Wilsonb111ec92015-03-02 19:01:14 +00006366 // If we are using App Extension restrictions, pass a flag to the linker
6367 // telling it that the compiled code has been audited.
6368 if (Args.hasFlag(options::OPT_fapplication_extension,
6369 options::OPT_fno_application_extension, false))
6370 CmdArgs.push_back("-application_extension");
6371
Bill Wendling313b6bf2012-11-16 23:03:00 +00006372 // If we are using LTO, then automatically create a temporary file path for
6373 // the linker to use, so that it's lifetime will extend past a possible
6374 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006375 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006376 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006377 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006378 C.addTempFile(TmpPath);
6379 CmdArgs.push_back("-object_path_lto");
6380 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006381 }
6382
Daniel Dunbarc1964212009-03-26 16:23:12 +00006383 // Derived from the "link" spec.
6384 Args.AddAllArgs(CmdArgs, options::OPT_static);
6385 if (!Args.hasArg(options::OPT_static))
6386 CmdArgs.push_back("-dynamic");
6387 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6388 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6389 // here. How do we wish to handle such things?
6390 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006391
Daniel Dunbarc1964212009-03-26 16:23:12 +00006392 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006393 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006394 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006395 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006396
6397 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6398 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6399 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6400
6401 Arg *A;
6402 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6403 (A = Args.getLastArg(options::OPT_current__version)) ||
6404 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006405 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6406 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006407
6408 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6409 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6410 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6411 } else {
6412 CmdArgs.push_back("-dylib");
6413
6414 Arg *A;
6415 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6416 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6417 (A = Args.getLastArg(options::OPT_client__name)) ||
6418 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6419 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6420 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006421 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6422 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006423
Daniel Dunbarc1964212009-03-26 16:23:12 +00006424 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6425 "-dylib_compatibility_version");
6426 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6427 "-dylib_current_version");
6428
Tim Northover157d9112014-01-16 08:48:16 +00006429 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006430
6431 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6432 "-dylib_install_name");
6433 }
6434
6435 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6436 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6437 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006438 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006439 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006440 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6441 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6442 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6443 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6444 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6445 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006446 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006447 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6448 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6449 Args.AddAllArgs(CmdArgs, options::OPT_init);
6450
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006451 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006452 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006453
Daniel Dunbarc1964212009-03-26 16:23:12 +00006454 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6455 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6456 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6457 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6458 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006459
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006460 if (const Arg *A =
6461 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6462 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006463 if (A->getOption().matches(options::OPT_fpie) ||
6464 A->getOption().matches(options::OPT_fPIE))
6465 CmdArgs.push_back("-pie");
6466 else
6467 CmdArgs.push_back("-no_pie");
6468 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006469
6470 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6471 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6472 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6473 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6474 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6475 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6476 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6477 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6478 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6479 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6480 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6481 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6482 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6483 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6484 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6485 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006486
Daniel Dunbar84384642011-05-02 21:03:47 +00006487 // Give --sysroot= preference, over the Apple specific behavior to also use
6488 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006489 StringRef sysroot = C.getSysRoot();
6490 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006491 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006492 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006493 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6494 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006495 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006496 }
6497
Daniel Dunbarc1964212009-03-26 16:23:12 +00006498 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6499 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6500 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6501 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6502 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006503 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006504 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6505 Args.AddAllArgs(CmdArgs, options::OPT_y);
6506 Args.AddLastArg(CmdArgs, options::OPT_w);
6507 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6508 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6509 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6510 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6511 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6512 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6513 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6514 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6515 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6516 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6517 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6518 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6519}
6520
Douglas Katzman95354292015-06-23 20:42:09 +00006521void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6522 const InputInfo &Output,
6523 const InputInfoList &Inputs,
6524 const ArgList &Args,
6525 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006526 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006527
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006528 // If the number of arguments surpasses the system limits, we will encode the
6529 // input files in a separate file, shortening the command line. To this end,
6530 // build a list of input file names that can be passed via a file with the
6531 // -filelist linker option.
6532 llvm::opt::ArgStringList InputFileList;
6533
Daniel Dunbarc1964212009-03-26 16:23:12 +00006534 // The logic here is derived from gcc's behavior; most of which
6535 // comes from specs (starting with link_command). Consult gcc for
6536 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006537 ArgStringList CmdArgs;
6538
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006539 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6540 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6541 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006542 for (const auto &Arg : Args)
6543 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006544 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006545 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006546 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006547 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006548 return;
6549 }
6550
Daniel Dunbarc1964212009-03-26 16:23:12 +00006551 // I'm not sure why this particular decomposition exists in gcc, but
6552 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006553 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006554
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006555 // It seems that the 'e' option is completely ignored for dynamic executables
6556 // (the default), and with static executables, the last one wins, as expected.
6557 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6558 options::OPT_Z_Flag, options::OPT_u_Group,
6559 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006560
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006561 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6562 // members of static archive libraries which implement Objective-C classes or
6563 // categories.
6564 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6565 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006566
Daniel Dunbarc1964212009-03-26 16:23:12 +00006567 CmdArgs.push_back("-o");
6568 CmdArgs.push_back(Output.getFilename());
6569
Chad Rosier06fd3c62012-05-16 23:45:12 +00006570 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006571 !Args.hasArg(options::OPT_nostartfiles))
6572 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006573
Peter Collingbournec4122c12015-06-15 21:08:13 +00006574 // SafeStack requires its own runtime libraries
6575 // These libraries should be linked first, to make sure the
6576 // __safestack_init constructor executes before everything else
6577 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6578 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6579 "libclang_rt.safestack_osx.a",
6580 /*AlwaysLink=*/true);
6581 }
6582
Daniel Dunbarc1964212009-03-26 16:23:12 +00006583 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006584
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006585 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6586 options::OPT_fno_openmp, false)) {
6587 switch (getOpenMPRuntime(getToolChain(), Args)) {
6588 case OMPRT_OMP:
6589 CmdArgs.push_back("-lomp");
6590 break;
6591 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006592 CmdArgs.push_back("-lgomp");
6593 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006594 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006595 CmdArgs.push_back("-liomp5");
6596 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006597 case OMPRT_Unknown:
6598 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006599 break;
6600 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006601 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006602
Douglas Gregor9295df02012-05-15 21:00:27 +00006603 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006604 // Build the input file for -filelist (list of linker input files) in case we
6605 // need it later
6606 for (const auto &II : Inputs) {
6607 if (!II.isFilename()) {
6608 // This is a linker input argument.
6609 // We cannot mix input arguments and file names in a -filelist input, thus
6610 // we prematurely stop our list (remaining files shall be passed as
6611 // arguments).
6612 if (InputFileList.size() > 0)
6613 break;
6614
6615 continue;
6616 }
6617
6618 InputFileList.push_back(II.getFilename());
6619 }
6620
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006621 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006622 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006623 // We use arclite library for both ARC and subscripting support.
6624 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6625
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006626 CmdArgs.push_back("-framework");
6627 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006628 // Link libobj.
6629 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006630 }
John McCall31168b02011-06-15 23:02:42 +00006631
Daniel Dunbarc1964212009-03-26 16:23:12 +00006632 if (LinkingOutput) {
6633 CmdArgs.push_back("-arch_multiple");
6634 CmdArgs.push_back("-final_output");
6635 CmdArgs.push_back(LinkingOutput);
6636 }
6637
Daniel Dunbarc1964212009-03-26 16:23:12 +00006638 if (Args.hasArg(options::OPT_fnested_functions))
6639 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006640
Justin Bognerc7701242015-05-12 05:44:36 +00006641 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6642 // paths are different enough from other toolchains that this needs a fair
6643 // amount of refactoring done first.
6644 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6645
Daniel Dunbarc1964212009-03-26 16:23:12 +00006646 if (!Args.hasArg(options::OPT_nostdlib) &&
6647 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006648 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006649 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006650
Daniel Dunbarc1964212009-03-26 16:23:12 +00006651 // link_ssp spec is empty.
6652
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006653 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006654 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006655 }
6656
Chad Rosier06fd3c62012-05-16 23:45:12 +00006657 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006658 !Args.hasArg(options::OPT_nostartfiles)) {
6659 // endfile_spec is empty.
6660 }
6661
6662 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6663 Args.AddAllArgs(CmdArgs, options::OPT_F);
6664
Steven Wu3ffb61b2015-02-06 18:08:29 +00006665 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006666 for (const Arg *A : Args.filtered(options::OPT_iframework))
6667 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006668
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006669 if (!Args.hasArg(options::OPT_nostdlib) &&
6670 !Args.hasArg(options::OPT_nodefaultlibs)) {
6671 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6672 if (A->getValue() == StringRef("Accelerate")) {
6673 CmdArgs.push_back("-framework");
6674 CmdArgs.push_back("Accelerate");
6675 }
6676 }
6677 }
6678
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006679 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006680 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006681 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006682 Cmd->setInputFileList(std::move(InputFileList));
6683 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006684}
6685
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006686void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006687 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006688 const InputInfoList &Inputs,
6689 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006690 const char *LinkingOutput) const {
6691 ArgStringList CmdArgs;
6692
6693 CmdArgs.push_back("-create");
6694 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006695
6696 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006697 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006698
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006699 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006700 assert(II.isFilename() && "Unexpected lipo input.");
6701 CmdArgs.push_back(II.getFilename());
6702 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006703
6704 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006705 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006706}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006707
Daniel Dunbar88299622010-06-04 18:28:36 +00006708void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006709 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006710 const InputInfoList &Inputs,
6711 const ArgList &Args,
6712 const char *LinkingOutput) const {
6713 ArgStringList CmdArgs;
6714
Daniel Dunbareb86b042011-05-09 17:23:16 +00006715 CmdArgs.push_back("-o");
6716 CmdArgs.push_back(Output.getFilename());
6717
Daniel Dunbar88299622010-06-04 18:28:36 +00006718 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6719 const InputInfo &Input = Inputs[0];
6720 assert(Input.isFilename() && "Unexpected dsymutil input.");
6721 CmdArgs.push_back(Input.getFilename());
6722
Daniel Dunbar88299622010-06-04 18:28:36 +00006723 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006724 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006725 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006726}
6727
Eric Christopher551ef452011-08-23 17:56:55 +00006728void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006729 const InputInfo &Output,
6730 const InputInfoList &Inputs,
6731 const ArgList &Args,
6732 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006733 ArgStringList CmdArgs;
6734 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006735 CmdArgs.push_back("--debug-info");
6736 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006737 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006738
6739 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6740 const InputInfo &Input = Inputs[0];
6741 assert(Input.isFilename() && "Unexpected verify input");
6742
6743 // Grabbing the output of the earlier dsymutil run.
6744 CmdArgs.push_back(Input.getFilename());
6745
6746 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006747 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006748 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006749}
6750
Douglas Katzman95354292015-06-23 20:42:09 +00006751void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006752 const InputInfo &Output,
6753 const InputInfoList &Inputs,
6754 const ArgList &Args,
6755 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006756 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006757 ArgStringList CmdArgs;
6758
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006759 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006760
6761 CmdArgs.push_back("-o");
6762 CmdArgs.push_back(Output.getFilename());
6763
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006764 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006765 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006766
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006767 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006768 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006769}
6770
Douglas Katzman95354292015-06-23 20:42:09 +00006771void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6772 const InputInfo &Output,
6773 const InputInfoList &Inputs,
6774 const ArgList &Args,
6775 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006776 // FIXME: Find a real GCC, don't hard-code versions here
6777 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6778 const llvm::Triple &T = getToolChain().getTriple();
6779 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006780 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006781 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006782 case llvm::Triple::x86:
6783 GCCLibPath +=
6784 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6785 break;
6786 case llvm::Triple::x86_64:
6787 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6788 GCCLibPath += "/4.5.2/amd64/";
6789 LibPath += "amd64/";
6790 break;
6791 default:
6792 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006793 }
6794
6795 ArgStringList CmdArgs;
6796
David Chisnall272a0712012-02-29 15:06:12 +00006797 // Demangle C++ names in errors
6798 CmdArgs.push_back("-C");
6799
David Chisnallf571cde2012-02-15 13:39:01 +00006800 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6801 (!Args.hasArg(options::OPT_shared))) {
6802 CmdArgs.push_back("-e");
6803 CmdArgs.push_back("_start");
6804 }
6805
6806 if (Args.hasArg(options::OPT_static)) {
6807 CmdArgs.push_back("-Bstatic");
6808 CmdArgs.push_back("-dn");
6809 } else {
6810 CmdArgs.push_back("-Bdynamic");
6811 if (Args.hasArg(options::OPT_shared)) {
6812 CmdArgs.push_back("-shared");
6813 } else {
6814 CmdArgs.push_back("--dynamic-linker");
6815 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6816 }
6817 }
6818
6819 if (Output.isFilename()) {
6820 CmdArgs.push_back("-o");
6821 CmdArgs.push_back(Output.getFilename());
6822 } else {
6823 assert(Output.isNothing() && "Invalid output.");
6824 }
6825
6826 if (!Args.hasArg(options::OPT_nostdlib) &&
6827 !Args.hasArg(options::OPT_nostartfiles)) {
6828 if (!Args.hasArg(options::OPT_shared)) {
6829 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6830 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006831 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006832 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6833 } else {
6834 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006835 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6836 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006837 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006838 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006839 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006840 }
6841
6842 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6843
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006844 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6845 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006846
6847 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6848
6849 if (!Args.hasArg(options::OPT_nostdlib) &&
6850 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006851 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006852 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006853 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006854 if (!Args.hasArg(options::OPT_shared)) {
6855 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006856 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006857 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006858 }
David Chisnallf571cde2012-02-15 13:39:01 +00006859 }
6860
6861 if (!Args.hasArg(options::OPT_nostdlib) &&
6862 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006863 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006864 }
David Chisnall96de9932012-02-16 16:00:47 +00006865 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006866
Alexey Samsonov7811d192014-02-20 13:57:37 +00006867 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006869 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006870 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006871}
6872
Douglas Katzman95354292015-06-23 20:42:09 +00006873void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6874 const InputInfo &Output,
6875 const InputInfoList &Inputs,
6876 const ArgList &Args,
6877 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006878 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006879 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006880 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006881
Rafael Espindolacc126272014-02-28 01:55:21 +00006882 switch (getToolChain().getArch()) {
6883 case llvm::Triple::x86:
6884 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6885 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006886 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006887 break;
6888
6889 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006890 CmdArgs.push_back("-mppc");
6891 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006892 break;
6893
6894 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006895 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006896 CmdArgs.push_back("-32");
6897 NeedsKPIC = true;
6898 break;
6899
6900 case llvm::Triple::sparcv9:
6901 CmdArgs.push_back("-64");
6902 CmdArgs.push_back("-Av9a");
6903 NeedsKPIC = true;
6904 break;
6905
6906 case llvm::Triple::mips64:
6907 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006908 StringRef CPUName;
6909 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006910 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006911
6912 CmdArgs.push_back("-mabi");
6913 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6914
6915 if (getToolChain().getArch() == llvm::Triple::mips64)
6916 CmdArgs.push_back("-EB");
6917 else
6918 CmdArgs.push_back("-EL");
6919
Rafael Espindolacc126272014-02-28 01:55:21 +00006920 NeedsKPIC = true;
6921 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006922 }
6923
Rafael Espindolacc126272014-02-28 01:55:21 +00006924 default:
6925 break;
6926 }
6927
6928 if (NeedsKPIC)
6929 addAssemblerKPIC(Args, CmdArgs);
6930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006931 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006932
6933 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006934 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006935
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006936 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006937 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006938
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006939 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006940 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006941}
6942
Douglas Katzman95354292015-06-23 20:42:09 +00006943void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6944 const InputInfo &Output,
6945 const InputInfoList &Inputs,
6946 const ArgList &Args,
6947 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006948 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006949 ArgStringList CmdArgs;
6950
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006951 // Silence warning for "clang -g foo.o -o foo"
6952 Args.ClaimAllArgs(options::OPT_g_Group);
6953 // and "clang -emit-llvm foo.o -o foo"
6954 Args.ClaimAllArgs(options::OPT_emit_llvm);
6955 // and for "clang -w foo.o -o foo". Other warning options are already
6956 // handled somewhere else.
6957 Args.ClaimAllArgs(options::OPT_w);
6958
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006959 if (getToolChain().getArch() == llvm::Triple::mips64)
6960 CmdArgs.push_back("-EB");
6961 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6962 CmdArgs.push_back("-EL");
6963
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006964 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006965 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006966 CmdArgs.push_back("-e");
6967 CmdArgs.push_back("__start");
6968 }
6969
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006970 if (Args.hasArg(options::OPT_static)) {
6971 CmdArgs.push_back("-Bstatic");
6972 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006973 if (Args.hasArg(options::OPT_rdynamic))
6974 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006975 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006976 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006977 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006978 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006979 } else {
6980 CmdArgs.push_back("-dynamic-linker");
6981 CmdArgs.push_back("/usr/libexec/ld.so");
6982 }
6983 }
6984
Rafael Espindola044f7832013-06-05 04:28:55 +00006985 if (Args.hasArg(options::OPT_nopie))
6986 CmdArgs.push_back("-nopie");
6987
Daniel Dunbarb440f562010-08-02 02:38:21 +00006988 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006989 CmdArgs.push_back("-o");
6990 CmdArgs.push_back(Output.getFilename());
6991 } else {
6992 assert(Output.isNothing() && "Invalid output.");
6993 }
6994
6995 if (!Args.hasArg(options::OPT_nostdlib) &&
6996 !Args.hasArg(options::OPT_nostartfiles)) {
6997 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006998 if (Args.hasArg(options::OPT_pg))
6999 CmdArgs.push_back(
7000 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007001 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007002 CmdArgs.push_back(
7003 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7004 CmdArgs.push_back(
7005 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007006 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007007 CmdArgs.push_back(
7008 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007009 }
7010 }
7011
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007012 std::string Triple = getToolChain().getTripleString();
7013 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007014 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007015 CmdArgs.push_back(
7016 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007017
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007018 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7019 options::OPT_e, options::OPT_s, options::OPT_t,
7020 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007021
Daniel Dunbar54423b22010-09-17 00:24:54 +00007022 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007023
7024 if (!Args.hasArg(options::OPT_nostdlib) &&
7025 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007026 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007027 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007028 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007029 CmdArgs.push_back("-lm_p");
7030 else
7031 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007032 }
7033
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007034 // FIXME: For some reason GCC passes -lgcc before adding
7035 // the default system libraries. Just mimic this for now.
7036 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007037
Eric Christopher17674ec2012-09-13 06:32:34 +00007038 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007039 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7040 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007041 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007042 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007043 }
7044
Chandler Carruth45661652011-12-17 22:32:42 +00007045 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007046 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007047 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007048 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007049 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007050 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007051
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007052 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007053 }
7054
7055 if (!Args.hasArg(options::OPT_nostdlib) &&
7056 !Args.hasArg(options::OPT_nostartfiles)) {
7057 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007058 CmdArgs.push_back(
7059 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007060 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007061 CmdArgs.push_back(
7062 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007063 }
7064
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007065 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007066 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007067}
Ed Schoutene33194b2009-04-02 19:13:12 +00007068
Douglas Katzman95354292015-06-23 20:42:09 +00007069void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7070 const InputInfo &Output,
7071 const InputInfoList &Inputs,
7072 const ArgList &Args,
7073 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007074 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007075 ArgStringList CmdArgs;
7076
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007077 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007078
7079 CmdArgs.push_back("-o");
7080 CmdArgs.push_back(Output.getFilename());
7081
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007082 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007083 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007084
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007085 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007086 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007087}
7088
Douglas Katzman95354292015-06-23 20:42:09 +00007089void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7090 const InputInfo &Output,
7091 const InputInfoList &Inputs,
7092 const ArgList &Args,
7093 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007094 const Driver &D = getToolChain().getDriver();
7095 ArgStringList CmdArgs;
7096
7097 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7098 (!Args.hasArg(options::OPT_shared))) {
7099 CmdArgs.push_back("-e");
7100 CmdArgs.push_back("__start");
7101 }
7102
7103 if (Args.hasArg(options::OPT_static)) {
7104 CmdArgs.push_back("-Bstatic");
7105 } else {
7106 if (Args.hasArg(options::OPT_rdynamic))
7107 CmdArgs.push_back("-export-dynamic");
7108 CmdArgs.push_back("--eh-frame-hdr");
7109 CmdArgs.push_back("-Bdynamic");
7110 if (Args.hasArg(options::OPT_shared)) {
7111 CmdArgs.push_back("-shared");
7112 } else {
7113 CmdArgs.push_back("-dynamic-linker");
7114 CmdArgs.push_back("/usr/libexec/ld.so");
7115 }
7116 }
7117
7118 if (Output.isFilename()) {
7119 CmdArgs.push_back("-o");
7120 CmdArgs.push_back(Output.getFilename());
7121 } else {
7122 assert(Output.isNothing() && "Invalid output.");
7123 }
7124
7125 if (!Args.hasArg(options::OPT_nostdlib) &&
7126 !Args.hasArg(options::OPT_nostartfiles)) {
7127 if (!Args.hasArg(options::OPT_shared)) {
7128 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007129 CmdArgs.push_back(
7130 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007131 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007132 CmdArgs.push_back(
7133 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7134 CmdArgs.push_back(
7135 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.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("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007139 }
7140 }
7141
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007142 Args.AddAllArgs(CmdArgs,
7143 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007144
7145 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7146
7147 if (!Args.hasArg(options::OPT_nostdlib) &&
7148 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007149 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007150 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7151 if (Args.hasArg(options::OPT_pg))
7152 CmdArgs.push_back("-lm_p");
7153 else
7154 CmdArgs.push_back("-lm");
7155 }
7156
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007157 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007158 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007159 CmdArgs.push_back("-lpthread_p");
7160 else
7161 CmdArgs.push_back("-lpthread");
7162 }
7163
Eli Friedman9fa28852012-08-08 23:57:20 +00007164 if (!Args.hasArg(options::OPT_shared)) {
7165 if (Args.hasArg(options::OPT_pg))
7166 CmdArgs.push_back("-lc_p");
7167 else
7168 CmdArgs.push_back("-lc");
7169 }
7170
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007171 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007172 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007173 case llvm::Triple::arm:
7174 MyArch = "arm";
7175 break;
7176 case llvm::Triple::x86:
7177 MyArch = "i386";
7178 break;
7179 case llvm::Triple::x86_64:
7180 MyArch = "amd64";
7181 break;
7182 default:
7183 llvm_unreachable("Unsupported architecture");
7184 }
7185 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007186 }
7187
7188 if (!Args.hasArg(options::OPT_nostdlib) &&
7189 !Args.hasArg(options::OPT_nostartfiles)) {
7190 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007191 CmdArgs.push_back(
7192 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007193 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007194 CmdArgs.push_back(
7195 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007196 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007197
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007198 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007199 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007200}
7201
Douglas Katzman95354292015-06-23 20:42:09 +00007202void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7203 const InputInfo &Output,
7204 const InputInfoList &Inputs,
7205 const ArgList &Args,
7206 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007207 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007208 ArgStringList CmdArgs;
7209
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007210 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7211 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007212 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007213 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007214 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007215 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007216 else if (getToolChain().getArch() == llvm::Triple::mips ||
7217 getToolChain().getArch() == llvm::Triple::mipsel ||
7218 getToolChain().getArch() == llvm::Triple::mips64 ||
7219 getToolChain().getArch() == llvm::Triple::mips64el) {
7220 StringRef CPUName;
7221 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007222 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007223
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007224 CmdArgs.push_back("-march");
7225 CmdArgs.push_back(CPUName.data());
7226
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007227 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007228 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007229
7230 if (getToolChain().getArch() == llvm::Triple::mips ||
7231 getToolChain().getArch() == llvm::Triple::mips64)
7232 CmdArgs.push_back("-EB");
7233 else
7234 CmdArgs.push_back("-EL");
7235
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007236 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007237 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007238 getToolChain().getArch() == llvm::Triple::armeb ||
7239 getToolChain().getArch() == llvm::Triple::thumb ||
7240 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007241 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007242 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007243 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7244
7245 if (FloatABI == "hard") {
7246 CmdArgs.push_back("-mfpu=vfp");
7247 } else {
7248 CmdArgs.push_back("-mfpu=softvfp");
7249 }
7250
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007251 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007252 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007253 case llvm::Triple::GNUEABI:
7254 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007255 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007256 break;
7257
7258 default:
7259 CmdArgs.push_back("-matpcs");
7260 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007261 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007262 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007263 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007264 if (getToolChain().getArch() == llvm::Triple::sparc)
7265 CmdArgs.push_back("-Av8plusa");
7266 else
7267 CmdArgs.push_back("-Av9a");
7268
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007269 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007270 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007272 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007273
7274 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007275 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007276
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007277 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007278 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007279
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007280 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007281 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007282}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007283
Douglas Katzman95354292015-06-23 20:42:09 +00007284void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7285 const InputInfo &Output,
7286 const InputInfoList &Inputs,
7287 const ArgList &Args,
7288 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007289 const toolchains::FreeBSD &ToolChain =
7290 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007291 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007292 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007293 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007294 !Args.hasArg(options::OPT_shared) &&
7295 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007296 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007297
7298 // Silence warning for "clang -g foo.o -o foo"
7299 Args.ClaimAllArgs(options::OPT_g_Group);
7300 // and "clang -emit-llvm foo.o -o foo"
7301 Args.ClaimAllArgs(options::OPT_emit_llvm);
7302 // and for "clang -w foo.o -o foo". Other warning options are already
7303 // handled somewhere else.
7304 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007305
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007306 if (!D.SysRoot.empty())
7307 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7308
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007309 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007310 CmdArgs.push_back("-pie");
7311
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007312 if (Args.hasArg(options::OPT_static)) {
7313 CmdArgs.push_back("-Bstatic");
7314 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007315 if (Args.hasArg(options::OPT_rdynamic))
7316 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007317 CmdArgs.push_back("--eh-frame-hdr");
7318 if (Args.hasArg(options::OPT_shared)) {
7319 CmdArgs.push_back("-Bshareable");
7320 } else {
7321 CmdArgs.push_back("-dynamic-linker");
7322 CmdArgs.push_back("/libexec/ld-elf.so.1");
7323 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007324 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007325 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7326 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7327 CmdArgs.push_back("--hash-style=both");
7328 }
7329 }
7330 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007331 }
7332
7333 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7334 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007335 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007336 CmdArgs.push_back("-m");
7337 CmdArgs.push_back("elf_i386_fbsd");
7338 }
7339
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007340 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007341 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007342 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007343 }
7344
Daniel Dunbarb440f562010-08-02 02:38:21 +00007345 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007346 CmdArgs.push_back("-o");
7347 CmdArgs.push_back(Output.getFilename());
7348 } else {
7349 assert(Output.isNothing() && "Invalid output.");
7350 }
7351
7352 if (!Args.hasArg(options::OPT_nostdlib) &&
7353 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007354 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007355 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007356 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007357 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007358 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007359 crt1 = "Scrt1.o";
7360 else
7361 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007362 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007363 if (crt1)
7364 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7365
7366 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7367
Craig Topper92fc2df2014-05-17 16:56:41 +00007368 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007369 if (Args.hasArg(options::OPT_static))
7370 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007371 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007372 crtbegin = "crtbeginS.o";
7373 else
7374 crtbegin = "crtbegin.o";
7375
7376 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007377 }
7378
7379 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007380 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007381 for (const auto &Path : Paths)
7382 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007383 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7384 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007385 Args.AddAllArgs(CmdArgs, options::OPT_s);
7386 Args.AddAllArgs(CmdArgs, options::OPT_t);
7387 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7388 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007389
Alexey Samsonov907880e2015-06-19 19:57:46 +00007390 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007391 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007392
Alexey Samsonov52550342014-09-15 19:58:40 +00007393 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007394 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007395
7396 if (!Args.hasArg(options::OPT_nostdlib) &&
7397 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007398 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007399 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007400 if (Args.hasArg(options::OPT_pg))
7401 CmdArgs.push_back("-lm_p");
7402 else
7403 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007404 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007405 if (NeedsSanitizerDeps)
7406 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007407 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7408 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007409 if (Args.hasArg(options::OPT_pg))
7410 CmdArgs.push_back("-lgcc_p");
7411 else
7412 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007413 if (Args.hasArg(options::OPT_static)) {
7414 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007415 } else if (Args.hasArg(options::OPT_pg)) {
7416 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007417 } else {
7418 CmdArgs.push_back("--as-needed");
7419 CmdArgs.push_back("-lgcc_s");
7420 CmdArgs.push_back("--no-as-needed");
7421 }
7422
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007423 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007424 if (Args.hasArg(options::OPT_pg))
7425 CmdArgs.push_back("-lpthread_p");
7426 else
7427 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007428 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007429
Roman Divacky66f22762011-02-10 16:59:40 +00007430 if (Args.hasArg(options::OPT_pg)) {
7431 if (Args.hasArg(options::OPT_shared))
7432 CmdArgs.push_back("-lc");
7433 else
7434 CmdArgs.push_back("-lc_p");
7435 CmdArgs.push_back("-lgcc_p");
7436 } else {
7437 CmdArgs.push_back("-lc");
7438 CmdArgs.push_back("-lgcc");
7439 }
7440
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007441 if (Args.hasArg(options::OPT_static)) {
7442 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007443 } else if (Args.hasArg(options::OPT_pg)) {
7444 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007445 } else {
7446 CmdArgs.push_back("--as-needed");
7447 CmdArgs.push_back("-lgcc_s");
7448 CmdArgs.push_back("--no-as-needed");
7449 }
7450 }
7451
7452 if (!Args.hasArg(options::OPT_nostdlib) &&
7453 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007454 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007455 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007456 else
7457 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007458 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007459 }
7460
Alexey Samsonov7811d192014-02-20 13:57:37 +00007461 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007462
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007463 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007464 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007465}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007466
Douglas Katzman95354292015-06-23 20:42:09 +00007467void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007468 const InputInfo &Output,
7469 const InputInfoList &Inputs,
7470 const ArgList &Args,
7471 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007472 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007473 ArgStringList CmdArgs;
7474
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007475 // GNU as needs different flags for creating the correct output format
7476 // on architectures with different ABIs or optional feature sets.
7477 switch (getToolChain().getArch()) {
7478 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007479 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007480 break;
7481 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007482 case llvm::Triple::armeb:
7483 case llvm::Triple::thumb:
7484 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007485 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007486 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7487 std::string Arch =
7488 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007489 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007490 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007491 }
7492
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007493 case llvm::Triple::mips:
7494 case llvm::Triple::mipsel:
7495 case llvm::Triple::mips64:
7496 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007497 StringRef CPUName;
7498 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007499 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007500
7501 CmdArgs.push_back("-march");
7502 CmdArgs.push_back(CPUName.data());
7503
7504 CmdArgs.push_back("-mabi");
7505 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7506
7507 if (getToolChain().getArch() == llvm::Triple::mips ||
7508 getToolChain().getArch() == llvm::Triple::mips64)
7509 CmdArgs.push_back("-EB");
7510 else
7511 CmdArgs.push_back("-EL");
7512
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007513 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007514 break;
7515 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007516
7517 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007518 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007519 CmdArgs.push_back("-32");
7520 addAssemblerKPIC(Args, CmdArgs);
7521 break;
7522
7523 case llvm::Triple::sparcv9:
7524 CmdArgs.push_back("-64");
7525 CmdArgs.push_back("-Av9");
7526 addAssemblerKPIC(Args, CmdArgs);
7527 break;
7528
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007529 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007530 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007531 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007532
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007533 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007534
7535 CmdArgs.push_back("-o");
7536 CmdArgs.push_back(Output.getFilename());
7537
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007538 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007539 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007540
David Chisnallddbd68f2011-09-27 22:03:18 +00007541 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007542 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007543}
7544
Douglas Katzman95354292015-06-23 20:42:09 +00007545void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7546 const InputInfo &Output,
7547 const InputInfoList &Inputs,
7548 const ArgList &Args,
7549 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007550 const Driver &D = getToolChain().getDriver();
7551 ArgStringList CmdArgs;
7552
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007553 if (!D.SysRoot.empty())
7554 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7555
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007556 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007557 if (Args.hasArg(options::OPT_static)) {
7558 CmdArgs.push_back("-Bstatic");
7559 } else {
7560 if (Args.hasArg(options::OPT_rdynamic))
7561 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007562 if (Args.hasArg(options::OPT_shared)) {
7563 CmdArgs.push_back("-Bshareable");
7564 } else {
7565 CmdArgs.push_back("-dynamic-linker");
7566 CmdArgs.push_back("/libexec/ld.elf_so");
7567 }
7568 }
7569
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007570 // Many NetBSD architectures support more than one ABI.
7571 // Determine the correct emulation for ld.
7572 switch (getToolChain().getArch()) {
7573 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007574 CmdArgs.push_back("-m");
7575 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007576 break;
7577 case llvm::Triple::arm:
7578 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007579 CmdArgs.push_back("-m");
7580 switch (getToolChain().getTriple().getEnvironment()) {
7581 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007582 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007583 CmdArgs.push_back("armelf_nbsd_eabi");
7584 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007585 case llvm::Triple::EABIHF:
7586 case llvm::Triple::GNUEABIHF:
7587 CmdArgs.push_back("armelf_nbsd_eabihf");
7588 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007589 default:
7590 CmdArgs.push_back("armelf_nbsd");
7591 break;
7592 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007593 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007594 case llvm::Triple::armeb:
7595 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007596 arm::appendEBLinkFlags(
7597 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007598 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007599 CmdArgs.push_back("-m");
7600 switch (getToolChain().getTriple().getEnvironment()) {
7601 case llvm::Triple::EABI:
7602 case llvm::Triple::GNUEABI:
7603 CmdArgs.push_back("armelfb_nbsd_eabi");
7604 break;
7605 case llvm::Triple::EABIHF:
7606 case llvm::Triple::GNUEABIHF:
7607 CmdArgs.push_back("armelfb_nbsd_eabihf");
7608 break;
7609 default:
7610 CmdArgs.push_back("armelfb_nbsd");
7611 break;
7612 }
7613 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007614 case llvm::Triple::mips64:
7615 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007616 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007617 CmdArgs.push_back("-m");
7618 if (getToolChain().getArch() == llvm::Triple::mips64)
7619 CmdArgs.push_back("elf32btsmip");
7620 else
7621 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007622 } else if (mips::hasMipsAbiArg(Args, "64")) {
7623 CmdArgs.push_back("-m");
7624 if (getToolChain().getArch() == llvm::Triple::mips64)
7625 CmdArgs.push_back("elf64btsmip");
7626 else
7627 CmdArgs.push_back("elf64ltsmip");
7628 }
7629 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007630 case llvm::Triple::ppc:
7631 CmdArgs.push_back("-m");
7632 CmdArgs.push_back("elf32ppc_nbsd");
7633 break;
7634
7635 case llvm::Triple::ppc64:
7636 case llvm::Triple::ppc64le:
7637 CmdArgs.push_back("-m");
7638 CmdArgs.push_back("elf64ppc");
7639 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007640
7641 case llvm::Triple::sparc:
7642 CmdArgs.push_back("-m");
7643 CmdArgs.push_back("elf32_sparc");
7644 break;
7645
7646 case llvm::Triple::sparcv9:
7647 CmdArgs.push_back("-m");
7648 CmdArgs.push_back("elf64_sparc");
7649 break;
7650
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007651 default:
7652 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007653 }
7654
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007655 if (Output.isFilename()) {
7656 CmdArgs.push_back("-o");
7657 CmdArgs.push_back(Output.getFilename());
7658 } else {
7659 assert(Output.isNothing() && "Invalid output.");
7660 }
7661
7662 if (!Args.hasArg(options::OPT_nostdlib) &&
7663 !Args.hasArg(options::OPT_nostartfiles)) {
7664 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007665 CmdArgs.push_back(
7666 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7667 CmdArgs.push_back(
7668 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7669 CmdArgs.push_back(
7670 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007671 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007672 CmdArgs.push_back(
7673 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7674 CmdArgs.push_back(
7675 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007676 }
7677 }
7678
7679 Args.AddAllArgs(CmdArgs, options::OPT_L);
7680 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7681 Args.AddAllArgs(CmdArgs, options::OPT_e);
7682 Args.AddAllArgs(CmdArgs, options::OPT_s);
7683 Args.AddAllArgs(CmdArgs, options::OPT_t);
7684 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7685 Args.AddAllArgs(CmdArgs, options::OPT_r);
7686
7687 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7688
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007689 unsigned Major, Minor, Micro;
7690 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7691 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007692 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007693 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007694 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007695 case llvm::Triple::arm:
7696 case llvm::Triple::armeb:
7697 case llvm::Triple::thumb:
7698 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007699 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007700 case llvm::Triple::ppc64:
7701 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007702 case llvm::Triple::x86:
7703 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007704 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007705 break;
7706 default:
7707 break;
7708 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007709 }
7710
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007711 if (!Args.hasArg(options::OPT_nostdlib) &&
7712 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007713 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007714 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7715 CmdArgs.push_back("-lm");
7716 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007717 if (Args.hasArg(options::OPT_pthread))
7718 CmdArgs.push_back("-lpthread");
7719 CmdArgs.push_back("-lc");
7720
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007721 if (useLibgcc) {
7722 if (Args.hasArg(options::OPT_static)) {
7723 // libgcc_eh depends on libc, so resolve as much as possible,
7724 // pull in any new requirements from libc and then get the rest
7725 // of libgcc.
7726 CmdArgs.push_back("-lgcc_eh");
7727 CmdArgs.push_back("-lc");
7728 CmdArgs.push_back("-lgcc");
7729 } else {
7730 CmdArgs.push_back("-lgcc");
7731 CmdArgs.push_back("--as-needed");
7732 CmdArgs.push_back("-lgcc_s");
7733 CmdArgs.push_back("--no-as-needed");
7734 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007735 }
7736 }
7737
7738 if (!Args.hasArg(options::OPT_nostdlib) &&
7739 !Args.hasArg(options::OPT_nostartfiles)) {
7740 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007741 CmdArgs.push_back(
7742 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007743 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007744 CmdArgs.push_back(
7745 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7746 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007747 }
7748
Alexey Samsonov7811d192014-02-20 13:57:37 +00007749 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007750
Logan Chieneb9162f2014-06-26 14:23:45 +00007751 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007752 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007753}
7754
Douglas Katzman95354292015-06-23 20:42:09 +00007755void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7756 const InputInfo &Output,
7757 const InputInfoList &Inputs,
7758 const ArgList &Args,
7759 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007760 claimNoWarnArgs(Args);
7761
James Y Knight2db38f32015-08-15 03:45:25 +00007762 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7763 llvm::Triple Triple = llvm::Triple(TripleStr);
7764
Rafael Espindola92b00932010-08-10 00:25:48 +00007765 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007766 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007767
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007768 switch (getToolChain().getArch()) {
7769 default:
7770 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007771 // Add --32/--64 to make sure we get the format we want.
7772 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007773 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007774 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007775 break;
7776 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007777 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7778 CmdArgs.push_back("--x32");
7779 else
7780 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007781 break;
7782 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007783 CmdArgs.push_back("-a32");
7784 CmdArgs.push_back("-mppc");
7785 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007786 break;
7787 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007788 CmdArgs.push_back("-a64");
7789 CmdArgs.push_back("-mppc64");
7790 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007791 break;
7792 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007793 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007794 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007795 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007796 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007797 break;
7798 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007799 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007800 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007801 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007802 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007803 break;
7804 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007805 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007806 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007807 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007808 break;
7809 case llvm::Triple::arm:
7810 case llvm::Triple::armeb:
7811 case llvm::Triple::thumb:
7812 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007813 const llvm::Triple &Triple2 = getToolChain().getTriple();
7814 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007815 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007816 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007817 break;
7818 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007819 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007820 break;
7821 default:
7822 break;
7823 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007824
James Y Knight2db38f32015-08-15 03:45:25 +00007825 StringRef ARMFloatABI =
7826 tools::arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple);
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007827 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007828
7829 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007830
7831 // FIXME: remove krait check when GNU tools support krait cpu
7832 // for now replace it with -march=armv7-a to avoid a lower
7833 // march from being picked in the absence of a cpu flag.
7834 Arg *A;
7835 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007836 StringRef(A->getValue()).lower() == "krait")
7837 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007838 else
7839 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007840 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007841 break;
7842 }
7843 case llvm::Triple::mips:
7844 case llvm::Triple::mipsel:
7845 case llvm::Triple::mips64:
7846 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007847 StringRef CPUName;
7848 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007849 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007850 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007851
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007852 CmdArgs.push_back("-march");
7853 CmdArgs.push_back(CPUName.data());
7854
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007855 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007856 CmdArgs.push_back(ABIName.data());
7857
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007858 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7859 // or -mshared (not implemented) is in effect.
7860 bool IsPicOrPie = false;
7861 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7862 options::OPT_fpic, options::OPT_fno_pic,
7863 options::OPT_fPIE, options::OPT_fno_PIE,
7864 options::OPT_fpie, options::OPT_fno_pie)) {
7865 if (A->getOption().matches(options::OPT_fPIC) ||
7866 A->getOption().matches(options::OPT_fpic) ||
7867 A->getOption().matches(options::OPT_fPIE) ||
7868 A->getOption().matches(options::OPT_fpie))
7869 IsPicOrPie = true;
7870 }
7871 if (!IsPicOrPie)
7872 CmdArgs.push_back("-mno-shared");
7873
Daniel Sanders379d44b2014-07-16 11:52:23 +00007874 // LLVM doesn't support -mplt yet and acts as if it is always given.
7875 // However, -mplt has no effect with the N64 ABI.
7876 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007877
7878 if (getToolChain().getArch() == llvm::Triple::mips ||
7879 getToolChain().getArch() == llvm::Triple::mips64)
7880 CmdArgs.push_back("-EB");
7881 else
7882 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007883
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007884 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7885 if (StringRef(A->getValue()) == "2008")
7886 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7887 }
7888
Daniel Sanders379d44b2014-07-16 11:52:23 +00007889 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007890 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007891 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7892 options::OPT_mfp64)) {
7893 A->claim();
7894 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007895 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7896 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007897 CmdArgs.push_back("-mfpxx");
7898
7899 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7900 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007901 if (Arg *A =
7902 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007903 if (A->getOption().matches(options::OPT_mips16)) {
7904 A->claim();
7905 A->render(Args, CmdArgs);
7906 } else {
7907 A->claim();
7908 CmdArgs.push_back("-no-mips16");
7909 }
7910 }
7911
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007912 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7913 options::OPT_mno_micromips);
7914 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7915 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7916
Simon Atanasyanbd986632013-11-26 11:58:04 +00007917 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7918 // Do not use AddLastArg because not all versions of MIPS assembler
7919 // support -mmsa / -mno-msa options.
7920 if (A->getOption().matches(options::OPT_mmsa))
7921 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7922 }
7923
Daniel Sanders379d44b2014-07-16 11:52:23 +00007924 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7925 options::OPT_msoft_float);
7926
Toma Tabacub36d6102015-06-11 12:13:18 +00007927 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7928 options::OPT_msingle_float);
7929
Daniel Sanders379d44b2014-07-16 11:52:23 +00007930 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7931 options::OPT_mno_odd_spreg);
7932
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007933 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007934 break;
7935 }
7936 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007937 // Always pass an -march option, since our default of z10 is later
7938 // than the GNU assembler's default.
7939 StringRef CPUName = getSystemZTargetCPU(Args);
7940 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007941 break;
7942 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007943 }
7944
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007945 if (NeedsKPIC)
7946 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007947
Renato Golina74bbc72015-07-22 15:32:36 +00007948 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007949 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007950
7951 CmdArgs.push_back("-o");
7952 CmdArgs.push_back(Output.getFilename());
7953
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007954 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007955 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007956
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007957 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007958 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007959
7960 // Handle the debug info splitting at object creation time if we're
7961 // creating an object.
7962 // TODO: Currently only works on linux with newer objcopy.
7963 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007964 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007965 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007966 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007967}
7968
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007969static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007970 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007971 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00007972 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007973 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7974 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007975 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007976 CmdArgs.push_back("-lgcc");
7977
Logan Chien3d3373c2012-11-19 12:04:11 +00007978 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007979 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007980 CmdArgs.push_back("-lgcc");
7981 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00007982 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007983 CmdArgs.push_back("--as-needed");
7984 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00007985 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007986 CmdArgs.push_back("--no-as-needed");
7987 }
7988
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007989 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007990 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007991 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007992 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007993
7994 // According to Android ABI, we have to link with libdl if we are
7995 // linking with non-static libgcc.
7996 //
7997 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7998 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7999 if (isAndroid && !StaticLibgcc)
8000 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008001}
8002
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008003static std::string getLinuxDynamicLinker(const ArgList &Args,
8004 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008005 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8006
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008007 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8008 if (ToolChain.getTriple().isArch64Bit())
8009 return "/system/bin/linker64";
8010 else
8011 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008012 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8013 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008014 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008015 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008016 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008017 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008018 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008019 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008020 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8021 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008022 return "/lib/ld-linux-armhf.so.3";
8023 else
8024 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008025 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8026 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008027 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8028 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008029 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008030 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008031 return "/lib/ld-linux.so.3";
8032 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8033 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008034 StringRef CPUName;
8035 StringRef ABIName;
8036 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8037 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8038
8039 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8040 .Case("o32", "/lib")
8041 .Case("n32", "/lib32")
8042 .Case("n64", "/lib64")
8043 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008044 StringRef LibName;
8045 if (mips::isUCLibc(Args))
8046 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8047 else
8048 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008049
8050 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008051 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008052 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008053 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008054 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8055 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008056 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008057 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008058 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8059 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008060 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008061 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00008062 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008063 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008064 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008065 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008066 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8067 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008068 else
8069 return "/lib64/ld-linux-x86-64.so.2";
8070}
8071
Renato Golinc4b49242014-02-13 10:01:16 +00008072static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008073 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008074 // Make use of compiler-rt if --rtlib option is used
8075 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8076
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008077 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008078 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008079 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008080 default:
8081 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008082 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008083 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008084 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008085 break;
8086 }
Renato Golinc4b49242014-02-13 10:01:16 +00008087 break;
8088 case ToolChain::RLT_Libgcc:
8089 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8090 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008091 }
8092}
8093
Rafael Espindola1e085772014-08-15 17:14:35 +00008094static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8095 switch (T.getArch()) {
8096 case llvm::Triple::x86:
8097 return "elf_i386";
8098 case llvm::Triple::aarch64:
8099 return "aarch64linux";
8100 case llvm::Triple::aarch64_be:
8101 return "aarch64_be_linux";
8102 case llvm::Triple::arm:
8103 case llvm::Triple::thumb:
8104 return "armelf_linux_eabi";
8105 case llvm::Triple::armeb:
8106 case llvm::Triple::thumbeb:
8107 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8108 case llvm::Triple::ppc:
8109 return "elf32ppclinux";
8110 case llvm::Triple::ppc64:
8111 return "elf64ppc";
8112 case llvm::Triple::ppc64le:
8113 return "elf64lppc";
8114 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008115 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008116 return "elf32_sparc";
8117 case llvm::Triple::sparcv9:
8118 return "elf64_sparc";
8119 case llvm::Triple::mips:
8120 return "elf32btsmip";
8121 case llvm::Triple::mipsel:
8122 return "elf32ltsmip";
8123 case llvm::Triple::mips64:
8124 if (mips::hasMipsAbiArg(Args, "n32"))
8125 return "elf32btsmipn32";
8126 return "elf64btsmip";
8127 case llvm::Triple::mips64el:
8128 if (mips::hasMipsAbiArg(Args, "n32"))
8129 return "elf32ltsmipn32";
8130 return "elf64ltsmip";
8131 case llvm::Triple::systemz:
8132 return "elf64_s390";
8133 case llvm::Triple::x86_64:
8134 if (T.getEnvironment() == llvm::Triple::GNUX32)
8135 return "elf32_x86_64";
8136 return "elf_x86_64";
8137 default:
8138 llvm_unreachable("Unexpected arch");
8139 }
8140}
8141
Douglas Katzman95354292015-06-23 20:42:09 +00008142void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8143 const InputInfo &Output,
8144 const InputInfoList &Inputs,
8145 const ArgList &Args,
8146 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008147 const toolchains::Linux &ToolChain =
8148 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008149 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008150
8151 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8152 llvm::Triple Triple = llvm::Triple(TripleStr);
8153
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008154 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008155 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008156 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008157 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008158 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8159 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008160
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008161 ArgStringList CmdArgs;
8162
Rafael Espindolad1002f62010-11-15 18:28:16 +00008163 // Silence warning for "clang -g foo.o -o foo"
8164 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008165 // and "clang -emit-llvm foo.o -o foo"
8166 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008167 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008168 // handled somewhere else.
8169 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008170
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008171 if (!D.SysRoot.empty())
8172 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008173
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008174 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008175 CmdArgs.push_back("-pie");
8176
Rafael Espindola1c76c592010-11-07 22:57:16 +00008177 if (Args.hasArg(options::OPT_rdynamic))
8178 CmdArgs.push_back("-export-dynamic");
8179
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008180 if (Args.hasArg(options::OPT_s))
8181 CmdArgs.push_back("-s");
8182
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008183 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008184 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008185
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008186 for (const auto &Opt : ToolChain.ExtraOpts)
8187 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008188
8189 if (!Args.hasArg(options::OPT_static)) {
8190 CmdArgs.push_back("--eh-frame-hdr");
8191 }
8192
8193 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008194 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008195
8196 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008197 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8198 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008199 CmdArgs.push_back("-Bstatic");
8200 else
8201 CmdArgs.push_back("-static");
8202 } else if (Args.hasArg(options::OPT_shared)) {
8203 CmdArgs.push_back("-shared");
8204 }
8205
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008206 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8207 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008208 (!Args.hasArg(options::OPT_static) &&
8209 !Args.hasArg(options::OPT_shared))) {
8210 CmdArgs.push_back("-dynamic-linker");
8211 CmdArgs.push_back(Args.MakeArgString(
8212 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8213 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008214
8215 CmdArgs.push_back("-o");
8216 CmdArgs.push_back(Output.getFilename());
8217
Rafael Espindola81937ec2010-12-01 01:52:43 +00008218 if (!Args.hasArg(options::OPT_nostdlib) &&
8219 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008220 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008221 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008222 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008223 if (Args.hasArg(options::OPT_pg))
8224 crt1 = "gcrt1.o";
8225 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008226 crt1 = "Scrt1.o";
8227 else
8228 crt1 = "crt1.o";
8229 }
8230 if (crt1)
8231 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008232
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008233 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8234 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008235
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008236 const char *crtbegin;
8237 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008238 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008239 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008240 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008241 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008242 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008243 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008244 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008245 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008246
8247 // Add crtfastmath.o if available and fast math is enabled.
8248 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008249 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008250
8251 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008252 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008253
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008254 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008255
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008256 for (const auto &Path : Paths)
8257 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008258
Alexey Samsonov907880e2015-06-19 19:57:46 +00008259 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008260 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008261
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008262 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8263 CmdArgs.push_back("--no-demangle");
8264
Alexey Samsonov52550342014-09-15 19:58:40 +00008265 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008266 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008267 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008268 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008270 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008271 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008272 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008273 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008274 if (OnlyLibstdcxxStatic)
8275 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008276 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008277 if (OnlyLibstdcxxStatic)
8278 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008279 CmdArgs.push_back("-lm");
8280 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008281 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8282 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008283
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008284 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008285 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8286 if (Args.hasArg(options::OPT_static))
8287 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008288
Alexey Samsonov52550342014-09-15 19:58:40 +00008289 if (NeedsSanitizerDeps)
8290 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8291
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008292 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8293 Args.hasArg(options::OPT_pthreads);
8294
8295 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8296 options::OPT_fno_openmp, false)) {
8297 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8298 // FIXME: Does this really make sense for all GNU toolchains?
8299 WantPthread = true;
8300
8301 // Also link the particular OpenMP runtimes.
8302 switch (getOpenMPRuntime(ToolChain, Args)) {
8303 case OMPRT_OMP:
8304 CmdArgs.push_back("-lomp");
8305 break;
8306 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008307 CmdArgs.push_back("-lgomp");
8308
8309 // FIXME: Exclude this for platforms with libgomp that don't require
8310 // librt. Most modern Linux platforms require it, but some may not.
8311 CmdArgs.push_back("-lrt");
8312 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008313 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008314 CmdArgs.push_back("-liomp5");
8315 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008316 case OMPRT_Unknown:
8317 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008318 break;
8319 }
Chandler Carruth01538002013-01-17 13:19:29 +00008320 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008321
Renato Golinc4b49242014-02-13 10:01:16 +00008322 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008323
Richard Smith31d1de22015-05-20 22:48:44 +00008324 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008325 CmdArgs.push_back("-lpthread");
8326
8327 CmdArgs.push_back("-lc");
8328
8329 if (Args.hasArg(options::OPT_static))
8330 CmdArgs.push_back("--end-group");
8331 else
Renato Golinc4b49242014-02-13 10:01:16 +00008332 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008333 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008334
Rafael Espindola81937ec2010-12-01 01:52:43 +00008335 if (!Args.hasArg(options::OPT_nostartfiles)) {
8336 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008337 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008338 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008339 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008340 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008341 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008342 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008343
Rafael Espindola81937ec2010-12-01 01:52:43 +00008344 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008345 if (!isAndroid)
8346 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008347 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008348 }
8349
Justin Bognerd3371d82015-07-17 03:35:54 +00008350 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8351 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008352}
8353
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008354// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8355// for the various SFI requirements like register masking. The assembly tool
8356// inserts the file containing the macros as an input into all the assembly
8357// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008358void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8359 const InputInfo &Output,
8360 const InputInfoList &Inputs,
8361 const ArgList &Args,
8362 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008363 const toolchains::NaClToolChain &ToolChain =
8364 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008365 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8366 "nacl-arm-macros.s");
8367 InputInfoList NewInputs;
8368 NewInputs.push_back(NaClMacros);
8369 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008370 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8371 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008372}
8373
Douglas Katzman750cfc52015-06-29 18:42:16 +00008374// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008375// we use static by default, do not yet support sanitizers or LTO, and a few
8376// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008377// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008378void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8379 const InputInfo &Output,
8380 const InputInfoList &Inputs,
8381 const ArgList &Args,
8382 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008383
Douglas Katzman54366072015-07-27 16:53:08 +00008384 const toolchains::NaClToolChain &ToolChain =
8385 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008386 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008387 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008388 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008389 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008390
8391 ArgStringList CmdArgs;
8392
8393 // Silence warning for "clang -g foo.o -o foo"
8394 Args.ClaimAllArgs(options::OPT_g_Group);
8395 // and "clang -emit-llvm foo.o -o foo"
8396 Args.ClaimAllArgs(options::OPT_emit_llvm);
8397 // and for "clang -w foo.o -o foo". Other warning options are already
8398 // handled somewhere else.
8399 Args.ClaimAllArgs(options::OPT_w);
8400
8401 if (!D.SysRoot.empty())
8402 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8403
8404 if (Args.hasArg(options::OPT_rdynamic))
8405 CmdArgs.push_back("-export-dynamic");
8406
8407 if (Args.hasArg(options::OPT_s))
8408 CmdArgs.push_back("-s");
8409
Douglas Katzman54366072015-07-27 16:53:08 +00008410 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8411 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008412 CmdArgs.push_back("--build-id");
8413
8414 if (!IsStatic)
8415 CmdArgs.push_back("--eh-frame-hdr");
8416
8417 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008418 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008419 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008420 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008421 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008422 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008423 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008424 else if (Arch == llvm::Triple::mipsel)
8425 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008426 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008427 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8428 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008429
8430 if (IsStatic)
8431 CmdArgs.push_back("-static");
8432 else if (Args.hasArg(options::OPT_shared))
8433 CmdArgs.push_back("-shared");
8434
8435 CmdArgs.push_back("-o");
8436 CmdArgs.push_back(Output.getFilename());
8437 if (!Args.hasArg(options::OPT_nostdlib) &&
8438 !Args.hasArg(options::OPT_nostartfiles)) {
8439 if (!Args.hasArg(options::OPT_shared))
8440 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8442
8443 const char *crtbegin;
8444 if (IsStatic)
8445 crtbegin = "crtbeginT.o";
8446 else if (Args.hasArg(options::OPT_shared))
8447 crtbegin = "crtbeginS.o";
8448 else
8449 crtbegin = "crtbegin.o";
8450 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8451 }
8452
8453 Args.AddAllArgs(CmdArgs, options::OPT_L);
8454 Args.AddAllArgs(CmdArgs, options::OPT_u);
8455
8456 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8457
8458 for (const auto &Path : Paths)
8459 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8460
8461 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8462 CmdArgs.push_back("--no-demangle");
8463
8464 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8465
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008466 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008467 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008468 bool OnlyLibstdcxxStatic =
8469 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008470 if (OnlyLibstdcxxStatic)
8471 CmdArgs.push_back("-Bstatic");
8472 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8473 if (OnlyLibstdcxxStatic)
8474 CmdArgs.push_back("-Bdynamic");
8475 CmdArgs.push_back("-lm");
8476 }
8477
8478 if (!Args.hasArg(options::OPT_nostdlib)) {
8479 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8480 // Always use groups, since it has no effect on dynamic libraries.
8481 CmdArgs.push_back("--start-group");
8482 CmdArgs.push_back("-lc");
8483 // NaCl's libc++ currently requires libpthread, so just always include it
8484 // in the group for C++.
8485 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008486 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008487 // Gold, used by Mips, handles nested groups differently than ld, and
8488 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8489 // which is not a desired behaviour here.
8490 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8491 if (getToolChain().getArch() == llvm::Triple::mipsel)
8492 CmdArgs.push_back("-lnacl");
8493
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008494 CmdArgs.push_back("-lpthread");
8495 }
8496
8497 CmdArgs.push_back("-lgcc");
8498 CmdArgs.push_back("--as-needed");
8499 if (IsStatic)
8500 CmdArgs.push_back("-lgcc_eh");
8501 else
8502 CmdArgs.push_back("-lgcc_s");
8503 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008504
8505 // Mips needs to create and use pnacl_legacy library that contains
8506 // definitions from bitcode/pnaclmm.c and definitions for
8507 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8508 if (getToolChain().getArch() == llvm::Triple::mipsel)
8509 CmdArgs.push_back("-lpnacl_legacy");
8510
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008511 CmdArgs.push_back("--end-group");
8512 }
8513
8514 if (!Args.hasArg(options::OPT_nostartfiles)) {
8515 const char *crtend;
8516 if (Args.hasArg(options::OPT_shared))
8517 crtend = "crtendS.o";
8518 else
8519 crtend = "crtend.o";
8520
8521 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8522 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8523 }
8524 }
8525
Justin Bognerd3371d82015-07-17 03:35:54 +00008526 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8527 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008528}
8529
Douglas Katzman95354292015-06-23 20:42:09 +00008530void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8531 const InputInfo &Output,
8532 const InputInfoList &Inputs,
8533 const ArgList &Args,
8534 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008535 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008536 ArgStringList CmdArgs;
8537
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008538 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008539
8540 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008541 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008542
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008543 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008544 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008545
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008546 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008547 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008548}
8549
Douglas Katzman95354292015-06-23 20:42:09 +00008550void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8551 const InputInfo &Output,
8552 const InputInfoList &Inputs,
8553 const ArgList &Args,
8554 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008555 const Driver &D = getToolChain().getDriver();
8556 ArgStringList CmdArgs;
8557
Daniel Dunbarb440f562010-08-02 02:38:21 +00008558 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008559 CmdArgs.push_back("-o");
8560 CmdArgs.push_back(Output.getFilename());
8561 } else {
8562 assert(Output.isNothing() && "Invalid output.");
8563 }
8564
8565 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008566 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008567 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8568 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8569 CmdArgs.push_back(
8570 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8571 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008572 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008573
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008574 Args.AddAllArgs(CmdArgs,
8575 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008576
Daniel Dunbar54423b22010-09-17 00:24:54 +00008577 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008578
Alexey Samsonov7811d192014-02-20 13:57:37 +00008579 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008580
Chris Lattner3e2ee142010-07-07 16:01:42 +00008581 if (!Args.hasArg(options::OPT_nostdlib) &&
8582 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008583 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008584 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008585 CmdArgs.push_back("-lm");
8586 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008587 }
8588
8589 if (!Args.hasArg(options::OPT_nostdlib) &&
8590 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008591 if (Args.hasArg(options::OPT_pthread))
8592 CmdArgs.push_back("-lpthread");
8593 CmdArgs.push_back("-lc");
8594 CmdArgs.push_back("-lCompilerRT-Generic");
8595 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8596 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008597 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008598 }
8599
Logan Chieneb9162f2014-06-26 14:23:45 +00008600 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008601 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008602}
8603
Daniel Dunbarcc912342009-05-02 18:28:39 +00008604/// DragonFly Tools
8605
8606// For now, DragonFly Assemble does just about the same as for
8607// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008608void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8609 const InputInfo &Output,
8610 const InputInfoList &Inputs,
8611 const ArgList &Args,
8612 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008613 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008614 ArgStringList CmdArgs;
8615
8616 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8617 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008618 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008619 CmdArgs.push_back("--32");
8620
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008621 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008622
8623 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008624 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008625
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008626 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008627 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008628
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008629 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008630 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008631}
8632
Douglas Katzman95354292015-06-23 20:42:09 +00008633void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8634 const InputInfo &Output,
8635 const InputInfoList &Inputs,
8636 const ArgList &Args,
8637 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008638 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008639 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008640 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008641
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008642 if (!D.SysRoot.empty())
8643 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8644
John McCall65b8da02013-04-11 22:55:55 +00008645 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008646 if (Args.hasArg(options::OPT_static)) {
8647 CmdArgs.push_back("-Bstatic");
8648 } else {
John McCall65b8da02013-04-11 22:55:55 +00008649 if (Args.hasArg(options::OPT_rdynamic))
8650 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008651 if (Args.hasArg(options::OPT_shared))
8652 CmdArgs.push_back("-Bshareable");
8653 else {
8654 CmdArgs.push_back("-dynamic-linker");
8655 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8656 }
John McCall65b8da02013-04-11 22:55:55 +00008657 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008658 }
8659
8660 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8661 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008662 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008663 CmdArgs.push_back("-m");
8664 CmdArgs.push_back("elf_i386");
8665 }
8666
Daniel Dunbarb440f562010-08-02 02:38:21 +00008667 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008668 CmdArgs.push_back("-o");
8669 CmdArgs.push_back(Output.getFilename());
8670 } else {
8671 assert(Output.isNothing() && "Invalid output.");
8672 }
8673
8674 if (!Args.hasArg(options::OPT_nostdlib) &&
8675 !Args.hasArg(options::OPT_nostartfiles)) {
8676 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008677 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008678 CmdArgs.push_back(
8679 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008680 else {
8681 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008682 CmdArgs.push_back(
8683 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008684 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008685 CmdArgs.push_back(
8686 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008687 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008688 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008689 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008690 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008691 CmdArgs.push_back(
8692 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008693 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008694 CmdArgs.push_back(
8695 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008696 }
8697
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008698 Args.AddAllArgs(CmdArgs,
8699 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008700
Daniel Dunbar54423b22010-09-17 00:24:54 +00008701 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008702
8703 if (!Args.hasArg(options::OPT_nostdlib) &&
8704 !Args.hasArg(options::OPT_nodefaultlibs)) {
8705 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8706 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008707 if (UseGCC47)
8708 CmdArgs.push_back("-L/usr/lib/gcc47");
8709 else
8710 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008711
8712 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008713 if (UseGCC47) {
8714 CmdArgs.push_back("-rpath");
8715 CmdArgs.push_back("/usr/lib/gcc47");
8716 } else {
8717 CmdArgs.push_back("-rpath");
8718 CmdArgs.push_back("/usr/lib/gcc44");
8719 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008720 }
8721
Hans Wennborg70850d82013-07-18 20:29:38 +00008722 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008723 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008724 CmdArgs.push_back("-lm");
8725 }
8726
Daniel Dunbarcc912342009-05-02 18:28:39 +00008727 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008728 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008729
8730 if (!Args.hasArg(options::OPT_nolibc)) {
8731 CmdArgs.push_back("-lc");
8732 }
8733
John McCall65b8da02013-04-11 22:55:55 +00008734 if (UseGCC47) {
8735 if (Args.hasArg(options::OPT_static) ||
8736 Args.hasArg(options::OPT_static_libgcc)) {
8737 CmdArgs.push_back("-lgcc");
8738 CmdArgs.push_back("-lgcc_eh");
8739 } else {
8740 if (Args.hasArg(options::OPT_shared_libgcc)) {
8741 CmdArgs.push_back("-lgcc_pic");
8742 if (!Args.hasArg(options::OPT_shared))
8743 CmdArgs.push_back("-lgcc");
8744 } else {
8745 CmdArgs.push_back("-lgcc");
8746 CmdArgs.push_back("--as-needed");
8747 CmdArgs.push_back("-lgcc_pic");
8748 CmdArgs.push_back("--no-as-needed");
8749 }
8750 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008751 } else {
John McCall65b8da02013-04-11 22:55:55 +00008752 if (Args.hasArg(options::OPT_shared)) {
8753 CmdArgs.push_back("-lgcc_pic");
8754 } else {
8755 CmdArgs.push_back("-lgcc");
8756 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008757 }
8758 }
8759
8760 if (!Args.hasArg(options::OPT_nostdlib) &&
8761 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008762 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008763 CmdArgs.push_back(
8764 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008765 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008766 CmdArgs.push_back(
8767 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8768 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008769 }
8770
Alexey Samsonov7811d192014-02-20 13:57:37 +00008771 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008772
Logan Chieneb9162f2014-06-26 14:23:45 +00008773 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008774 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008775}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008776
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008777// Try to find Exe from a Visual Studio distribution. This first tries to find
8778// an installed copy of Visual Studio and, failing that, looks in the PATH,
8779// making sure that whatever executable that's found is not a same-named exe
8780// from clang itself to prevent clang from falling back to itself.
8781static std::string FindVisualStudioExecutable(const ToolChain &TC,
8782 const char *Exe,
8783 const char *ClangProgramPath) {
8784 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8785 std::string visualStudioBinDir;
8786 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8787 visualStudioBinDir)) {
8788 SmallString<128> FilePath(visualStudioBinDir);
8789 llvm::sys::path::append(FilePath, Exe);
8790 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8791 return FilePath.str();
8792 }
8793
8794 return Exe;
8795}
8796
Douglas Katzman95354292015-06-23 20:42:09 +00008797void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8798 const InputInfo &Output,
8799 const InputInfoList &Inputs,
8800 const ArgList &Args,
8801 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008802 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008803 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008804
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008805 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8806 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008807 CmdArgs.push_back(
8808 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008809
8810 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008811 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008812 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008813
Zachary Turner10d75b22014-10-22 20:40:43 +00008814 if (!llvm::sys::Process::GetEnv("LIB")) {
8815 // If the VC environment hasn't been configured (perhaps because the user
8816 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008817 // the environment variable is set however, assume the user knows what
8818 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008819 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008820 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008821 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8822 SmallString<128> LibDir(VisualStudioDir);
8823 llvm::sys::path::append(LibDir, "VC", "lib");
8824 switch (MSVC.getArch()) {
8825 case llvm::Triple::x86:
8826 // x86 just puts the libraries directly in lib
8827 break;
8828 case llvm::Triple::x86_64:
8829 llvm::sys::path::append(LibDir, "amd64");
8830 break;
8831 case llvm::Triple::arm:
8832 llvm::sys::path::append(LibDir, "arm");
8833 break;
8834 default:
8835 break;
8836 }
8837 CmdArgs.push_back(
8838 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8839 }
8840
8841 std::string WindowsSdkLibPath;
8842 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8843 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8844 WindowsSdkLibPath.c_str()));
8845 }
8846
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008847 CmdArgs.push_back("-nologo");
8848
Reid Kleckner124955a2015-08-05 18:51:13 +00008849 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008850 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008851
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008852 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008853 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008854 if (DLL) {
8855 CmdArgs.push_back(Args.MakeArgString("-dll"));
8856
8857 SmallString<128> ImplibName(Output.getFilename());
8858 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008859 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008860 }
8861
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008862 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008863 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008864 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008865 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008866 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008867 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008868 };
8869 for (const auto &Component : CompilerRTComponents)
8870 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008871 // Make sure the dynamic runtime thunk is not optimized out at link time
8872 // to ensure proper SEH handling.
8873 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008874 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008875 CmdArgs.push_back(
8876 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008877 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008878 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008879 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008880 };
8881 for (const auto &Component : CompilerRTComponents)
8882 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008883 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008884 }
8885
Hans Wennborg2e274592013-08-13 23:38:57 +00008886 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008887
Alexey Bataevc7e84352015-08-19 04:49:01 +00008888 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8889 options::OPT_fno_openmp, false)) {
8890 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
8891 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
8892 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8893 TC.getDriver().Dir + "/../lib"));
8894 switch (getOpenMPRuntime(getToolChain(), Args)) {
8895 case OMPRT_OMP:
8896 CmdArgs.push_back("-defaultlib:libomp.lib");
8897 break;
8898 case OMPRT_IOMP5:
8899 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
8900 break;
8901 case OMPRT_GOMP:
8902 break;
8903 case OMPRT_Unknown:
8904 // Already diagnosed.
8905 break;
8906 }
8907 }
8908
Reid Kleckner337188f2014-09-16 19:22:00 +00008909 // Add filenames, libraries, and other linker inputs.
8910 for (const auto &Input : Inputs) {
8911 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008912 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008913 continue;
8914 }
8915
8916 const Arg &A = Input.getInputArg();
8917
8918 // Render -l options differently for the MSVC linker.
8919 if (A.getOption().matches(options::OPT_l)) {
8920 StringRef Lib = A.getValue();
8921 const char *LinkLibArg;
8922 if (Lib.endswith(".lib"))
8923 LinkLibArg = Args.MakeArgString(Lib);
8924 else
8925 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8926 CmdArgs.push_back(LinkLibArg);
8927 continue;
8928 }
8929
8930 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8931 // or -L. Render it, even if MSVC doesn't understand it.
8932 A.renderAsInput(Args, CmdArgs);
8933 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008934
Zachary Turner719f58c2014-12-01 23:06:47 +00008935 // We need to special case some linker paths. In the case of lld, we need to
8936 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8937 // linker, we need to use a special search algorithm.
8938 llvm::SmallString<128> linkPath;
8939 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8940 if (Linker.equals_lower("lld"))
8941 Linker = "lld-link";
8942
8943 if (Linker.equals_lower("link")) {
8944 // If we're using the MSVC linker, it's not sufficient to just use link
8945 // from the program PATH, because other environments like GnuWin32 install
8946 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008947 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008948 C.getDriver().getClangProgramPath());
8949 } else {
8950 linkPath = Linker;
8951 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008952 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008953 }
8954
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008955 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00008956 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008957}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008958
Douglas Katzman95354292015-06-23 20:42:09 +00008959void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8960 const InputInfo &Output,
8961 const InputInfoList &Inputs,
8962 const ArgList &Args,
8963 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008964 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8965}
8966
Douglas Katzman95354292015-06-23 20:42:09 +00008967std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008968 Compilation &C, const JobAction &JA, const InputInfo &Output,
8969 const InputInfoList &Inputs, const ArgList &Args,
8970 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008971 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008972 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008973 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008974 CmdArgs.push_back("/W0"); // No warnings.
8975
8976 // The goal is to be able to invoke this tool correctly based on
8977 // any flag accepted by clang-cl.
8978
8979 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008980 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008981
8982 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00008983 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
8984 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
8985 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008986 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8987 if (A->getOption().getID() == options::OPT_O0) {
8988 CmdArgs.push_back("/Od");
8989 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00008990 CmdArgs.push_back("/Og");
8991
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008992 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00008993 if (OptLevel == "s" || OptLevel == "z")
8994 CmdArgs.push_back("/Os");
8995 else
8996 CmdArgs.push_back("/Ot");
8997
8998 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008999 }
9000 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009001 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9002 options::OPT_fno_omit_frame_pointer))
9003 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9004 ? "/Oy"
9005 : "/Oy-");
9006 if (!Args.hasArg(options::OPT_fwritable_strings))
9007 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009008
Nico Weber3f8dafb2015-03-12 19:37:10 +00009009 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009010 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9011
David Majnemerf6072342014-07-01 22:24:56 +00009012 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9013 /*default=*/false))
9014 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009015 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9016 options::OPT_fno_function_sections))
9017 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9018 ? "/Gy"
9019 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009020 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9021 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009022 CmdArgs.push_back(
9023 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009024 if (Args.hasArg(options::OPT_fsyntax_only))
9025 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009026 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9027 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009028 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009029
Nico Weber3f8dafb2015-03-12 19:37:10 +00009030 std::vector<std::string> Includes =
9031 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009032 for (const auto &Include : Includes)
9033 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009034
Hans Wennborg87cfa712013-09-19 20:32:16 +00009035 // Flags that can simply be passed through.
9036 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9037 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009038 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009039 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009040
9041 // The order of these flags is relevant, so pick the last one.
9042 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9043 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9044 A->render(Args, CmdArgs);
9045
Hans Wennborg87cfa712013-09-19 20:32:16 +00009046 // Input filename.
9047 assert(Inputs.size() == 1);
9048 const InputInfo &II = Inputs[0];
9049 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9050 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9051 if (II.isFilename())
9052 CmdArgs.push_back(II.getFilename());
9053 else
9054 II.getInputArg().renderAsInput(Args, CmdArgs);
9055
9056 // Output filename.
9057 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009058 const char *Fo =
9059 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009060 CmdArgs.push_back(Fo);
9061
Hans Wennborg188382e2013-09-20 18:16:35 +00009062 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009063 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9064 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009065 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009066 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009067}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009068
Yaron Keren1c0070c2015-07-02 04:45:27 +00009069/// MinGW Tools
9070void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9071 const InputInfo &Output,
9072 const InputInfoList &Inputs,
9073 const ArgList &Args,
9074 const char *LinkingOutput) const {
9075 claimNoWarnArgs(Args);
9076 ArgStringList CmdArgs;
9077
9078 if (getToolChain().getArch() == llvm::Triple::x86) {
9079 CmdArgs.push_back("--32");
9080 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9081 CmdArgs.push_back("--64");
9082 }
9083
9084 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9085
9086 CmdArgs.push_back("-o");
9087 CmdArgs.push_back(Output.getFilename());
9088
9089 for (const auto &II : Inputs)
9090 CmdArgs.push_back(II.getFilename());
9091
9092 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009093 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009094
9095 if (Args.hasArg(options::OPT_gsplit_dwarf))
9096 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9097 SplitDebugName(Args, Inputs[0]));
9098}
9099
9100void MinGW::Linker::AddLibGCC(const ArgList &Args,
9101 ArgStringList &CmdArgs) const {
9102 if (Args.hasArg(options::OPT_mthreads))
9103 CmdArgs.push_back("-lmingwthrd");
9104 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009105
Yaron Kerenaa281332015-08-09 00:24:07 +00009106 // Make use of compiler-rt if --rtlib option is used
9107 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9108 if (RLT == ToolChain::RLT_Libgcc) {
9109 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9110 Args.hasArg(options::OPT_static);
9111 bool Shared = Args.hasArg(options::OPT_shared);
9112 bool CXX = getToolChain().getDriver().CCCIsCXX();
9113
9114 if (Static || (!CXX && !Shared)) {
9115 CmdArgs.push_back("-lgcc");
9116 CmdArgs.push_back("-lgcc_eh");
9117 } else {
9118 CmdArgs.push_back("-lgcc_s");
9119 CmdArgs.push_back("-lgcc");
9120 }
9121 } else {
9122 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9123 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009124
Yaron Keren1c0070c2015-07-02 04:45:27 +00009125 CmdArgs.push_back("-lmoldname");
9126 CmdArgs.push_back("-lmingwex");
9127 CmdArgs.push_back("-lmsvcrt");
9128}
9129
9130void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9131 const InputInfo &Output,
9132 const InputInfoList &Inputs,
9133 const ArgList &Args,
9134 const char *LinkingOutput) const {
9135 const ToolChain &TC = getToolChain();
9136 const Driver &D = TC.getDriver();
9137 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9138
9139 ArgStringList CmdArgs;
9140
9141 // Silence warning for "clang -g foo.o -o foo"
9142 Args.ClaimAllArgs(options::OPT_g_Group);
9143 // and "clang -emit-llvm foo.o -o foo"
9144 Args.ClaimAllArgs(options::OPT_emit_llvm);
9145 // and for "clang -w foo.o -o foo". Other warning options are already
9146 // handled somewhere else.
9147 Args.ClaimAllArgs(options::OPT_w);
9148
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009149 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9150 if (LinkerName.equals_lower("lld")) {
9151 CmdArgs.push_back("-flavor");
9152 CmdArgs.push_back("gnu");
9153 }
9154
Yaron Keren1c0070c2015-07-02 04:45:27 +00009155 if (!D.SysRoot.empty())
9156 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9157
9158 if (Args.hasArg(options::OPT_s))
9159 CmdArgs.push_back("-s");
9160
9161 CmdArgs.push_back("-m");
9162 if (TC.getArch() == llvm::Triple::x86)
9163 CmdArgs.push_back("i386pe");
9164 if (TC.getArch() == llvm::Triple::x86_64)
9165 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009166 if (TC.getArch() == llvm::Triple::arm)
9167 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009168
9169 if (Args.hasArg(options::OPT_mwindows)) {
9170 CmdArgs.push_back("--subsystem");
9171 CmdArgs.push_back("windows");
9172 } else if (Args.hasArg(options::OPT_mconsole)) {
9173 CmdArgs.push_back("--subsystem");
9174 CmdArgs.push_back("console");
9175 }
9176
9177 if (Args.hasArg(options::OPT_static))
9178 CmdArgs.push_back("-Bstatic");
9179 else {
9180 if (Args.hasArg(options::OPT_mdll))
9181 CmdArgs.push_back("--dll");
9182 else if (Args.hasArg(options::OPT_shared))
9183 CmdArgs.push_back("--shared");
9184 CmdArgs.push_back("-Bdynamic");
9185 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9186 CmdArgs.push_back("-e");
9187 if (TC.getArch() == llvm::Triple::x86)
9188 CmdArgs.push_back("_DllMainCRTStartup@12");
9189 else
9190 CmdArgs.push_back("DllMainCRTStartup");
9191 CmdArgs.push_back("--enable-auto-image-base");
9192 }
9193 }
9194
9195 CmdArgs.push_back("-o");
9196 CmdArgs.push_back(Output.getFilename());
9197
9198 Args.AddAllArgs(CmdArgs, options::OPT_e);
9199 // FIXME: add -N, -n flags
9200 Args.AddLastArg(CmdArgs, options::OPT_r);
9201 Args.AddLastArg(CmdArgs, options::OPT_s);
9202 Args.AddLastArg(CmdArgs, options::OPT_t);
9203 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9204 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9205
9206 if (!Args.hasArg(options::OPT_nostdlib) &&
9207 !Args.hasArg(options::OPT_nostartfiles)) {
9208 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9209 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9210 } else {
9211 if (Args.hasArg(options::OPT_municode))
9212 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9213 else
9214 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9215 }
9216 if (Args.hasArg(options::OPT_pg))
9217 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9218 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9219 }
9220
9221 Args.AddAllArgs(CmdArgs, options::OPT_L);
9222 const ToolChain::path_list Paths = TC.getFilePaths();
9223 for (const auto &Path : Paths)
9224 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9225
9226 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9227
9228 // TODO: Add ASan stuff here
9229
9230 // TODO: Add profile stuff here
9231
9232 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9233 !Args.hasArg(options::OPT_nodefaultlibs)) {
9234 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9235 !Args.hasArg(options::OPT_static);
9236 if (OnlyLibstdcxxStatic)
9237 CmdArgs.push_back("-Bstatic");
9238 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9239 if (OnlyLibstdcxxStatic)
9240 CmdArgs.push_back("-Bdynamic");
9241 }
9242
9243 if (!Args.hasArg(options::OPT_nostdlib)) {
9244 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9245 if (Args.hasArg(options::OPT_static))
9246 CmdArgs.push_back("--start-group");
9247
9248 if (Args.hasArg(options::OPT_fstack_protector) ||
9249 Args.hasArg(options::OPT_fstack_protector_strong) ||
9250 Args.hasArg(options::OPT_fstack_protector_all)) {
9251 CmdArgs.push_back("-lssp_nonshared");
9252 CmdArgs.push_back("-lssp");
9253 }
9254 if (Args.hasArg(options::OPT_fopenmp))
9255 CmdArgs.push_back("-lgomp");
9256
9257 AddLibGCC(Args, CmdArgs);
9258
9259 if (Args.hasArg(options::OPT_pg))
9260 CmdArgs.push_back("-lgmon");
9261
Yaron Kerenadce68e2015-07-06 18:52:19 +00009262 if (Args.hasArg(options::OPT_pthread))
9263 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009264
9265 // add system libraries
9266 if (Args.hasArg(options::OPT_mwindows)) {
9267 CmdArgs.push_back("-lgdi32");
9268 CmdArgs.push_back("-lcomdlg32");
9269 }
9270 CmdArgs.push_back("-ladvapi32");
9271 CmdArgs.push_back("-lshell32");
9272 CmdArgs.push_back("-luser32");
9273 CmdArgs.push_back("-lkernel32");
9274
9275 if (Args.hasArg(options::OPT_static))
9276 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009277 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009278 AddLibGCC(Args, CmdArgs);
9279 }
9280
9281 if (!Args.hasArg(options::OPT_nostartfiles)) {
9282 // Add crtfastmath.o if available and fast math is enabled.
9283 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9284
9285 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9286 }
9287 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009288 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009289 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009290}
9291
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009292/// XCore Tools
9293// We pass assemble and link construction to the xcc tool.
9294
Douglas Katzman95354292015-06-23 20:42:09 +00009295void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9296 const InputInfo &Output,
9297 const InputInfoList &Inputs,
9298 const ArgList &Args,
9299 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009300 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009301 ArgStringList CmdArgs;
9302
9303 CmdArgs.push_back("-o");
9304 CmdArgs.push_back(Output.getFilename());
9305
9306 CmdArgs.push_back("-c");
9307
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009308 if (Args.hasArg(options::OPT_v))
9309 CmdArgs.push_back("-v");
9310
Robert Lytton894d25c2014-05-02 09:33:25 +00009311 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9312 if (!A->getOption().matches(options::OPT_g0))
9313 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009314
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009315 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9316 false))
9317 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009318
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009319 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009320
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009321 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009322 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009323
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009324 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009325 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009326}
9327
Douglas Katzman95354292015-06-23 20:42:09 +00009328void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9329 const InputInfo &Output,
9330 const InputInfoList &Inputs,
9331 const ArgList &Args,
9332 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009333 ArgStringList CmdArgs;
9334
9335 if (Output.isFilename()) {
9336 CmdArgs.push_back("-o");
9337 CmdArgs.push_back(Output.getFilename());
9338 } else {
9339 assert(Output.isNothing() && "Invalid output.");
9340 }
9341
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009342 if (Args.hasArg(options::OPT_v))
9343 CmdArgs.push_back("-v");
9344
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009345 // Pass -fexceptions through to the linker if it was present.
9346 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9347 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009348 CmdArgs.push_back("-fexceptions");
9349
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009350 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9351
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009352 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009353 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009354}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009355
Douglas Katzman95354292015-06-23 20:42:09 +00009356void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9357 const InputInfo &Output,
9358 const InputInfoList &Inputs,
9359 const ArgList &Args,
9360 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009361 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009362 const auto &TC =
9363 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9364 ArgStringList CmdArgs;
9365 const char *Exec;
9366
9367 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009368 default:
9369 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009370 case llvm::Triple::arm:
9371 case llvm::Triple::thumb:
9372 break;
9373 case llvm::Triple::x86:
9374 CmdArgs.push_back("--32");
9375 break;
9376 case llvm::Triple::x86_64:
9377 CmdArgs.push_back("--64");
9378 break;
9379 }
9380
9381 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9382
9383 CmdArgs.push_back("-o");
9384 CmdArgs.push_back(Output.getFilename());
9385
9386 for (const auto &Input : Inputs)
9387 CmdArgs.push_back(Input.getFilename());
9388
9389 const std::string Assembler = TC.GetProgramPath("as");
9390 Exec = Args.MakeArgString(Assembler);
9391
Justin Bognerd3371d82015-07-17 03:35:54 +00009392 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009393}
9394
Douglas Katzman95354292015-06-23 20:42:09 +00009395void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9396 const InputInfo &Output,
9397 const InputInfoList &Inputs,
9398 const ArgList &Args,
9399 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009400 const auto &TC =
9401 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9402 const llvm::Triple &T = TC.getTriple();
9403 const Driver &D = TC.getDriver();
9404 SmallString<128> EntryPoint;
9405 ArgStringList CmdArgs;
9406 const char *Exec;
9407
9408 // Silence warning for "clang -g foo.o -o foo"
9409 Args.ClaimAllArgs(options::OPT_g_Group);
9410 // and "clang -emit-llvm foo.o -o foo"
9411 Args.ClaimAllArgs(options::OPT_emit_llvm);
9412 // and for "clang -w foo.o -o foo"
9413 Args.ClaimAllArgs(options::OPT_w);
9414 // Other warning options are already handled somewhere else.
9415
9416 if (!D.SysRoot.empty())
9417 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9418
9419 if (Args.hasArg(options::OPT_pie))
9420 CmdArgs.push_back("-pie");
9421 if (Args.hasArg(options::OPT_rdynamic))
9422 CmdArgs.push_back("-export-dynamic");
9423 if (Args.hasArg(options::OPT_s))
9424 CmdArgs.push_back("--strip-all");
9425
9426 CmdArgs.push_back("-m");
9427 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009428 default:
9429 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009430 case llvm::Triple::arm:
9431 case llvm::Triple::thumb:
9432 // FIXME: this is incorrect for WinCE
9433 CmdArgs.push_back("thumb2pe");
9434 break;
9435 case llvm::Triple::x86:
9436 CmdArgs.push_back("i386pe");
9437 EntryPoint.append("_");
9438 break;
9439 case llvm::Triple::x86_64:
9440 CmdArgs.push_back("i386pep");
9441 break;
9442 }
9443
9444 if (Args.hasArg(options::OPT_shared)) {
9445 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009446 default:
9447 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009448 case llvm::Triple::arm:
9449 case llvm::Triple::thumb:
9450 case llvm::Triple::x86_64:
9451 EntryPoint.append("_DllMainCRTStartup");
9452 break;
9453 case llvm::Triple::x86:
9454 EntryPoint.append("_DllMainCRTStartup@12");
9455 break;
9456 }
9457
9458 CmdArgs.push_back("-shared");
9459 CmdArgs.push_back("-Bdynamic");
9460
9461 CmdArgs.push_back("--enable-auto-image-base");
9462
9463 CmdArgs.push_back("--entry");
9464 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9465 } else {
9466 EntryPoint.append("mainCRTStartup");
9467
9468 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9469 : "-Bdynamic");
9470
9471 if (!Args.hasArg(options::OPT_nostdlib) &&
9472 !Args.hasArg(options::OPT_nostartfiles)) {
9473 CmdArgs.push_back("--entry");
9474 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9475 }
9476
9477 // FIXME: handle subsystem
9478 }
9479
9480 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009481 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009482
9483 CmdArgs.push_back("-o");
9484 CmdArgs.push_back(Output.getFilename());
9485
9486 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9487 SmallString<261> ImpLib(Output.getFilename());
9488 llvm::sys::path::replace_extension(ImpLib, ".lib");
9489
9490 CmdArgs.push_back("--out-implib");
9491 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9492 }
9493
9494 if (!Args.hasArg(options::OPT_nostdlib) &&
9495 !Args.hasArg(options::OPT_nostartfiles)) {
9496 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9497 const char *CRTBegin;
9498
9499 CRTBegin =
9500 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9501 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9502 }
9503
9504 Args.AddAllArgs(CmdArgs, options::OPT_L);
9505
9506 const auto &Paths = TC.getFilePaths();
9507 for (const auto &Path : Paths)
9508 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9509
9510 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9511
9512 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9513 !Args.hasArg(options::OPT_nodefaultlibs)) {
9514 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9515 !Args.hasArg(options::OPT_static);
9516 if (StaticCXX)
9517 CmdArgs.push_back("-Bstatic");
9518 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9519 if (StaticCXX)
9520 CmdArgs.push_back("-Bdynamic");
9521 }
9522
9523 if (!Args.hasArg(options::OPT_nostdlib)) {
9524 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9525 // TODO handle /MT[d] /MD[d]
9526 CmdArgs.push_back("-lmsvcrt");
9527 AddRunTimeLibs(TC, D, CmdArgs, Args);
9528 }
9529 }
9530
9531 const std::string Linker = TC.GetProgramPath("ld");
9532 Exec = Args.MakeArgString(Linker);
9533
Justin Bognerd3371d82015-07-17 03:35:54 +00009534 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009535}
Douglas Katzman84a75642015-06-19 14:55:19 +00009536
Douglas Katzman95354292015-06-23 20:42:09 +00009537void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9538 const InputInfo &Output,
9539 const InputInfoList &Inputs,
9540 const ArgList &Args,
9541 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009542
9543 ArgStringList CmdArgs;
9544
9545 assert(Inputs.size() == 1);
9546 const InputInfo &II = Inputs[0];
9547 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9548 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9549
Douglas Katzman84a75642015-06-19 14:55:19 +00009550 CmdArgs.push_back("-DMYRIAD2");
9551 CmdArgs.push_back("-mcpu=myriad2");
9552 CmdArgs.push_back("-S");
9553
Douglas Katzmanf6071112015-08-03 14:34:22 +00009554 // Append all -I, -iquote, -isystem paths, defines/undefines,
9555 // 'f' flags, optimize flags, and warning options.
9556 // These are spelled the same way in clang and moviCompile.
9557 Args.AddAllArgs(CmdArgs,
9558 {options::OPT_I_Group, options::OPT_clang_i_Group,
9559 options::OPT_D, options::OPT_U,
9560 options::OPT_f_Group,
9561 options::OPT_f_clang_Group,
9562 options::OPT_g_Group,
9563 options::OPT_O_Group,
9564 options::OPT_W_Group});
Douglas Katzman84a75642015-06-19 14:55:19 +00009565 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9566
9567 CmdArgs.push_back(II.getFilename());
9568 CmdArgs.push_back("-o");
9569 CmdArgs.push_back(Output.getFilename());
9570
9571 std::string Exec =
9572 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009573 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9574 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009575}
9576
Douglas Katzman95354292015-06-23 20:42:09 +00009577void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9578 const InputInfo &Output,
9579 const InputInfoList &Inputs,
9580 const ArgList &Args,
9581 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009582 ArgStringList CmdArgs;
9583
9584 assert(Inputs.size() == 1);
9585 const InputInfo &II = Inputs[0];
9586 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9587 assert(Output.getType() == types::TY_Object);
9588
9589 CmdArgs.push_back("-no6thSlotCompression");
9590 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9591 CmdArgs.push_back("-noSPrefixing");
9592 CmdArgs.push_back("-a"); // Mystery option.
9593 for (auto Arg : Args.filtered(options::OPT_I)) {
9594 Arg->claim();
9595 CmdArgs.push_back(
9596 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9597 }
9598 CmdArgs.push_back("-elf"); // Output format.
9599 CmdArgs.push_back(II.getFilename());
9600 CmdArgs.push_back(
9601 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9602
9603 std::string Exec =
9604 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009605 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9606 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009607}