blob: a2955dbb9e77347c3ace1649d95e67e8385eef90 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000087 if (const Arg *A =
88 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
89 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
90 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000091}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000098 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000099 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000100 default:
101 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000102 case ' ':
103 case '\\':
104 Res.push_back('\\');
105 break;
106 }
107 Res.push_back(*Arg);
108 }
109}
110
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000111// Quote target names for inclusion in GNU Make dependency files.
112// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000113static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000139static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
140 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000141 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000142 bool CombinedArg = false;
143
Bill Wendling281ca292012-03-12 21:22:35 +0000144 if (!DirList)
145 return; // Nothing to do.
146
Chad Rosier616e8a52012-10-30 21:42:09 +0000147 StringRef Name(ArgName);
148 if (Name.equals("-I") || Name.equals("-L"))
149 CombinedArg = true;
150
Bill Wendling281ca292012-03-12 21:22:35 +0000151 StringRef Dirs(DirList);
152 if (Dirs.empty()) // Empty string should not add '.'.
153 return;
154
155 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000156 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000157 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 if (CombinedArg) {
159 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
160 } else {
161 CmdArgs.push_back(ArgName);
162 CmdArgs.push_back(".");
163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000165 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000166 CmdArgs.push_back(
167 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendling281ca292012-03-12 21:22:35 +0000172 }
Nico Weber89355782012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendling281ca292012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191}
192
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000193static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
194 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000195 const Driver &D = TC.getDriver();
196
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000197 // Add extra linker input arguments which are not treated as inputs
198 // (constructed via -Xarch_).
199 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
200
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000201 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000202 if (!TC.HasNativeLLVMSupport()) {
203 // Don't try to pass LLVM inputs unless we have native support.
204 if (II.getType() == types::TY_LLVM_IR ||
205 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000206 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
207 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000208 }
209
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000210 // Add filenames immediately.
211 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000212 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000213 continue;
214 }
215
216 // Otherwise, this is a linker input argument.
217 const Arg &A = II.getInputArg();
218
219 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000220 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000221 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000222 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000223 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000224 else if (A.getOption().matches(options::OPT_z)) {
225 // Pass -z prefix for gcc linker compatibility.
226 A.claim();
227 A.render(Args, CmdArgs);
228 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000229 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000230 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000231 }
Bill Wendling281ca292012-03-12 21:22:35 +0000232
233 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000234 // and only supported on native toolchains.
235 if (!TC.isCrossCompiling())
236 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237}
238
John McCall31168b02011-06-15 23:02:42 +0000239/// \brief Determine whether Objective-C automated reference counting is
240/// enabled.
241static bool isObjCAutoRefCount(const ArgList &Args) {
242 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
243}
244
Ted Kremeneke65b0862012-03-06 20:05:56 +0000245/// \brief Determine whether we are linking the ObjC runtime.
246static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000247 if (isObjCAutoRefCount(Args)) {
248 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000250 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000251 return Args.hasArg(options::OPT_fobjc_link_runtime);
252}
253
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000254static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000255 // Don't forward inputs from the original command line. They are added from
256 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000257 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000258 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000259}
260
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000261void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
262 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 ArgStringList &CmdArgs,
264 const InputInfo &Output,
265 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000266 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000267
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000268 CheckPreprocessingOptions(D, Args);
269
270 Args.AddLastArg(CmdArgs, options::OPT_C);
271 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000272
273 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000274 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 (A = Args.getLastArg(options::OPT_MD)) ||
276 (A = Args.getLastArg(options::OPT_MMD))) {
277 // Determine the output location.
278 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000279 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000280 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000281 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000282 } else if (Output.getType() == types::TY_Dependencies) {
283 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000284 } else if (A->getOption().matches(options::OPT_M) ||
285 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000286 DepFile = "-";
287 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000288 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000289 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000290 }
291 CmdArgs.push_back("-dependency-file");
292 CmdArgs.push_back(DepFile);
293
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000294 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000295 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
296 const char *DepTarget;
297
298 // If user provided -o, that is the dependency target, except
299 // when we are only generating a dependency file.
300 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
301 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000302 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 } else {
304 // Otherwise derive from the base input.
305 //
306 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000307 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000308 llvm::sys::path::replace_extension(P, "o");
309 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 }
311
312 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000314 QuoteTarget(DepTarget, Quoted);
315 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000318 if (A->getOption().matches(options::OPT_M) ||
319 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000321 if ((isa<PrecompileJobAction>(JA) &&
322 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
323 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000324 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000325 }
326
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000327 if (Args.hasArg(options::OPT_MG)) {
328 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000329 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000330 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000331 CmdArgs.push_back("-MG");
332 }
333
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000335 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336
337 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000338 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000339 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000340
Daniel Dunbara442fd52010-06-11 22:00:13 +0000341 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000342 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000343 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000344 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 CmdArgs.push_back(Args.MakeArgString(Quoted));
346
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000347 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000348 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000349 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350 }
351 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000352
Douglas Gregor111af7d2009-04-18 00:34:01 +0000353 // Add -i* options, and automatically translate to
354 // -include-pch/-include-pth for transparent PCH support. It's
355 // wonky, but we include looking for .gch so we can support seamless
356 // replacement into a build system already set up to be generating
357 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000358 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000359 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000360 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000361 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
362 RenderedImplicitInclude = true;
363
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000364 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000365 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000366
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000367 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000369 SmallString<128> P(A->getValue());
370 // We want the files to have a name like foo.h.pch. Add a dummy extension
371 // so that replace_extension does the right thing.
372 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000373 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000374 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000375 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000377 }
378
Douglas Gregor111af7d2009-04-18 00:34:01 +0000379 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000380 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000381 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000382 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000383 }
384
Douglas Gregor111af7d2009-04-18 00:34:01 +0000385 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000387 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000388 FoundPCH = UsePCH;
389 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000390 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000391 }
392
393 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000394 if (IsFirstImplicitInclude) {
395 A->claim();
396 if (UsePCH)
397 CmdArgs.push_back("-include-pch");
398 else
399 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000401 continue;
402 } else {
403 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000404 D.Diag(diag::warn_drv_pch_not_first_include) << P
405 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000406 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000407 }
408 }
409
410 // Not translated, render as usual.
411 A->claim();
412 A->render(Args, CmdArgs);
413 }
414
415 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000416 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
417 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000418
419 // Add -Wp, and -Xassembler if using the preprocessor.
420
421 // FIXME: There is a very unfortunate problem here, some troubled
422 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
423 // really support that we would have to parse and then translate
424 // those options. :(
425 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
426 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000427
428 // -I- is a deprecated GCC feature, reject it.
429 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000430 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000431
432 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
433 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000434 StringRef sysroot = C.getSysRoot();
435 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000436 if (!Args.hasArg(options::OPT_isysroot)) {
437 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000438 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000439 }
440 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000441
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000442 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000443 // FIXME: We should probably sink the logic for handling these from the
444 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000445 // CPATH - included following the user specified includes (but prior to
446 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000447 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000448 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000449 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000450 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000451 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000452 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000453 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000454 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000455 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000456
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000457 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000458 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000459 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000460
461 // Add system include arguments.
462 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463}
464
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000465// FIXME: Move to target hook.
466static bool isSignedCharDefault(const llvm::Triple &Triple) {
467 switch (Triple.getArch()) {
468 default:
469 return true;
470
Tim Northover9bb857a2013-01-31 12:13:10 +0000471 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000472 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000473 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000474 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000475 case llvm::Triple::thumb:
476 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000477 if (Triple.isOSDarwin() || Triple.isOSWindows())
478 return true;
479 return false;
480
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000481 case llvm::Triple::ppc:
482 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000483 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000484 return true;
485 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000486
David Majnemerdcecd932015-05-23 19:23:55 +0000487 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000488 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000489 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000490 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000491 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492 }
493}
494
Robert Lytton0e076492013-08-13 09:43:10 +0000495static bool isNoCommonDefault(const llvm::Triple &Triple) {
496 switch (Triple.getArch()) {
497 default:
498 return false;
499
500 case llvm::Triple::xcore:
501 return true;
502 }
503}
504
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000505// Handle -mhwdiv=.
506static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000507 const ArgList &Args,
508 std::vector<const char *> &Features) {
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000509 StringRef HWDiv = A->getValue();
510 if (HWDiv == "arm") {
511 Features.push_back("+hwdiv-arm");
512 Features.push_back("-hwdiv");
513 } else if (HWDiv == "thumb") {
514 Features.push_back("-hwdiv-arm");
515 Features.push_back("+hwdiv");
516 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
517 Features.push_back("+hwdiv-arm");
518 Features.push_back("+hwdiv");
519 } else if (HWDiv == "none") {
520 Features.push_back("-hwdiv-arm");
521 Features.push_back("-hwdiv");
522 } else
523 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
524}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000525
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000526// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000527static void getARMFPUFeatures(const Driver &D, const Arg *A,
528 const ArgList &Args,
529 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000530 StringRef FPU = A->getValue();
John Brawn5a589ad2015-06-05 13:34:11 +0000531 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
532 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000533 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
534}
535
John Brawn94fd9632015-05-21 12:19:49 +0000536static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000537 llvm::StringRef Arch = Triple.getArchName();
538 return llvm::ARMTargetParser::parseArchVersion(Arch);
John Brawn94fd9632015-05-21 12:19:49 +0000539}
540
John Brawn94fd9632015-05-21 12:19:49 +0000541static bool isARMMProfile(const llvm::Triple &Triple) {
Renato Golinf6c154d2015-05-22 18:18:25 +0000542 llvm::StringRef Arch = Triple.getArchName();
543 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
544 return Profile == llvm::ARM::PK_M;
John Brawn94fd9632015-05-21 12:19:49 +0000545}
546
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000547// Select the float ABI as determined by -msoft-float, -mhard-float, and
548// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000549StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000550 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000551 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000552 if (Arg *A =
553 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
554 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000555 if (A->getOption().matches(options::OPT_msoft_float))
556 FloatABI = "soft";
557 else if (A->getOption().matches(options::OPT_mhard_float))
558 FloatABI = "hard";
559 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000560 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000561 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000562 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000563 FloatABI = "soft";
564 }
565 }
566 }
567
568 // If unspecified, choose the default based on the platform.
569 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000570 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000571 case llvm::Triple::Darwin:
572 case llvm::Triple::MacOSX:
573 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000574 // Darwin defaults to "softfp" for v6 and v7.
575 //
John Brawn94fd9632015-05-21 12:19:49 +0000576 if (getARMSubArchVersionNumber(Triple) == 6 ||
577 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000578 FloatABI = "softfp";
579 else
580 FloatABI = "soft";
581 break;
582 }
583
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000584 // FIXME: this is invalid for WindowsCE
585 case llvm::Triple::Win32:
586 FloatABI = "hard";
587 break;
588
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000589 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000590 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000591 case llvm::Triple::GNUEABIHF:
592 FloatABI = "hard";
593 break;
594 default:
595 // FreeBSD defaults to soft float
596 FloatABI = "soft";
597 break;
598 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000599 break;
600
Daniel Dunbar78485922009-09-10 23:00:09 +0000601 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000602 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000603 case llvm::Triple::GNUEABIHF:
604 FloatABI = "hard";
605 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000606 case llvm::Triple::GNUEABI:
607 FloatABI = "softfp";
608 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000609 case llvm::Triple::EABIHF:
610 FloatABI = "hard";
611 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000612 case llvm::Triple::EABI:
613 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
614 FloatABI = "softfp";
615 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000616 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000617 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000618 FloatABI = "softfp";
619 else
620 FloatABI = "soft";
621 break;
622 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000623 default:
624 // Assume "soft", but warn the user we are guessing.
625 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000626 if (Triple.getOS() != llvm::Triple::UnknownOS ||
627 !Triple.isOSBinFormatMachO())
628 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000629 break;
630 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 }
632 }
633
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000634 return FloatABI;
635}
636
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000637static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
638 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000639 std::vector<const char *> &Features,
640 bool ForAS) {
Nico Weber6e0ebae2015-04-29 21:16:40 +0000641 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
642 if (!ForAS) {
643 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
644 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
645 // stripped out by the ARM target. We should probably pass this a new
646 // -target-option, which is handled by the -cc1/-cc1as invocation.
647 //
648 // FIXME2: For consistency, it would be ideal if we set up the target
649 // machine state the same when using the frontend or the assembler. We don't
650 // currently do that for the assembler, we pass the options directly to the
651 // backend and never even instantiate the frontend TargetInfo. If we did,
652 // and used its handleTargetFeatures hook, then we could ensure the
653 // assembler and the frontend behave the same.
654
655 // Use software floating point operations?
656 if (FloatABI == "soft")
657 Features.push_back("+soft-float");
658
659 // Use software floating point argument passing?
660 if (FloatABI != "hard")
661 Features.push_back("+soft-float-abi");
662 }
663
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000664 // Honor -mfpu=.
665 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000666 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000667 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
668 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000669
John Brawna8f82342015-05-29 13:10:44 +0000670 // Check if -march is valid by checking if it can be canonicalised and parsed.
671 // getARMArch is used here instead of just checking the -march value in order
672 // to handle -march=native correctly.
John Brawn94fd9632015-05-21 12:19:49 +0000673 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000674 std::string Arch = arm::getARMArch(Args, Triple);
John Brawna8f82342015-05-29 13:10:44 +0000675 if (llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_INVALID)
John Brawna95c1a82015-05-08 12:52:18 +0000676 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000677 }
678
679 // We do a similar thing with -mcpu, but here things are complicated because
680 // the only function we have to check if a cpu is valid is
681 // getLLVMArchSuffixForARM which also needs an architecture.
682 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +0000683 std::string CPU = arm::getARMTargetCPU(Args, Triple);
Gabor Ballabascebcb3b2015-06-11 12:29:56 +0000684 std::string Arch = arm::getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000685 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
686 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
687 }
John Brawna95c1a82015-05-08 12:52:18 +0000688
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000689 // Setting -msoft-float effectively disables NEON because of the GCC
690 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000691 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000692 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000693 // Also need to explicitly disable features which imply NEON.
694 Features.push_back("-crypto");
695 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000696
Eric Christopher269c2a22015-04-04 03:34:43 +0000697 // En/disable crc code generation.
698 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000699 if (A->getOption().matches(options::OPT_mcrc))
700 Features.push_back("+crc");
701 else
702 Features.push_back("-crc");
703 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000704
705 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
706 Features.insert(Features.begin(), "+v8.1a");
707 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000708}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000709
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000710void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000711 bool KernelOrKext) const {
712 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000713 // Get the effective triple, which takes into account the deployment target.
714 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
715 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000716
717 // Select the ABI to use.
718 //
719 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000720 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000721 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000722 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000723 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000724 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000725 // The backend is hardwired to assume AAPCS for M-class processors, ensure
726 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000727 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000728 Triple.getOS() == llvm::Triple::UnknownOS || isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000729 ABIName = "aapcs";
730 } else {
731 ABIName = "apcs-gnu";
732 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000733 } else if (Triple.isOSWindows()) {
734 // FIXME: this is invalid for WindowsCE
735 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000736 } else {
737 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000738 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000739 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000740 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000741 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000742 ABIName = "aapcs-linux";
743 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000744 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000745 case llvm::Triple::EABI:
746 ABIName = "aapcs";
747 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000748 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000749 if (Triple.getOS() == llvm::Triple::NetBSD)
750 ABIName = "apcs-gnu";
751 else
752 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000753 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000754 }
755 }
756 CmdArgs.push_back("-target-abi");
757 CmdArgs.push_back(ABIName);
758
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000759 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000760 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 if (FloatABI == "soft") {
762 // Floating point operations and argument passing are soft.
763 //
764 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000765 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000766 CmdArgs.push_back("-mfloat-abi");
767 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000768 } else if (FloatABI == "softfp") {
769 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000770 CmdArgs.push_back("-mfloat-abi");
771 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000772 } else {
773 // Floating point operations and argument passing are hard.
774 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000775 CmdArgs.push_back("-mfloat-abi");
776 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000777 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000778
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000779 // Kernel code has more strict alignment requirements.
780 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000781 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000782 CmdArgs.push_back("-backend-option");
783 CmdArgs.push_back("-arm-long-calls");
784 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000785
Daniel Dunbar12100e22011-03-22 16:48:17 +0000786 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000787 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000788
789 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000790 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000791 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000792 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000793
Bob Wilson0874e532014-07-29 00:23:18 +0000794 // -mkernel implies -mstrict-align; don't add the redundant option.
795 if (!KernelOrKext) {
796 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
797 options::OPT_munaligned_access)) {
798 CmdArgs.push_back("-backend-option");
799 if (A->getOption().matches(options::OPT_mno_unaligned_access))
800 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000801 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000802 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000803 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000804 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000805 }
Bob Wilson0874e532014-07-29 00:23:18 +0000806 }
807 }
808
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000809 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000810 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
811 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000812 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000813 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000814 CmdArgs.push_back("-arm-global-merge=false");
815 else
816 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000817 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000818
Bob Wilson9c8af452013-04-11 18:53:25 +0000819 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000820 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000821 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000822
Logan Chien749763e2014-04-03 13:12:44 +0000823 // llvm does not support reserving registers in general. There is support
824 // for reserving r9 on ARM though (defined as a platform-specific register
825 // in ARM EABI).
826 if (Args.hasArg(options::OPT_ffixed_r9)) {
827 CmdArgs.push_back("-backend-option");
828 CmdArgs.push_back("-arm-reserve-r9");
829 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000830}
831
Tim Northover573cbee2014-05-24 12:52:07 +0000832/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
833/// targeting.
834static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000835 Arg *A;
836 std::string CPU;
837 // If we have -mtune or -mcpu, use that.
838 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
839 CPU = A->getValue();
840 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000841 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000842 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000843 }
844
Kevin Qin110db6f2014-07-18 07:03:22 +0000845 // Handle CPU name is 'native'.
846 if (CPU == "native")
847 return llvm::sys::getHostCPUName();
848 else if (CPU.size())
849 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000850
James Molloy9b1586b2014-04-17 12:51:17 +0000851 // Make sure we pick "cyclone" if -arch is used.
852 // FIXME: Should this be picked by checking the target triple instead?
853 if (Args.getLastArg(options::OPT_arch))
854 return "cyclone";
855
856 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000857}
858
Tim Northover573cbee2014-05-24 12:52:07 +0000859void Clang::AddAArch64TargetArgs(const ArgList &Args,
860 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000861 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
862 llvm::Triple Triple(TripleStr);
863
864 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
865 Args.hasArg(options::OPT_mkernel) ||
866 Args.hasArg(options::OPT_fapple_kext))
867 CmdArgs.push_back("-disable-red-zone");
868
869 if (!Args.hasFlag(options::OPT_mimplicit_float,
870 options::OPT_mno_implicit_float, true))
871 CmdArgs.push_back("-no-implicit-float");
872
Craig Topper92fc2df2014-05-17 16:56:41 +0000873 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000874 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
875 ABIName = A->getValue();
876 else if (Triple.isOSDarwin())
877 ABIName = "darwinpcs";
878 else
879 ABIName = "aapcs";
880
881 CmdArgs.push_back("-target-abi");
882 CmdArgs.push_back(ABIName);
883
Bob Wilson0874e532014-07-29 00:23:18 +0000884 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
885 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000886 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000887 if (A->getOption().matches(options::OPT_mno_unaligned_access))
888 CmdArgs.push_back("-aarch64-strict-align");
889 else
890 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000891 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000892
Bradley Smith9ff64332014-10-13 10:16:06 +0000893 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
894 options::OPT_mno_fix_cortex_a53_835769)) {
895 CmdArgs.push_back("-backend-option");
896 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
897 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
898 else
899 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000900 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
901 // Enabled A53 errata (835769) workaround by default on android
902 CmdArgs.push_back("-backend-option");
903 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000904 }
905
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000906 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000907 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
908 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000909 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000910 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000911 CmdArgs.push_back("-aarch64-global-merge=false");
912 else
913 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000914 }
Renato Golinb625f482015-01-25 23:17:48 +0000915
916 if (Args.hasArg(options::OPT_ffixed_x18)) {
917 CmdArgs.push_back("-backend-option");
918 CmdArgs.push_back("-aarch64-reserve-x18");
919 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000920}
921
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000922// Get CPU and ABI names. They are not independent
923// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000924void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
925 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000926 const char *DefMips32CPU = "mips32r2";
927 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000928
Daniel Sanders2bf13662014-07-10 14:40:57 +0000929 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
930 // default for mips64(el)?-img-linux-gnu.
931 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
932 Triple.getEnvironment() == llvm::Triple::GNU) {
933 DefMips32CPU = "mips32r6";
934 DefMips64CPU = "mips64r6";
935 }
936
Brad Smithba26f582015-01-06 02:53:17 +0000937 // MIPS3 is the default for mips64*-unknown-openbsd.
938 if (Triple.getOS() == llvm::Triple::OpenBSD)
939 DefMips64CPU = "mips3";
940
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000941 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000942 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000943
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000944 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000945 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000946 // Convert a GNU style Mips ABI name to the name
947 // accepted by LLVM Mips backend.
948 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000949 .Case("32", "o32")
950 .Case("64", "n64")
951 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000952 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000953
954 // Setup default CPU and ABI names.
955 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000956 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000957 default:
958 llvm_unreachable("Unexpected triple arch name");
959 case llvm::Triple::mips:
960 case llvm::Triple::mipsel:
961 CPUName = DefMips32CPU;
962 break;
963 case llvm::Triple::mips64:
964 case llvm::Triple::mips64el:
965 CPUName = DefMips64CPU;
966 break;
967 }
968 }
969
Simon Atanasyana42a84e2014-07-02 13:20:36 +0000970 if (ABIName.empty()) {
971 // Deduce ABI name from the target triple.
972 if (Triple.getArch() == llvm::Triple::mips ||
973 Triple.getArch() == llvm::Triple::mipsel)
974 ABIName = "o32";
975 else
976 ABIName = "n64";
977 }
978
979 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000980 // Deduce CPU name from ABI name.
981 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000982 .Cases("o32", "eabi", DefMips32CPU)
983 .Cases("n32", "n64", DefMips64CPU)
984 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000985 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +0000986
987 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000988}
989
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000990// Convert ABI name to the GNU tools acceptable variant.
991static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
992 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000993 .Case("o32", "32")
994 .Case("n64", "64")
995 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000996}
997
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000998// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
999// and -mfloat-abi=.
1000static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001001 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001002 if (Arg *A =
1003 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1004 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001005 if (A->getOption().matches(options::OPT_msoft_float))
1006 FloatABI = "soft";
1007 else if (A->getOption().matches(options::OPT_mhard_float))
1008 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001009 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001010 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001011 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001012 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001013 FloatABI = "hard";
1014 }
1015 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001016 }
1017
1018 // If unspecified, choose the default based on the platform.
1019 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001020 // Assume "hard", because it's a default value used by gcc.
1021 // When we start to recognize specific target MIPS processors,
1022 // we will be able to select the default more correctly.
1023 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001024 }
1025
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001026 return FloatABI;
1027}
1028
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001029static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001030 std::vector<const char *> &Features,
1031 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001032 StringRef FeatureName) {
1033 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001034 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001035 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001036 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001037 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001038 }
1039}
1040
Daniel Sanders379d44b2014-07-16 11:52:23 +00001041static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1042 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001043 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001044 StringRef CPUName;
1045 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001046 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001047 ABIName = getGnuCompatibleMipsABIName(ABIName);
1048
Daniel Sandersfeb61302014-08-08 15:47:17 +00001049 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1050 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001051
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001052 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001053 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001054 // FIXME: Note, this is a hack. We need to pass the selected float
1055 // mode to the MipsTargetInfoBase to define appropriate macros there.
1056 // Now it is the only method.
1057 Features.push_back("+soft-float");
1058 }
1059
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001060 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001061 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001062 if (Val == "2008") {
1063 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1064 Features.push_back("+nan2008");
1065 else {
1066 Features.push_back("-nan2008");
1067 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1068 }
1069 } else if (Val == "legacy") {
1070 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1071 Features.push_back("-nan2008");
1072 else {
1073 Features.push_back("+nan2008");
1074 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1075 }
1076 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001077 D.Diag(diag::err_drv_unsupported_option_argument)
1078 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001079 }
1080
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001081 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1082 options::OPT_mdouble_float, "single-float");
1083 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1084 "mips16");
1085 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1086 options::OPT_mno_micromips, "micromips");
1087 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1088 "dsp");
1089 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1090 "dspr2");
1091 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1092 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001093
1094 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1095 // pass -mfpxx
1096 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1097 options::OPT_mfp64)) {
1098 if (A->getOption().matches(options::OPT_mfp32))
1099 Features.push_back(Args.MakeArgString("-fp64"));
1100 else if (A->getOption().matches(options::OPT_mfpxx)) {
1101 Features.push_back(Args.MakeArgString("+fpxx"));
1102 Features.push_back(Args.MakeArgString("+nooddspreg"));
1103 } else
1104 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001105 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001106 Features.push_back(Args.MakeArgString("+fpxx"));
1107 Features.push_back(Args.MakeArgString("+nooddspreg"));
1108 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001109
Daniel Sanders28e5d392014-07-10 10:39:51 +00001110 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1111 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001112}
1113
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001114void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001115 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001116 const Driver &D = getToolChain().getDriver();
1117 StringRef CPUName;
1118 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001119 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001120 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001121
1122 CmdArgs.push_back("-target-abi");
1123 CmdArgs.push_back(ABIName.data());
1124
1125 StringRef FloatABI = getMipsFloatABI(D, Args);
1126
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001127 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001128 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001129 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001130 CmdArgs.push_back("-mfloat-abi");
1131 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001132 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001133 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001134 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001135 CmdArgs.push_back("-mfloat-abi");
1136 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001137 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001138
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001139 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1140 if (A->getOption().matches(options::OPT_mxgot)) {
1141 CmdArgs.push_back("-mllvm");
1142 CmdArgs.push_back("-mxgot");
1143 }
1144 }
1145
Simon Atanasyanc580b322013-05-11 06:33:44 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1147 options::OPT_mno_ldc1_sdc1)) {
1148 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1149 CmdArgs.push_back("-mllvm");
1150 CmdArgs.push_back("-mno-ldc1-sdc1");
1151 }
1152 }
1153
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001154 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1155 options::OPT_mno_check_zero_division)) {
1156 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1157 CmdArgs.push_back("-mllvm");
1158 CmdArgs.push_back("-mno-check-zero-division");
1159 }
1160 }
1161
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001162 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001163 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001164 CmdArgs.push_back("-mllvm");
1165 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1166 A->claim();
1167 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001168}
1169
Hal Finkel8eb59282012-06-11 22:35:19 +00001170/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1171static std::string getPPCTargetCPU(const ArgList &Args) {
1172 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001173 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001174
1175 if (CPUName == "native") {
1176 std::string CPU = llvm::sys::getHostCPUName();
1177 if (!CPU.empty() && CPU != "generic")
1178 return CPU;
1179 else
1180 return "";
1181 }
1182
1183 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("common", "generic")
1185 .Case("440", "440")
1186 .Case("440fp", "440")
1187 .Case("450", "450")
1188 .Case("601", "601")
1189 .Case("602", "602")
1190 .Case("603", "603")
1191 .Case("603e", "603e")
1192 .Case("603ev", "603ev")
1193 .Case("604", "604")
1194 .Case("604e", "604e")
1195 .Case("620", "620")
1196 .Case("630", "pwr3")
1197 .Case("G3", "g3")
1198 .Case("7400", "7400")
1199 .Case("G4", "g4")
1200 .Case("7450", "7450")
1201 .Case("G4+", "g4+")
1202 .Case("750", "750")
1203 .Case("970", "970")
1204 .Case("G5", "g5")
1205 .Case("a2", "a2")
1206 .Case("a2q", "a2q")
1207 .Case("e500mc", "e500mc")
1208 .Case("e5500", "e5500")
1209 .Case("power3", "pwr3")
1210 .Case("power4", "pwr4")
1211 .Case("power5", "pwr5")
1212 .Case("power5x", "pwr5x")
1213 .Case("power6", "pwr6")
1214 .Case("power6x", "pwr6x")
1215 .Case("power7", "pwr7")
1216 .Case("power8", "pwr8")
1217 .Case("pwr3", "pwr3")
1218 .Case("pwr4", "pwr4")
1219 .Case("pwr5", "pwr5")
1220 .Case("pwr5x", "pwr5x")
1221 .Case("pwr6", "pwr6")
1222 .Case("pwr6x", "pwr6x")
1223 .Case("pwr7", "pwr7")
1224 .Case("pwr8", "pwr8")
1225 .Case("powerpc", "ppc")
1226 .Case("powerpc64", "ppc64")
1227 .Case("powerpc64le", "ppc64le")
1228 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001229 }
1230
1231 return "";
1232}
1233
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001234static void getPPCTargetFeatures(const ArgList &Args,
1235 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001236 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1237 StringRef Name = A->getOption().getName();
1238 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001239
1240 // Skip over "-m".
1241 assert(Name.startswith("m") && "Invalid feature name.");
1242 Name = Name.substr(1);
1243
1244 bool IsNegative = Name.startswith("no-");
1245 if (IsNegative)
1246 Name = Name.substr(3);
1247
1248 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1249 // pass the correct option to the backend while calling the frontend
1250 // option the same.
1251 // TODO: Change the LLVM backend option maybe?
1252 if (Name == "mfcrf")
1253 Name = "mfocrf";
1254
1255 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1256 }
1257
1258 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001259 AddTargetFeature(Args, Features, options::OPT_faltivec,
1260 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001261}
1262
Ulrich Weigand8afad612014-07-28 13:17:52 +00001263void Clang::AddPPCTargetArgs(const ArgList &Args,
1264 ArgStringList &CmdArgs) const {
1265 // Select the ABI to use.
1266 const char *ABIName = nullptr;
1267 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1268 ABIName = A->getValue();
1269 } else if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001270 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001271 case llvm::Triple::ppc64: {
1272 // When targeting a processor that supports QPX, or if QPX is
1273 // specifically enabled, default to using the ABI that supports QPX (so
1274 // long as it is not specifically disabled).
1275 bool HasQPX = false;
1276 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1277 HasQPX = A->getValue() == StringRef("a2q");
1278 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1279 if (HasQPX) {
1280 ABIName = "elfv1-qpx";
1281 break;
1282 }
1283
Ulrich Weigand8afad612014-07-28 13:17:52 +00001284 ABIName = "elfv1";
1285 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001286 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001287 case llvm::Triple::ppc64le:
1288 ABIName = "elfv2";
1289 break;
1290 default:
1291 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001292 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001293
1294 if (ABIName) {
1295 CmdArgs.push_back("-target-abi");
1296 CmdArgs.push_back(ABIName);
1297 }
1298}
1299
1300bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1301 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1302 return A && (A->getValue() == StringRef(Value));
1303}
1304
Tom Stellard6674c702013-04-01 20:56:53 +00001305/// Get the (LLVM) name of the R600 gpu we are targeting.
1306static std::string getR600TargetGPU(const ArgList &Args) {
1307 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001308 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001309 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001310 .Cases("rv630", "rv635", "r600")
1311 .Cases("rv610", "rv620", "rs780", "rs880")
1312 .Case("rv740", "rv770")
1313 .Case("palm", "cedar")
1314 .Cases("sumo", "sumo2", "sumo")
1315 .Case("hemlock", "cypress")
1316 .Case("aruba", "cayman")
1317 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001318 }
1319 return "";
1320}
1321
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001322void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001323 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001324 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001325 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001326
James Y Knightb2406522015-06-15 20:51:24 +00001327 bool SoftFloatABI = false;
1328 if (Arg *A =
1329 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001330 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001331 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001332 }
1333
James Y Knightb2406522015-06-15 20:51:24 +00001334 // Only the hard-float ABI on Sparc is standardized, and it is the
1335 // default. GCC also supports a nonstandard soft-float ABI mode, and
1336 // perhaps LLVM should implement that, too. However, since llvm
1337 // currently does not support Sparc soft-float, at all, display an
1338 // error if it's requested.
1339 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001340 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1341 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001342 }
1343}
1344
Richard Sandiford4652d892013-07-19 16:51:51 +00001345static const char *getSystemZTargetCPU(const ArgList &Args) {
1346 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1347 return A->getValue();
1348 return "z10";
1349}
1350
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001351static void getSystemZTargetFeatures(const ArgList &Args,
1352 std::vector<const char *> &Features) {
1353 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001354 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001355 if (A->getOption().matches(options::OPT_mhtm))
1356 Features.push_back("+transactional-execution");
1357 else
1358 Features.push_back("-transactional-execution");
1359 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001360 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001361 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001362 if (A->getOption().matches(options::OPT_mvx))
1363 Features.push_back("+vector");
1364 else
1365 Features.push_back("-vector");
1366 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001367}
1368
Chandler Carruth953fb082013-01-13 11:46:33 +00001369static const char *getX86TargetCPU(const ArgList &Args,
1370 const llvm::Triple &Triple) {
1371 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001372 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001373 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001374 return "core-avx2";
1375
Chandler Carruth953fb082013-01-13 11:46:33 +00001376 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001377 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001378
1379 // FIXME: Reject attempts to use -march=native unless the target matches
1380 // the host.
1381 //
1382 // FIXME: We should also incorporate the detected target features for use
1383 // with -native.
1384 std::string CPU = llvm::sys::getHostCPUName();
1385 if (!CPU.empty() && CPU != "generic")
1386 return Args.MakeArgString(CPU);
1387 }
1388
Reid Kleckner3123eff2015-06-30 16:32:04 +00001389 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1390 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1391 StringRef Arch = A->getValue();
1392 const char *CPU;
1393 if (Triple.getArch() == llvm::Triple::x86) {
1394 CPU = llvm::StringSwitch<const char *>(Arch)
1395 .Case("IA32", "i386")
1396 .Case("SSE", "pentium3")
1397 .Case("SSE2", "pentium4")
1398 .Case("AVX", "sandybridge")
1399 .Case("AVX2", "haswell")
1400 .Default(nullptr);
1401 } else {
1402 CPU = llvm::StringSwitch<const char *>(Arch)
1403 .Case("AVX", "sandybridge")
1404 .Case("AVX2", "haswell")
1405 .Default(nullptr);
1406 }
1407 if (CPU)
1408 return CPU;
1409 }
1410
Chandler Carruth953fb082013-01-13 11:46:33 +00001411 // Select the default CPU if none was given (or detection failed).
1412
1413 if (Triple.getArch() != llvm::Triple::x86_64 &&
1414 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001415 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001416
1417 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1418
1419 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001420 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001421 if (Triple.getArchName() == "x86_64h")
1422 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001423 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001424 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001425
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001426 // Set up default CPU name for PS4 compilers.
1427 if (Triple.isPS4CPU())
1428 return "btver2";
1429
Alexey Bataev286d1b92014-01-31 04:07:13 +00001430 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001431 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001432 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001433
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001434 // Everything else goes to x86-64 in 64-bit mode.
1435 if (Is64Bit)
1436 return "x86-64";
1437
1438 switch (Triple.getOS()) {
1439 case llvm::Triple::FreeBSD:
1440 case llvm::Triple::NetBSD:
1441 case llvm::Triple::OpenBSD:
1442 return "i486";
1443 case llvm::Triple::Haiku:
1444 return "i586";
1445 case llvm::Triple::Bitrig:
1446 return "i686";
1447 default:
1448 // Fallback to p4.
1449 return "pentium4";
1450 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001451}
1452
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001453static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001454 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001455 default:
1456 return "";
1457
Amara Emerson703da2e2013-10-31 09:32:33 +00001458 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001459 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001460 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001461
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001462 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001463 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001464 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001465 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001466 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001467
1468 case llvm::Triple::mips:
1469 case llvm::Triple::mipsel:
1470 case llvm::Triple::mips64:
1471 case llvm::Triple::mips64el: {
1472 StringRef CPUName;
1473 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001474 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001475 return CPUName;
1476 }
1477
1478 case llvm::Triple::ppc:
1479 case llvm::Triple::ppc64:
1480 case llvm::Triple::ppc64le: {
1481 std::string TargetCPUName = getPPCTargetCPU(Args);
1482 // LLVM may default to generating code for the native CPU,
1483 // but, like gcc, we default to a more generic option for
1484 // each architecture. (except on Darwin)
1485 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1486 if (T.getArch() == llvm::Triple::ppc64)
1487 TargetCPUName = "ppc64";
1488 else if (T.getArch() == llvm::Triple::ppc64le)
1489 TargetCPUName = "ppc64le";
1490 else
1491 TargetCPUName = "ppc";
1492 }
1493 return TargetCPUName;
1494 }
1495
1496 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001497 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001498 case llvm::Triple::sparcv9:
1499 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001500 return A->getValue();
1501 return "";
1502
1503 case llvm::Triple::x86:
1504 case llvm::Triple::x86_64:
1505 return getX86TargetCPU(Args, T);
1506
1507 case llvm::Triple::hexagon:
1508 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1509
1510 case llvm::Triple::systemz:
1511 return getSystemZTargetCPU(Args);
1512
1513 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001514 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001515 return getR600TargetGPU(Args);
1516 }
1517}
1518
Alp Tokerce365ca2013-12-02 12:43:03 +00001519static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1520 ArgStringList &CmdArgs) {
1521 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1522 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1523 // forward.
1524 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001525 std::string Plugin =
1526 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001527 CmdArgs.push_back(Args.MakeArgString(Plugin));
1528
1529 // Try to pass driver level flags relevant to LTO code generation down to
1530 // the plugin.
1531
1532 // Handle flags for selecting CPU variants.
1533 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1534 if (!CPU.empty())
1535 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1536}
1537
Sanjay Patel2987c292015-06-11 14:53:41 +00001538/// This is a helper function for validating the optional refinement step
1539/// parameter in reciprocal argument strings. Return false if there is an error
1540/// parsing the refinement step. Otherwise, return true and set the Position
1541/// of the refinement step in the input string.
1542static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001543 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001544 const char RefinementStepToken = ':';
1545 Position = In.find(RefinementStepToken);
1546 if (Position != StringRef::npos) {
1547 StringRef Option = A.getOption().getName();
1548 StringRef RefStep = In.substr(Position + 1);
1549 // Allow exactly one numeric character for the additional refinement
1550 // step parameter. This is reasonable for all currently-supported
1551 // operations and architectures because we would expect that a larger value
1552 // of refinement steps would cause the estimate "optimization" to
1553 // under-perform the native operation. Also, if the estimate does not
1554 // converge quickly, it probably will not ever converge, so further
1555 // refinement steps will not produce a better answer.
1556 if (RefStep.size() != 1) {
1557 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1558 return false;
1559 }
1560 char RefStepChar = RefStep[0];
1561 if (RefStepChar < '0' || RefStepChar > '9') {
1562 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1563 return false;
1564 }
1565 }
1566 return true;
1567}
1568
1569/// The -mrecip flag requires processing of many optional parameters.
1570static void ParseMRecip(const Driver &D, const ArgList &Args,
1571 ArgStringList &OutStrings) {
1572 StringRef DisabledPrefixIn = "!";
1573 StringRef DisabledPrefixOut = "!";
1574 StringRef EnabledPrefixOut = "";
1575 StringRef Out = "-mrecip=";
1576
1577 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1578 if (!A)
1579 return;
1580
1581 unsigned NumOptions = A->getNumValues();
1582 if (NumOptions == 0) {
1583 // No option is the same as "all".
1584 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1585 return;
1586 }
1587
1588 // Pass through "all", "none", or "default" with an optional refinement step.
1589 if (NumOptions == 1) {
1590 StringRef Val = A->getValue(0);
1591 size_t RefStepLoc;
1592 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1593 return;
1594 StringRef ValBase = Val.slice(0, RefStepLoc);
1595 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1596 OutStrings.push_back(Args.MakeArgString(Out + Val));
1597 return;
1598 }
1599 }
1600
1601 // Each reciprocal type may be enabled or disabled individually.
1602 // Check each input value for validity, concatenate them all back together,
1603 // and pass through.
1604
1605 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001606 OptionStrings.insert(std::make_pair("divd", false));
1607 OptionStrings.insert(std::make_pair("divf", false));
1608 OptionStrings.insert(std::make_pair("vec-divd", false));
1609 OptionStrings.insert(std::make_pair("vec-divf", false));
1610 OptionStrings.insert(std::make_pair("sqrtd", false));
1611 OptionStrings.insert(std::make_pair("sqrtf", false));
1612 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1613 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001614
1615 for (unsigned i = 0; i != NumOptions; ++i) {
1616 StringRef Val = A->getValue(i);
1617
1618 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1619 // Ignore the disablement token for string matching.
1620 if (IsDisabled)
1621 Val = Val.substr(1);
1622
1623 size_t RefStep;
1624 if (!getRefinementStep(Val, D, *A, RefStep))
1625 return;
1626
1627 StringRef ValBase = Val.slice(0, RefStep);
1628 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1629 if (OptionIter == OptionStrings.end()) {
1630 // Try again specifying float suffix.
1631 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1632 if (OptionIter == OptionStrings.end()) {
1633 // The input name did not match any known option string.
1634 D.Diag(diag::err_drv_unknown_argument) << Val;
1635 return;
1636 }
1637 // The option was specified without a float or double suffix.
1638 // Make sure that the double entry was not already specified.
1639 // The float entry will be checked below.
1640 if (OptionStrings[ValBase.str() + 'd']) {
1641 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1642 return;
1643 }
1644 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001645
Sanjay Patel2987c292015-06-11 14:53:41 +00001646 if (OptionIter->second == true) {
1647 // Duplicate option specified.
1648 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1649 return;
1650 }
1651
1652 // Mark the matched option as found. Do not allow duplicate specifiers.
1653 OptionIter->second = true;
1654
1655 // If the precision was not specified, also mark the double entry as found.
1656 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1657 OptionStrings[ValBase.str() + 'd'] = true;
1658
1659 // Build the output string.
1660 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1661 Out = Args.MakeArgString(Out + Prefix + Val);
1662 if (i != NumOptions - 1)
1663 Out = Args.MakeArgString(Out + ",");
1664 }
1665
1666 OutStrings.push_back(Args.MakeArgString(Out));
1667}
1668
Eric Christopherc54920a2015-03-23 19:26:05 +00001669static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001670 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001671 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001672 // If -march=native, autodetect the feature list.
1673 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1674 if (StringRef(A->getValue()) == "native") {
1675 llvm::StringMap<bool> HostFeatures;
1676 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1677 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001678 Features.push_back(
1679 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001680 }
1681 }
1682
Jim Grosbach82eee262013-11-16 00:53:35 +00001683 if (Triple.getArchName() == "x86_64h") {
1684 // x86_64h implies quite a few of the more modern subtarget features
1685 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1686 Features.push_back("-rdrnd");
1687 Features.push_back("-aes");
1688 Features.push_back("-pclmul");
1689 Features.push_back("-rtm");
1690 Features.push_back("-hle");
1691 Features.push_back("-fsgsbase");
1692 }
1693
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001694 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001695 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001696 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001697 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001698 Features.push_back("+sse4.2");
1699 Features.push_back("+popcnt");
1700 } else
1701 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001702 }
1703
Eric Christopherc54920a2015-03-23 19:26:05 +00001704 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001705 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1706 StringRef Arch = A->getValue();
1707 bool ArchUsed = false;
1708 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001709 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001710 if (Arch == "AVX" || Arch == "AVX2") {
1711 ArchUsed = true;
1712 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1713 }
1714 }
1715 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001716 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001717 if (Arch == "IA32") {
1718 ArchUsed = true;
1719 } else if (Arch == "SSE" || Arch == "SSE2") {
1720 ArchUsed = true;
1721 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1722 }
1723 }
1724 if (!ArchUsed)
1725 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1726 }
1727
Jim Grosbach82eee262013-11-16 00:53:35 +00001728 // Now add any that the user explicitly requested on the command line,
1729 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001730 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1731 StringRef Name = A->getOption().getName();
1732 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001733
1734 // Skip over "-m".
1735 assert(Name.startswith("m") && "Invalid feature name.");
1736 Name = Name.substr(1);
1737
1738 bool IsNegative = Name.startswith("no-");
1739 if (IsNegative)
1740 Name = Name.substr(3);
1741
1742 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1743 }
1744}
1745
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001746void Clang::AddX86TargetArgs(const ArgList &Args,
1747 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001748 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001749 Args.hasArg(options::OPT_mkernel) ||
1750 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001751 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001752
Bob Wilson2616e2e2013-02-10 16:01:41 +00001753 // Default to avoid implicit floating-point for kernel/kext code, but allow
1754 // that to be overridden with -mno-soft-float.
1755 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1756 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001757 if (Arg *A = Args.getLastArg(
1758 options::OPT_msoft_float, options::OPT_mno_soft_float,
1759 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001760 const Option &O = A->getOption();
1761 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1762 O.matches(options::OPT_msoft_float));
1763 }
1764 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001765 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001766
1767 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1768 StringRef Value = A->getValue();
1769 if (Value == "intel" || Value == "att") {
1770 CmdArgs.push_back("-mllvm");
1771 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1772 } else {
1773 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1774 << A->getOption().getName() << Value;
1775 }
1776 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001777}
1778
Tony Linthicum76329bf2011-12-12 21:14:55 +00001779void Clang::AddHexagonTargetArgs(const ArgList &Args,
1780 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001781 CmdArgs.push_back("-mqdsp6-compat");
1782 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001784 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
1785 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001786 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001787 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001788 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001789 }
1790
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001791 if (!Args.hasArg(options::OPT_fno_short_enums))
1792 CmdArgs.push_back("-fshort-enums");
1793 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001794 CmdArgs.push_back("-mllvm");
1795 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001796 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001797 CmdArgs.push_back("-mllvm");
1798 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001799}
1800
Kevin Qin110db6f2014-07-18 07:03:22 +00001801// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001802static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001803 std::vector<const char *> &Features) {
1804 SmallVector<StringRef, 8> Split;
1805 text.split(Split, StringRef("+"), -1, false);
1806
Douglas Katzman2675d012015-06-29 19:12:56 +00001807 for (const StringRef Feature : Split) {
1808 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001809 .Case("fp", "+fp-armv8")
1810 .Case("simd", "+neon")
1811 .Case("crc", "+crc")
1812 .Case("crypto", "+crypto")
1813 .Case("nofp", "-fp-armv8")
1814 .Case("nosimd", "-neon")
1815 .Case("nocrc", "-crc")
1816 .Case("nocrypto", "-crypto")
1817 .Default(nullptr);
1818 if (result)
1819 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001820 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001821 D.Diag(diag::err_drv_no_neon_modifier);
1822 else
1823 return false;
1824 }
1825 return true;
1826}
1827
1828// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1829// decode CPU and feature.
1830static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1831 std::vector<const char *> &Features) {
1832 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1833 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001834 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1835 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001836 Features.push_back("+neon");
1837 Features.push_back("+crc");
1838 Features.push_back("+crypto");
1839 } else if (CPU == "generic") {
1840 Features.push_back("+neon");
1841 } else {
1842 return false;
1843 }
1844
1845 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1846 return false;
1847
1848 return true;
1849}
1850
1851static bool
1852getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1853 const ArgList &Args,
1854 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001855 std::string MarchLowerCase = March.lower();
1856 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001858 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001859 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001860 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001861 Features.push_back("+v8.1a");
1862 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001863 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001864 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001865
1866 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1867 return false;
1868
1869 return true;
1870}
1871
1872static bool
1873getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1874 const ArgList &Args,
1875 std::vector<const char *> &Features) {
1876 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001877 std::string McpuLowerCase = Mcpu.lower();
1878 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001879 return false;
1880
1881 return true;
1882}
1883
1884static bool
1885getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1886 const ArgList &Args,
1887 std::vector<const char *> &Features) {
1888 // Handle CPU name is 'native'.
1889 if (Mtune == "native")
1890 Mtune = llvm::sys::getHostCPUName();
1891 if (Mtune == "cyclone") {
1892 Features.push_back("+zcm");
1893 Features.push_back("+zcz");
1894 }
1895 return true;
1896}
1897
1898static bool
1899getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1900 const ArgList &Args,
1901 std::vector<const char *> &Features) {
1902 StringRef CPU;
1903 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001904 std::string McpuLowerCase = Mcpu.lower();
1905 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00001906 return false;
1907
1908 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1909}
1910
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001911static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1912 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001913 Arg *A;
1914 bool success = true;
1915 // Enable NEON by default.
1916 Features.push_back("+neon");
1917 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1918 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1919 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1920 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001921 else if (Args.hasArg(options::OPT_arch))
1922 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1923 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001924
1925 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1926 success =
1927 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1928 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1929 success =
1930 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001931 else if (Args.hasArg(options::OPT_arch))
1932 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1933 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001934
1935 if (!success)
1936 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001937
1938 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1939 Features.push_back("-fp-armv8");
1940 Features.push_back("-crypto");
1941 Features.push_back("-neon");
1942 }
Bradley Smith418c5932014-05-02 15:17:51 +00001943
1944 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001945 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00001946 if (A->getOption().matches(options::OPT_mcrc))
1947 Features.push_back("+crc");
1948 else
1949 Features.push_back("-crc");
1950 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001951}
1952
1953static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001954 const ArgList &Args, ArgStringList &CmdArgs,
1955 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001956 std::vector<const char *> Features;
1957 switch (Triple.getArch()) {
1958 default:
1959 break;
1960 case llvm::Triple::mips:
1961 case llvm::Triple::mipsel:
1962 case llvm::Triple::mips64:
1963 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001964 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001965 break;
1966
1967 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001968 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001969 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001970 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001971 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001972 break;
1973
1974 case llvm::Triple::ppc:
1975 case llvm::Triple::ppc64:
1976 case llvm::Triple::ppc64le:
1977 getPPCTargetFeatures(Args, Features);
1978 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001979 case llvm::Triple::systemz:
1980 getSystemZTargetFeatures(Args, Features);
1981 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001982 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001983 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001984 getAArch64TargetFeatures(D, Args, Features);
1985 break;
1986 case llvm::Triple::x86:
1987 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001988 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001989 break;
1990 }
Rafael Espindola43964802013-08-21 17:34:32 +00001991
1992 // Find the last of each feature.
1993 llvm::StringMap<unsigned> LastOpt;
1994 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1995 const char *Name = Features[I];
1996 assert(Name[0] == '-' || Name[0] == '+');
1997 LastOpt[Name + 1] = I;
1998 }
1999
2000 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2001 // If this feature was overridden, ignore it.
2002 const char *Name = Features[I];
2003 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2004 assert(LastI != LastOpt.end());
2005 unsigned Last = LastI->second;
2006 if (Last != I)
2007 continue;
2008
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002009 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002010 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002011 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002012}
2013
David Majnemerae394812014-12-09 00:12:30 +00002014static bool
2015shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2016 const llvm::Triple &Triple) {
2017 // We use the zero-cost exception tables for Objective-C if the non-fragile
2018 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2019 // later.
2020 if (runtime.isNonFragile())
2021 return true;
2022
2023 if (!Triple.isMacOSX())
2024 return false;
2025
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002026 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002027 (Triple.getArch() == llvm::Triple::x86_64 ||
2028 Triple.getArch() == llvm::Triple::arm));
2029}
2030
Nico Webere8e53112014-05-11 01:04:02 +00002031// exceptionSettings() exists to share the logic between -cc1 and linker
2032// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00002033static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002034 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00002035 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002036 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00002037 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002038
David Majnemer8de68642014-12-05 08:11:58 +00002039 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00002040}
2041
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002042/// Adds exception related arguments to the driver command arguments. There's a
2043/// master flag, -fexceptions and also language specific flags to enable/disable
2044/// C++ and Objective-C exceptions. This makes it possible to for example
2045/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002046static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002047 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002048 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002049 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002050 const Driver &D = TC.getDriver();
2051 const llvm::Triple &Triple = TC.getTriple();
2052
Chad Rosier4fab82c2012-03-26 22:04:46 +00002053 if (KernelOrKext) {
2054 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2055 // arguments now to avoid warnings about unused arguments.
2056 Args.ClaimAllArgs(options::OPT_fexceptions);
2057 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2058 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2059 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2060 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2061 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002062 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002063 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002064
David Majnemer8de68642014-12-05 08:11:58 +00002065 // Gather the exception settings from the command line arguments.
2066 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002067
David Majnemerae394812014-12-09 00:12:30 +00002068 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2069 // is not necessarily sensible, but follows GCC.
2070 if (types::isObjC(InputType) &&
2071 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002072 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002073 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002074
David Majnemerae394812014-12-09 00:12:30 +00002075 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002076 }
2077
2078 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00002079 bool CXXExceptionsEnabled =
2080 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002081 Arg *ExceptionArg = Args.getLastArg(
2082 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2083 options::OPT_fexceptions, options::OPT_fno_exceptions);
2084 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002085 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002086 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2087 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002088
2089 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002090 if (Triple.isPS4CPU()) {
2091 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2092 assert(ExceptionArg &&
2093 "On the PS4 exceptions should only be enabled if passing "
2094 "an argument");
2095 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2096 const Arg *RTTIArg = TC.getRTTIArg();
2097 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2098 D.Diag(diag::err_drv_argument_not_allowed_with)
2099 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2100 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2101 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2102 } else
2103 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2104
Anders Carlssone96ab552011-02-28 02:27:16 +00002105 CmdArgs.push_back("-fcxx-exceptions");
2106
David Majnemer8de68642014-12-05 08:11:58 +00002107 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002108 }
2109 }
2110
David Majnemer8de68642014-12-05 08:11:58 +00002111 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002112 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002113}
2114
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002115static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002116 bool Default = true;
2117 if (TC.getTriple().isOSDarwin()) {
2118 // The native darwin assembler doesn't support the linker_option directives,
2119 // so we disable them if we think the .s file will be passed to it.
2120 Default = TC.useIntegratedAs();
2121 }
2122 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2123 Default);
2124}
2125
Ted Kremenek62093662013-03-12 17:02:12 +00002126static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2127 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002128 bool UseDwarfDirectory =
2129 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2130 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002131 return !UseDwarfDirectory;
2132}
2133
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002134/// \brief Check whether the given input tree contains any compilation actions.
2135static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002136 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002137 return true;
2138
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002139 for (const auto &Act : *A)
2140 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002141 return true;
2142
2143 return false;
2144}
2145
2146/// \brief Check if -relax-all should be passed to the internal assembler.
2147/// This is done by default when compiling non-assembler source with -O0.
2148static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2149 bool RelaxDefault = true;
2150
2151 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2152 RelaxDefault = A->getOption().matches(options::OPT_O0);
2153
2154 if (RelaxDefault) {
2155 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002156 for (const auto &Act : C.getActions()) {
2157 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002158 RelaxDefault = true;
2159 break;
2160 }
2161 }
2162 }
2163
2164 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002165 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002166}
2167
David Blaikie9260ed62013-07-25 21:19:01 +00002168static void CollectArgsForIntegratedAssembler(Compilation &C,
2169 const ArgList &Args,
2170 ArgStringList &CmdArgs,
2171 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002172 if (UseRelaxAll(C, Args))
2173 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002174
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002175 // When passing -I arguments to the assembler we sometimes need to
2176 // unconditionally take the next argument. For example, when parsing
2177 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2178 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2179 // arg after parsing the '-I' arg.
2180 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002181
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002182 // When using an integrated assembler, translate -Wa, and -Xassembler
2183 // options.
2184 bool CompressDebugSections = false;
2185 for (const Arg *A :
2186 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2187 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002188
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002189 for (const StringRef Value : A->getValues()) {
David Peixottodfb66142013-11-14 22:52:58 +00002190 if (TakeNextArg) {
2191 CmdArgs.push_back(Value.data());
2192 TakeNextArg = false;
2193 continue;
2194 }
David Blaikie9260ed62013-07-25 21:19:01 +00002195
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002196 if (Value == "-force_cpusubtype_ALL") {
2197 // Do nothing, this is the default and we don't support anything else.
2198 } else if (Value == "-L") {
2199 CmdArgs.push_back("-msave-temp-labels");
2200 } else if (Value == "--fatal-warnings") {
2201 CmdArgs.push_back("-massembler-fatal-warnings");
2202 } else if (Value == "--noexecstack") {
2203 CmdArgs.push_back("-mnoexecstack");
2204 } else if (Value == "-compress-debug-sections" ||
2205 Value == "--compress-debug-sections") {
2206 CompressDebugSections = true;
2207 } else if (Value == "-nocompress-debug-sections" ||
2208 Value == "--nocompress-debug-sections") {
2209 CompressDebugSections = false;
2210 } else if (Value.startswith("-I")) {
2211 CmdArgs.push_back(Value.data());
2212 // We need to consume the next argument if the current arg is a plain
2213 // -I. The next arg will be the include directory.
2214 if (Value == "-I")
2215 TakeNextArg = true;
2216 } else if (Value.startswith("-gdwarf-")) {
2217 CmdArgs.push_back(Value.data());
2218 } else {
2219 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002220 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002221 }
2222 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 }
2224 if (CompressDebugSections) {
2225 if (llvm::zlib::isAvailable())
2226 CmdArgs.push_back("-compress-debug-sections");
2227 else
2228 D.Diag(diag::warn_debug_compression_unavailable);
2229 }
David Blaikie9260ed62013-07-25 21:19:01 +00002230}
2231
Renato Goline807c122014-01-31 11:47:28 +00002232// Until ARM libraries are build separately, we have them all in one library
2233static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002234 if (TC.getTriple().isOSWindows() &&
2235 !TC.getTriple().isWindowsItaniumEnvironment() &&
2236 TC.getArch() == llvm::Triple::x86)
2237 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002238 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002239 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002240 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002241}
2242
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002243static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2244 // The runtimes are located in the OS-specific resource directory.
2245 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002246 const llvm::Triple &Triple = TC.getTriple();
2247 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002248 StringRef OSLibName =
2249 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002250 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002251 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002252}
2253
Peter Collingbourne581f4382015-07-02 01:48:12 +00002254SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2255 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002256 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2257 ? "-android"
2258 : "";
2259
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002260 bool IsOSWindows = TC.getTriple().isOSWindows();
2261 StringRef Arch = getArchNameForCompilerRTLib(TC);
2262 const char *Prefix = IsOSWindows ? "" : "lib";
2263 const char *Suffix =
2264 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2265
2266 SmallString<128> Path = getCompilerRTLibDir(TC);
2267 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2268 Arch + Env + Suffix);
2269
2270 return Path;
2271}
2272
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002273// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002274// FIXME: Make sure we can also emit shared objects if they're requested
2275// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002276static void addClangRT(const ToolChain &TC, const ArgList &Args,
2277 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002278 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002279
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002280 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002281 // FIXME: why do we link against gcc when we are using compiler-rt?
2282 CmdArgs.push_back("-lgcc_s");
2283 if (TC.getDriver().CCCIsCXX())
2284 CmdArgs.push_back("-lgcc_eh");
2285 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002286}
2287
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002288static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2289 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002290 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2291 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002292 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002293 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002294 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002295 Args.hasArg(options::OPT_fcreate_profile) ||
2296 Args.hasArg(options::OPT_coverage)))
2297 return;
2298
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002299 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002300}
2301
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002302namespace {
2303enum OpenMPRuntimeKind {
2304 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2305 /// without knowing what runtime to target.
2306 OMPRT_Unknown,
2307
2308 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2309 /// the default for Clang.
2310 OMPRT_OMP,
2311
2312 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2313 /// this runtime but can swallow the pragmas, and find and link against the
2314 /// runtime library itself.
2315 OMPRT_GOMP,
2316
Chandler Carruthc6625c62015-05-28 21:10:31 +00002317 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002318 /// OpenMP runtime. We support this mode for users with existing dependencies
2319 /// on this runtime library name.
2320 OMPRT_IOMP5
2321};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002322}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002323
2324/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002325static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2326 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002327 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2328
2329 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2330 if (A)
2331 RuntimeName = A->getValue();
2332
2333 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002334 .Case("libomp", OMPRT_OMP)
2335 .Case("libgomp", OMPRT_GOMP)
2336 .Case("libiomp5", OMPRT_IOMP5)
2337 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002338
2339 if (RT == OMPRT_Unknown) {
2340 if (A)
2341 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002342 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002343 else
2344 // FIXME: We could use a nicer diagnostic here.
2345 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2346 }
2347
2348 return RT;
2349}
2350
Alexey Samsonov52550342014-09-15 19:58:40 +00002351static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2352 ArgStringList &CmdArgs, StringRef Sanitizer,
2353 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002354 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002355 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002356 if (!IsShared)
2357 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002358 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002359 if (!IsShared)
2360 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002361}
2362
Alexey Samsonov52550342014-09-15 19:58:40 +00002363// Tries to use a file with the list of dynamic symbols that need to be exported
2364// from the runtime library. Returns true if the file was found.
2365static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2366 ArgStringList &CmdArgs,
2367 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002368 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2369 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2370 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002371 return true;
2372 }
2373 return false;
2374}
2375
2376static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2377 ArgStringList &CmdArgs) {
2378 // Force linking against the system libraries sanitizers depends on
2379 // (see PR15823 why this is necessary).
2380 CmdArgs.push_back("--no-as-needed");
2381 CmdArgs.push_back("-lpthread");
2382 CmdArgs.push_back("-lrt");
2383 CmdArgs.push_back("-lm");
2384 // There's no libdl on FreeBSD.
2385 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2386 CmdArgs.push_back("-ldl");
2387}
2388
2389static void
2390collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2391 SmallVectorImpl<StringRef> &SharedRuntimes,
2392 SmallVectorImpl<StringRef> &StaticRuntimes,
2393 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2394 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2395 // Collect shared runtimes.
2396 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2397 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002398 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002399
Alexey Samsonov52550342014-09-15 19:58:40 +00002400 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002401 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002402 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2403 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002404 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002405 }
2406 if (SanArgs.needsAsanRt()) {
2407 if (SanArgs.needsSharedAsanRt()) {
2408 HelperStaticRuntimes.push_back("asan-preinit");
2409 } else {
2410 StaticRuntimes.push_back("asan");
2411 if (SanArgs.linkCXXRuntimes())
2412 StaticRuntimes.push_back("asan_cxx");
2413 }
2414 }
2415 if (SanArgs.needsDfsanRt())
2416 StaticRuntimes.push_back("dfsan");
2417 if (SanArgs.needsLsanRt())
2418 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002419 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002420 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002421 if (SanArgs.linkCXXRuntimes())
2422 StaticRuntimes.push_back("msan_cxx");
2423 }
2424 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002425 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002426 if (SanArgs.linkCXXRuntimes())
2427 StaticRuntimes.push_back("tsan_cxx");
2428 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002429 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002430 StaticRuntimes.push_back("ubsan_standalone");
2431 if (SanArgs.linkCXXRuntimes())
2432 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002433 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002434 if (SanArgs.needsSafeStackRt())
2435 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002436}
2437
Alexey Samsonov52550342014-09-15 19:58:40 +00002438// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2439// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2440static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002441 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002442 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2443 HelperStaticRuntimes;
2444 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2445 HelperStaticRuntimes);
2446 for (auto RT : SharedRuntimes)
2447 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2448 for (auto RT : HelperStaticRuntimes)
2449 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2450 bool AddExportDynamic = false;
2451 for (auto RT : StaticRuntimes) {
2452 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2453 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2454 }
2455 // If there is a static runtime with no dynamic list, force all the symbols
2456 // to be dynamic to be sure we export sanitizer interface functions.
2457 if (AddExportDynamic)
2458 CmdArgs.push_back("-export-dynamic");
2459 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002460}
2461
Reid Kleckner86ea7702015-02-04 23:45:07 +00002462static bool areOptimizationsEnabled(const ArgList &Args) {
2463 // Find the last -O arg and see if it is non-zero.
2464 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2465 return !A->getOption().matches(options::OPT_O0);
2466 // Defaults to -O0.
2467 return false;
2468}
2469
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002470static bool shouldUseFramePointerForTarget(const ArgList &Args,
2471 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002472 // XCore never wants frame pointers, regardless of OS.
2473 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002474 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002475 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002476
2477 if (Triple.isOSLinux()) {
2478 switch (Triple.getArch()) {
2479 // Don't use a frame pointer on linux if optimizing for certain targets.
2480 case llvm::Triple::mips64:
2481 case llvm::Triple::mips64el:
2482 case llvm::Triple::mips:
2483 case llvm::Triple::mipsel:
2484 case llvm::Triple::systemz:
2485 case llvm::Triple::x86:
2486 case llvm::Triple::x86_64:
2487 return !areOptimizationsEnabled(Args);
2488 default:
2489 return true;
2490 }
2491 }
2492
2493 if (Triple.isOSWindows()) {
2494 switch (Triple.getArch()) {
2495 case llvm::Triple::x86:
2496 return !areOptimizationsEnabled(Args);
2497 default:
2498 // All other supported Windows ISAs use xdata unwind information, so frame
2499 // pointers are not generally useful.
2500 return false;
2501 }
2502 }
2503
2504 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002505}
2506
Rafael Espindola224dd632011-12-14 21:02:23 +00002507static bool shouldUseFramePointer(const ArgList &Args,
2508 const llvm::Triple &Triple) {
2509 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2510 options::OPT_fomit_frame_pointer))
2511 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2512
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002513 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002514}
2515
Eric Christopherb7d97e92013-04-03 01:58:53 +00002516static bool shouldUseLeafFramePointer(const ArgList &Args,
2517 const llvm::Triple &Triple) {
2518 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2519 options::OPT_momit_leaf_frame_pointer))
2520 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2521
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002522 if (Triple.isPS4CPU())
2523 return false;
2524
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002525 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002526}
2527
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002528/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002529static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002530 SmallString<128> cwd;
2531 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002532 CmdArgs.push_back("-fdebug-compilation-dir");
2533 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002534 }
2535}
2536
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002537static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002538 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2539 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2540 SmallString<128> T(FinalOutput->getValue());
2541 llvm::sys::path::replace_extension(T, "dwo");
2542 return Args.MakeArgString(T);
2543 } else {
2544 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002545 SmallString<128> T(
2546 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002547 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002548 llvm::sys::path::replace_extension(F, "dwo");
2549 T += F;
2550 return Args.MakeArgString(F);
2551 }
2552}
2553
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002554static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2555 const JobAction &JA, const ArgList &Args,
2556 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002557 ArgStringList ExtractArgs;
2558 ExtractArgs.push_back("--extract-dwo");
2559
2560 ArgStringList StripArgs;
2561 StripArgs.push_back("--strip-dwo");
2562
2563 // Grabbing the output of the earlier compile step.
2564 StripArgs.push_back(Output.getFilename());
2565 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002566 ExtractArgs.push_back(OutFile);
2567
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002568 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002569
2570 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002571 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002572
2573 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002574 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002575}
2576
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002577/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002578/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2579static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002580 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002581 if (A->getOption().matches(options::OPT_O4) ||
2582 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002583 return true;
2584
2585 if (A->getOption().matches(options::OPT_O0))
2586 return false;
2587
2588 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2589
Rafael Espindola91780de2013-08-26 14:05:41 +00002590 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002591 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002592 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002593 return true;
2594
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002595 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002596 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002597 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002598
2599 unsigned OptLevel = 0;
2600 if (S.getAsInteger(10, OptLevel))
2601 return false;
2602
2603 return OptLevel > 1;
2604 }
2605
2606 return false;
2607}
2608
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002609/// Add -x lang to \p CmdArgs for \p Input.
2610static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2611 ArgStringList &CmdArgs) {
2612 // When using -verify-pch, we don't want to provide the type
2613 // 'precompiled-header' if it was inferred from the file extension
2614 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2615 return;
2616
2617 CmdArgs.push_back("-x");
2618 if (Args.hasArg(options::OPT_rewrite_objc))
2619 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2620 else
2621 CmdArgs.push_back(types::getTypeName(Input.getType()));
2622}
2623
David Majnemerc371ff02015-03-22 08:39:22 +00002624static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002625 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002626 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002627
2628 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002629 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002630
2631 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002632 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002633 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002634 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002635}
2636
Rafael Espindola577637a2015-01-03 00:06:04 +00002637// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002638// options that build systems might add but are unused when assembling or only
2639// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002640static void claimNoWarnArgs(const ArgList &Args) {
2641 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002642 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002643 Args.ClaimAllArgs(options::OPT_flto);
2644 Args.ClaimAllArgs(options::OPT_fno_lto);
2645}
2646
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002647static void appendUserToPath(SmallVectorImpl<char> &Result) {
2648#ifdef LLVM_ON_UNIX
2649 const char *Username = getenv("LOGNAME");
2650#else
2651 const char *Username = getenv("USERNAME");
2652#endif
2653 if (Username) {
2654 // Validate that LoginName can be used in a path, and get its length.
2655 size_t Len = 0;
2656 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002657 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002658 Username = nullptr;
2659 break;
2660 }
2661 }
2662
2663 if (Username && Len > 0) {
2664 Result.append(Username, Username + Len);
2665 return;
2666 }
2667 }
2668
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002669// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002670#ifdef LLVM_ON_UNIX
2671 std::string UID = llvm::utostr(getuid());
2672#else
2673 // FIXME: Windows seems to have an 'SID' that might work.
2674 std::string UID = "9999";
2675#endif
2676 Result.append(UID.begin(), UID.end());
2677}
2678
David Majnemere11d3732015-06-08 00:22:46 +00002679VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2680 const llvm::Triple &Triple,
2681 const llvm::opt::ArgList &Args,
2682 bool IsWindowsMSVC) {
2683 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2684 IsWindowsMSVC) ||
2685 Args.hasArg(options::OPT_fmsc_version) ||
2686 Args.hasArg(options::OPT_fms_compatibility_version)) {
2687 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2688 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002689 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002690
2691 if (MSCVersion && MSCompatibilityVersion) {
2692 if (D)
2693 D->Diag(diag::err_drv_argument_not_allowed_with)
2694 << MSCVersion->getAsString(Args)
2695 << MSCompatibilityVersion->getAsString(Args);
2696 return VersionTuple();
2697 }
2698
2699 if (MSCompatibilityVersion) {
2700 VersionTuple MSVT;
2701 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2702 D->Diag(diag::err_drv_invalid_value)
2703 << MSCompatibilityVersion->getAsString(Args)
2704 << MSCompatibilityVersion->getValue();
2705 return MSVT;
2706 }
2707
2708 if (MSCVersion) {
2709 unsigned Version = 0;
2710 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2711 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2712 << MSCVersion->getValue();
2713 return getMSCompatibilityVersion(Version);
2714 }
2715
2716 unsigned Major, Minor, Micro;
2717 Triple.getEnvironmentVersion(Major, Minor, Micro);
2718 if (Major || Minor || Micro)
2719 return VersionTuple(Major, Minor, Micro);
2720
2721 return VersionTuple(18);
2722 }
2723 return VersionTuple();
2724}
2725
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002726void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002727 const InputInfo &Output, const InputInfoList &Inputs,
2728 const ArgList &Args, const char *LinkingOutput) const {
2729 bool KernelOrKext =
2730 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002731 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002732 ArgStringList CmdArgs;
2733
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002734 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002735 bool IsWindowsCygnus =
2736 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002737 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2738
Daniel Dunbare521a892009-03-31 20:53:55 +00002739 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
Artem Belevichba558952015-05-06 18:20:23 +00002740 const InputInfo &Input = Inputs[0];
Daniel Dunbare521a892009-03-31 20:53:55 +00002741
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002742 // Invoke ourselves in -cc1 mode.
2743 //
2744 // FIXME: Implement custom jobs for internal actions.
2745 CmdArgs.push_back("-cc1");
2746
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002747 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002748 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002749 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002750 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002751
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002752 const llvm::Triple TT(TripleStr);
2753 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2754 TT.getArch() == llvm::Triple::thumb)) {
2755 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2756 unsigned Version;
2757 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2758 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002759 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2760 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002761 }
2762
Tim Northover336f1892014-03-29 13:16:12 +00002763 // Push all default warning arguments that are specific to
2764 // the given target. These come before user provided warning options
2765 // are provided.
2766 getToolChain().addClangWarningOptions(CmdArgs);
2767
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002768 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002769 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002770
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002771 if (isa<AnalyzeJobAction>(JA)) {
2772 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2773 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002774 } else if (isa<MigrateJobAction>(JA)) {
2775 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002776 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002777 if (Output.getType() == types::TY_Dependencies)
2778 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002779 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002780 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002781 if (Args.hasArg(options::OPT_rewrite_objc) &&
2782 !Args.hasArg(options::OPT_g_Group))
2783 CmdArgs.push_back("-P");
2784 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002785 } else if (isa<AssembleJobAction>(JA)) {
2786 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002787
David Blaikie9260ed62013-07-25 21:19:01 +00002788 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002789
2790 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002791 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002792 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002793 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002794 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002795
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002796 if (JA.getType() == types::TY_Nothing)
2797 CmdArgs.push_back("-fsyntax-only");
2798 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002799 CmdArgs.push_back("-emit-pch");
2800 else
2801 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002802 } else if (isa<VerifyPCHJobAction>(JA)) {
2803 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002804 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002805 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2806 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002807
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002808 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002809 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002810 } else if (JA.getType() == types::TY_LLVM_IR ||
2811 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002812 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002813 } else if (JA.getType() == types::TY_LLVM_BC ||
2814 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002815 CmdArgs.push_back("-emit-llvm-bc");
2816 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002817 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002818 } else if (JA.getType() == types::TY_AST) {
2819 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002820 } else if (JA.getType() == types::TY_ModuleFile) {
2821 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002822 } else if (JA.getType() == types::TY_RewrittenObjC) {
2823 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002824 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002825 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2826 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002827 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002828 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002829 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002830 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002831
2832 // Preserve use-list order by default when emitting bitcode, so that
2833 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2834 // same result as running passes here. For LTO, we don't need to preserve
2835 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002836 if (JA.getType() == types::TY_LLVM_BC)
2837 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002838 }
2839
Justin Bognera88f0122014-06-20 22:59:50 +00002840 // We normally speed up the clang process a bit by skipping destructors at
2841 // exit, but when we're generating diagnostics we can rely on some of the
2842 // cleanup.
2843 if (!C.isForDiagnostics())
2844 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002845
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002846// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00002847#ifdef NDEBUG
2848 CmdArgs.push_back("-disable-llvm-verifier");
2849#endif
2850
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002851 // Set the main file name, so that debug info works even with
2852 // -save-temps.
2853 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002854 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002855
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002856 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002857 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002858 if (Args.hasArg(options::OPT_static))
2859 CmdArgs.push_back("-static-define");
2860
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002861 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002862 // Enable region store model by default.
2863 CmdArgs.push_back("-analyzer-store=region");
2864
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002865 // Treat blocks as analysis entry points.
2866 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2867
Ted Kremenek49c79792011-03-24 00:28:47 +00002868 CmdArgs.push_back("-analyzer-eagerly-assume");
2869
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002870 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002871 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002872 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002873
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002874 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002875 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002876
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002877 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002878 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002879
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002880 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002881
Artem Belevichba558952015-05-06 18:20:23 +00002882 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002883 CmdArgs.push_back("-analyzer-checker=cplusplus");
2884
Nico Webere8e53112014-05-11 01:04:02 +00002885 // Enable the following experimental checkers for testing.
2886 CmdArgs.push_back(
2887 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002888 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2889 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002890 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00002891 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2892 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002893 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002894
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002895 // Set the output format. The default is plist, for (lame) historical
2896 // reasons.
2897 CmdArgs.push_back("-analyzer-output");
2898 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002899 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002900 else
2901 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002902
Ted Kremenekfe449a22010-03-22 22:32:05 +00002903 // Disable the presentation of standard compiler warnings when
2904 // using --analyze. We only want to show static analyzer diagnostics
2905 // or frontend errors.
2906 CmdArgs.push_back("-w");
2907
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002908 // Add -Xanalyzer arguments when running as analyzer.
2909 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002910 }
2911
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002912 CheckCodeGenerationOptions(D, Args);
2913
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002914 bool PIE = getToolChain().isPIEDefault();
2915 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002916 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002917
Alexey Bataev40e75222014-01-28 06:30:35 +00002918 // Android-specific defaults for PIC/PIE
2919 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002920 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00002921 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002922 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002923 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002924 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002925 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002926 case llvm::Triple::mips:
2927 case llvm::Triple::mipsel:
2928 case llvm::Triple::mips64:
2929 case llvm::Triple::mips64el:
2930 PIC = true; // "-fpic"
2931 break;
2932
2933 case llvm::Triple::x86:
2934 case llvm::Triple::x86_64:
2935 PIC = true; // "-fPIC"
2936 IsPICLevelTwo = true;
2937 break;
2938
2939 default:
2940 break;
2941 }
2942 }
2943
Brad Smith5b05db82014-06-24 19:51:29 +00002944 // OpenBSD-specific defaults for PIE
2945 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002946 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00002947 case llvm::Triple::mips64:
2948 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002949 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002950 case llvm::Triple::x86:
2951 case llvm::Triple::x86_64:
2952 IsPICLevelTwo = false; // "-fpie"
2953 break;
2954
2955 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00002956 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00002957 case llvm::Triple::sparcv9:
2958 IsPICLevelTwo = true; // "-fPIE"
2959 break;
2960
2961 default:
2962 break;
2963 }
2964 }
2965
Alexey Samsonov090301e2013-04-09 12:28:19 +00002966 // For the PIC and PIE flag options, this logic is different from the
2967 // legacy logic in very old versions of GCC, as that logic was just
2968 // a bug no one had ever fixed. This logic is both more rational and
2969 // consistent with GCC's new logic now that the bugs are fixed. The last
2970 // argument relating to either PIC or PIE wins, and no other argument is
2971 // used. If the last argument is any flavor of the '-fno-...' arguments,
2972 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2973 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002974 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2975 options::OPT_fpic, options::OPT_fno_pic,
2976 options::OPT_fPIE, options::OPT_fno_PIE,
2977 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002978 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2979 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002980 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002981 if (LastPICArg) {
2982 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002983 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2984 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2985 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002986 PIC =
2987 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2988 IsPICLevelTwo =
2989 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002990 } else {
2991 PIE = PIC = false;
2992 }
2993 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002994 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002995
Nick Lewycky609dd662013-10-11 03:33:53 +00002996 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002997 // specified while enabling PIC enabled level 1 PIC, just force it back to
2998 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2999 // informal testing).
3000 if (PIC && getToolChain().getTriple().isOSDarwin())
3001 IsPICLevelTwo |= getToolChain().isPICDefault();
3002
Chandler Carruthc0c04552012-04-08 16:40:35 +00003003 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3004 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003005 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00003006 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003007 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003008 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003009 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003010
Chandler Carruth76a943b2012-11-19 03:52:03 +00003011 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3012 // This is a very special mode. It trumps the other modes, almost no one
3013 // uses it, and it isn't even valid on any OS but Darwin.
3014 if (!getToolChain().getTriple().isOSDarwin())
3015 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003016 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003017
3018 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3019
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003020 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003021 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003022
Chandler Carruth76a943b2012-11-19 03:52:03 +00003023 // Only a forced PIC mode can cause the actual compile to have PIC defines
3024 // etc., no flags are sufficient. This behavior was selected to closely
3025 // match that of llvm-gcc and Apple GCC before that.
3026 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3027 CmdArgs.push_back("-pic-level");
3028 CmdArgs.push_back("2");
3029 }
3030 } else {
3031 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3032 // handled in Clang's IRGen by the -pie-level flag.
3033 CmdArgs.push_back("-mrelocation-model");
3034 CmdArgs.push_back(PIC ? "pic" : "static");
3035
3036 if (PIC) {
3037 CmdArgs.push_back("-pic-level");
3038 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3039 if (PIE) {
3040 CmdArgs.push_back("-pie-level");
3041 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3042 }
3043 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003044 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003045
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003046 CmdArgs.push_back("-mthread-model");
3047 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3048 CmdArgs.push_back(A->getValue());
3049 else
3050 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3051
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003052 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3053
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003054 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3055 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003056 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003057
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003058 // LLVM Code Generator Options.
3059
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003060 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3061 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003062 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3063 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003064 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003065 CmdArgs.push_back(A->getValue());
3066 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003067 }
3068 }
3069
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003070 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3071 StringRef v = A->getValue();
3072 CmdArgs.push_back("-mllvm");
3073 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3074 A->claim();
3075 }
3076
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003077 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3078 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003079 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003080 }
3081
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003082 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3083 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003084 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003085 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003086 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003087 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3088 CmdArgs.push_back("-fpcc-struct-return");
3089 } else {
3090 assert(A->getOption().matches(options::OPT_freg_struct_return));
3091 CmdArgs.push_back("-freg-struct-return");
3092 }
3093 }
3094
Roman Divacky65b88cd2011-03-01 17:40:53 +00003095 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3096 CmdArgs.push_back("-mrtd");
3097
Rafael Espindola224dd632011-12-14 21:02:23 +00003098 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003099 CmdArgs.push_back("-mdisable-fp-elim");
3100 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3101 options::OPT_fno_zero_initialized_in_bss))
3102 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003103
3104 bool OFastEnabled = isOptimizationLevelFast(Args);
3105 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3106 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003107 OptSpecifier StrictAliasingAliasOption =
3108 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003109 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3110 // doesn't do any TBAA.
3111 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003112 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003113 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003114 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003115 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3116 options::OPT_fno_struct_path_tbaa))
3117 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003118 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3119 false))
3120 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003121 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3122 options::OPT_fno_optimize_sibling_calls))
3123 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003124
Eric Christopher006208c2013-04-04 06:29:47 +00003125 // Handle segmented stacks.
3126 if (Args.hasArg(options::OPT_fsplit_stack))
3127 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003128
3129 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3130 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003131 OptSpecifier FastMathAliasOption =
3132 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3133
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003134 // Handle various floating point optimization flags, mapping them to the
3135 // appropriate LLVM code generation flags. The pattern for all of these is to
3136 // default off the codegen optimizations, and if any flag enables them and no
3137 // flag disables them after the flag enabling them, enable the codegen
3138 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003139 if (Arg *A = Args.getLastArg(
3140 options::OPT_ffast_math, FastMathAliasOption,
3141 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3142 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3143 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003144 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3145 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003146 A->getOption().getID() != options::OPT_fhonor_infinities)
3147 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003148 if (Arg *A = Args.getLastArg(
3149 options::OPT_ffast_math, FastMathAliasOption,
3150 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3151 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3152 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003153 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3154 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003155 A->getOption().getID() != options::OPT_fhonor_nans)
3156 CmdArgs.push_back("-menable-no-nans");
3157
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003158 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3159 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003160 if (Arg *A =
3161 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3162 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3163 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003164 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3165 // However, turning *off* -ffast_math merely restores the toolchain default
3166 // (which may be false).
3167 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3168 A->getOption().getID() == options::OPT_ffast_math ||
3169 A->getOption().getID() == options::OPT_Ofast)
3170 MathErrno = false;
3171 else if (A->getOption().getID() == options::OPT_fmath_errno)
3172 MathErrno = true;
3173 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003174 if (MathErrno)
3175 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003176
3177 // There are several flags which require disabling very specific
3178 // optimizations. Any of these being disabled forces us to turn off the
3179 // entire set of LLVM optimizations, so collect them through all the flag
3180 // madness.
3181 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003182 if (Arg *A = Args.getLastArg(
3183 options::OPT_ffast_math, FastMathAliasOption,
3184 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3185 options::OPT_fno_unsafe_math_optimizations,
3186 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003187 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3188 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003189 A->getOption().getID() != options::OPT_fno_associative_math)
3190 AssociativeMath = true;
3191 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003192 if (Arg *A = Args.getLastArg(
3193 options::OPT_ffast_math, FastMathAliasOption,
3194 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3195 options::OPT_fno_unsafe_math_optimizations,
3196 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003197 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3198 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003199 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3200 ReciprocalMath = true;
3201 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003202 if (Arg *A = Args.getLastArg(
3203 options::OPT_ffast_math, FastMathAliasOption,
3204 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3205 options::OPT_fno_unsafe_math_optimizations,
3206 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003207 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3208 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003209 A->getOption().getID() != options::OPT_fsigned_zeros)
3210 SignedZeros = false;
3211 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003212 if (Arg *A = Args.getLastArg(
3213 options::OPT_ffast_math, FastMathAliasOption,
3214 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3215 options::OPT_fno_unsafe_math_optimizations,
3216 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003217 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3218 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003219 A->getOption().getID() != options::OPT_ftrapping_math)
3220 TrappingMath = false;
3221 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3222 !TrappingMath)
3223 CmdArgs.push_back("-menable-unsafe-fp-math");
3224
Sanjay Patel76c9e092015-01-23 16:40:50 +00003225 if (!SignedZeros)
3226 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003227
Sanjay Patel359b1052015-04-09 15:03:23 +00003228 if (ReciprocalMath)
3229 CmdArgs.push_back("-freciprocal-math");
3230
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003231 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003232 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003233 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003234 options::OPT_ffp_contract)) {
3235 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003236 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003237 if (Val == "fast" || Val == "on" || Val == "off") {
3238 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3239 } else {
3240 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003241 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003242 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003243 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3244 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003245 // If fast-math is set then set the fp-contract mode to fast.
3246 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3247 }
3248 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003249
Sanjay Patel2987c292015-06-11 14:53:41 +00003250 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003251
Bob Wilson6a039162012-07-19 03:52:53 +00003252 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3253 // and if we find them, tell the frontend to provide the appropriate
3254 // preprocessor macros. This is distinct from enabling any optimizations as
3255 // these options induce language changes which must survive serialization
3256 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003257 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3258 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003259 if (!A->getOption().matches(options::OPT_fno_fast_math))
3260 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003261 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3262 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003263 if (A->getOption().matches(options::OPT_ffinite_math_only))
3264 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003265
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003266 // Decide whether to use verbose asm. Verbose assembly is the default on
3267 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003268 bool IsIntegratedAssemblerDefault =
3269 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003270 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003271 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003272 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003273 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003274
Rafael Espindolab8a12932015-05-22 20:44:03 +00003275 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3276 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003277 CmdArgs.push_back("-no-integrated-as");
3278
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003279 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3280 CmdArgs.push_back("-mdebug-pass");
3281 CmdArgs.push_back("Structure");
3282 }
3283 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3284 CmdArgs.push_back("-mdebug-pass");
3285 CmdArgs.push_back("Arguments");
3286 }
3287
John McCall8517abc2010-02-19 02:45:38 +00003288 // Enable -mconstructor-aliases except on darwin, where we have to
3289 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003290 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003291 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003292
John McCall7ef5cb32011-03-18 02:56:14 +00003293 // Darwin's kernel doesn't support guard variables; just die if we
3294 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003295 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003296 CmdArgs.push_back("-fforbid-guard-variables");
3297
Douglas Gregordbe39272011-02-01 15:15:22 +00003298 if (Args.hasArg(options::OPT_mms_bitfields)) {
3299 CmdArgs.push_back("-mms-bitfields");
3300 }
John McCall8517abc2010-02-19 02:45:38 +00003301
Daniel Dunbar306945d2009-09-16 06:17:29 +00003302 // This is a coarse approximation of what llvm-gcc actually does, both
3303 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3304 // complicated ways.
3305 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003306 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3307 options::OPT_fno_asynchronous_unwind_tables,
3308 (getToolChain().IsUnwindTablesDefault() ||
3309 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3310 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003311 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3312 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003313 CmdArgs.push_back("-munwind-tables");
3314
Chandler Carruth05fb5852012-11-21 23:40:23 +00003315 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003316
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003317 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3318 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003319 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003320 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003321
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003322 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003323 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003324
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003325 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003326 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003327 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003328 }
3329
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003330 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003331 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003332 if (!CPU.empty()) {
3333 CmdArgs.push_back("-target-cpu");
3334 CmdArgs.push_back(Args.MakeArgString(CPU));
3335 }
3336
Rafael Espindolaeb265472013-08-21 21:59:03 +00003337 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3338 CmdArgs.push_back("-mfpmath");
3339 CmdArgs.push_back(A->getValue());
3340 }
3341
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003342 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003343 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003344
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003345 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003346 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003347 default:
3348 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003349
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003350 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003351 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003352 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003353 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003354 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003355 break;
3356
Tim Northover573cbee2014-05-24 12:52:07 +00003357 case llvm::Triple::aarch64:
3358 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003359 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003360 break;
3361
Eric Christopher0b26a612010-03-02 02:41:08 +00003362 case llvm::Triple::mips:
3363 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003364 case llvm::Triple::mips64:
3365 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003366 AddMIPSTargetArgs(Args, CmdArgs);
3367 break;
3368
Ulrich Weigand8afad612014-07-28 13:17:52 +00003369 case llvm::Triple::ppc:
3370 case llvm::Triple::ppc64:
3371 case llvm::Triple::ppc64le:
3372 AddPPCTargetArgs(Args, CmdArgs);
3373 break;
3374
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003375 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003376 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003377 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003378 AddSparcTargetArgs(Args, CmdArgs);
3379 break;
3380
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003381 case llvm::Triple::x86:
3382 case llvm::Triple::x86_64:
3383 AddX86TargetArgs(Args, CmdArgs);
3384 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003385
3386 case llvm::Triple::hexagon:
3387 AddHexagonTargetArgs(Args, CmdArgs);
3388 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003389 }
3390
Hans Wennborg75958c42013-08-08 00:17:41 +00003391 // Add clang-cl arguments.
3392 if (getToolChain().getDriver().IsCLMode())
3393 AddClangCLArgs(Args, CmdArgs);
3394
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003395 // Pass the linker version in use.
3396 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3397 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003398 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003399 }
3400
Eric Christopherb7d97e92013-04-03 01:58:53 +00003401 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003402 CmdArgs.push_back("-momit-leaf-frame-pointer");
3403
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003404 // Explicitly error on some things we know we don't support and can't just
3405 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003406 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003407 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3408 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003409 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003410 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003411 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3412 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003413 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003414 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003415 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003416 }
3417
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003418 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003419 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003420 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003421 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003422 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3423 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003424 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003425 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003426 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003427
Chad Rosierbe10f982011-08-02 17:58:04 +00003428 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003429 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003430 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3431 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003432 }
3433
Manman Ren17bdb0f2013-11-20 20:22:14 +00003434 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3435 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003436 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003437 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003438 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3439 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003440 // FIXME: we should support specifying dwarf version with
3441 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003442 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003443 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003444 const llvm::Triple &Triple = getToolChain().getTriple();
3445 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003446 Triple.getOS() == llvm::Triple::FreeBSD ||
3447 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003448 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003449 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003450 CmdArgs.push_back("-gdwarf-2");
3451 else if (A->getOption().matches(options::OPT_gdwarf_3))
3452 CmdArgs.push_back("-gdwarf-3");
3453 else if (A->getOption().matches(options::OPT_gdwarf_4))
3454 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003455 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003456 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003457 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003458 const llvm::Triple &Triple = getToolChain().getTriple();
3459 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003460 Triple.getOS() == llvm::Triple::FreeBSD ||
3461 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003462 CmdArgs.push_back("-gdwarf-2");
3463 else
3464 CmdArgs.push_back("-g");
3465 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003466 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003467
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003468 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3469 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003470 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3471 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003472 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003473
Eric Christopher138c32b2013-09-13 22:37:55 +00003474 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003475 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3476 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003477 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003478 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003479 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003480 CmdArgs.push_back("-g");
3481 CmdArgs.push_back("-backend-option");
3482 CmdArgs.push_back("-split-dwarf=Enable");
3483 }
3484
Eric Christopher138c32b2013-09-13 22:37:55 +00003485 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3486 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3487 CmdArgs.push_back("-backend-option");
3488 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3489 }
Eric Christophereec89c22013-06-18 00:03:50 +00003490
Eric Christopher0d403d22014-02-14 01:27:03 +00003491 // -gdwarf-aranges turns on the emission of the aranges section in the
3492 // backend.
3493 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3494 CmdArgs.push_back("-backend-option");
3495 CmdArgs.push_back("-generate-arange-section");
3496 }
3497
David Blaikief36d9ba2014-01-27 18:52:43 +00003498 if (Args.hasFlag(options::OPT_fdebug_types_section,
3499 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003500 CmdArgs.push_back("-backend-option");
3501 CmdArgs.push_back("-generate-type-units");
3502 }
Eric Christophereec89c22013-06-18 00:03:50 +00003503
Ed Schouten6e576152015-03-26 17:50:28 +00003504 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3505 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3506
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003507 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003508 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003509 CmdArgs.push_back("-ffunction-sections");
3510 }
3511
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003512 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3513 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003514 CmdArgs.push_back("-fdata-sections");
3515 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003516
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003517 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003518 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003519 CmdArgs.push_back("-fno-unique-section-names");
3520
Chris Lattner3c77a352010-06-22 00:03:40 +00003521 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3522
Justin Bognera71e6812015-04-30 23:49:42 +00003523 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3524 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003525 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3526 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3527 D.Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003528 << "-fprofile-instr-generate"
3529 << "-fprofile-instr-use";
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003530
Justin Bognera71e6812015-04-30 23:49:42 +00003531 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3532 A->render(Args, CmdArgs);
3533 else
3534 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003535
3536 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3537 A->render(Args, CmdArgs);
3538 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3539 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3540
Nick Lewycky207bce32011-04-21 23:44:07 +00003541 if (Args.hasArg(options::OPT_ftest_coverage) ||
3542 Args.hasArg(options::OPT_coverage))
3543 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003544 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3545 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003546 Args.hasArg(options::OPT_coverage))
3547 CmdArgs.push_back("-femit-coverage-data");
3548
Alex Lorenzee024992014-08-04 18:41:51 +00003549 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003550 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3551 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003552 D.Diag(diag::err_drv_argument_only_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003553 << "-fcoverage-mapping"
3554 << "-fprofile-instr-generate";
Alex Lorenzee024992014-08-04 18:41:51 +00003555
3556 if (Args.hasArg(options::OPT_fcoverage_mapping))
3557 CmdArgs.push_back("-fcoverage-mapping");
3558
Nick Lewycky480cb992011-05-04 20:46:58 +00003559 if (C.getArgs().hasArg(options::OPT_c) ||
3560 C.getArgs().hasArg(options::OPT_S)) {
3561 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003562 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003563 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003564 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003565 CoverageFilename = FinalOutput->getValue();
3566 } else {
3567 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3568 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003569 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003570 SmallString<128> Pwd;
3571 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003572 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003573 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003574 }
3575 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003576 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003577 }
3578 }
3579
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003580 // Pass options for controlling the default header search paths.
3581 if (Args.hasArg(options::OPT_nostdinc)) {
3582 CmdArgs.push_back("-nostdsysteminc");
3583 CmdArgs.push_back("-nobuiltininc");
3584 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003585 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003586 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003587 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3588 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3589 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003590
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003591 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003592 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003593 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003594
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003595 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3596
Ted Kremenekf7639e12012-03-06 20:06:33 +00003597 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003598 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003599 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003600 options::OPT_ccc_arcmt_modify,
3601 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003602 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003603 switch (A->getOption().getID()) {
3604 default:
3605 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003606 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003607 CmdArgs.push_back("-arcmt-check");
3608 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003609 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003610 CmdArgs.push_back("-arcmt-modify");
3611 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003612 case options::OPT_ccc_arcmt_migrate:
3613 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003614 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003615 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003616
3617 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3618 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003619 break;
John McCalld70fb982011-06-15 23:25:17 +00003620 }
3621 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003622 } else {
3623 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3624 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3625 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003626 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003627
Ted Kremenekf7639e12012-03-06 20:06:33 +00003628 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3629 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003630 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3631 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003632 }
3633 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003634 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003635
3636 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003637 options::OPT_objcmt_migrate_subscripting,
3638 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003639 // None specified, means enable them all.
3640 CmdArgs.push_back("-objcmt-migrate-literals");
3641 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003642 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003643 } else {
3644 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3645 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003646 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003647 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003648 } else {
3649 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3650 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3651 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3652 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3653 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3654 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003655 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003656 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3657 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3658 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3659 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3660 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3661 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3662 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003663 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003664 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003665 }
3666
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003667 // Add preprocessing options like -I, -D, etc. if we are using the
3668 // preprocessor.
3669 //
3670 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003671 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003672 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003673
Rafael Espindolaa7431922011-07-21 23:40:37 +00003674 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3675 // that "The compiler can only warn and ignore the option if not recognized".
3676 // When building with ccache, it will pass -D options to clang even on
3677 // preprocessed inputs and configure concludes that -fPIC is not supported.
3678 Args.ClaimAllArgs(options::OPT_D);
3679
Alp Toker7874bdc2013-11-15 20:40:58 +00003680 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003681 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3682 if (A->getOption().matches(options::OPT_O4)) {
3683 CmdArgs.push_back("-O3");
3684 D.Diag(diag::warn_O4_is_O3);
3685 } else {
3686 A->render(Args, CmdArgs);
3687 }
3688 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003689
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003690 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003691 for (const Arg *A :
3692 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3693 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003694 }
3695
Rafael Espindola577637a2015-01-03 00:06:04 +00003696 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003697
Richard Smith3be1cb22014-08-07 00:24:21 +00003698 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003699 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003700 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3701 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003702 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003703 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003704
3705 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003706 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003707 //
3708 // If a std is supplied, only add -trigraphs if it follows the
3709 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003710 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003711 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3712 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003713 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003714 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003715 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003716 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003717 else
3718 Std->render(Args, CmdArgs);
3719
Nico Weber00721502014-12-23 22:32:37 +00003720 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003721 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003722 options::OPT_ftrigraphs,
3723 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003724 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003725 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003726 } else {
3727 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003728 //
3729 // FIXME: Clang doesn't correctly handle -std= when the input language
3730 // doesn't match. For the time being just ignore this for C++ inputs;
3731 // eventually we want to do all the standard defaulting here instead of
3732 // splitting it between the driver and clang -cc1.
3733 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003734 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3735 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003736 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003737 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003738
Nico Weber00721502014-12-23 22:32:37 +00003739 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3740 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003741 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003742
Richard Smith282b4492013-09-04 22:50:31 +00003743 // GCC's behavior for -Wwrite-strings is a bit strange:
3744 // * In C, this "warning flag" changes the types of string literals from
3745 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3746 // for the discarded qualifier.
3747 // * In C++, this is just a normal warning flag.
3748 //
3749 // Implementing this warning correctly in C is hard, so we follow GCC's
3750 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3751 // a non-const char* in C, rather than using this crude hack.
3752 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003753 // FIXME: This should behave just like a warning flag, and thus should also
3754 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3755 Arg *WriteStrings =
3756 Args.getLastArg(options::OPT_Wwrite_strings,
3757 options::OPT_Wno_write_strings, options::OPT_w);
3758 if (WriteStrings &&
3759 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003760 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003761 }
3762
Chandler Carruth61fbf622011-04-23 09:27:53 +00003763 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003764 // during C++ compilation, which it is by default. GCC keeps this define even
3765 // in the presence of '-w', match this behavior bug-for-bug.
3766 if (types::isCXX(InputType) &&
3767 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3768 true)) {
3769 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003770 }
3771
Chandler Carruthe0391482010-05-22 02:21:53 +00003772 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3773 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3774 if (Asm->getOption().matches(options::OPT_fasm))
3775 CmdArgs.push_back("-fgnu-keywords");
3776 else
3777 CmdArgs.push_back("-fno-gnu-keywords");
3778 }
3779
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003780 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3781 CmdArgs.push_back("-fno-dwarf-directory-asm");
3782
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003783 if (ShouldDisableAutolink(Args, getToolChain()))
3784 CmdArgs.push_back("-fno-autolink");
3785
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003786 // Add in -fdebug-compilation-dir if necessary.
3787 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003788
Richard Smith9a568822011-11-21 19:36:32 +00003789 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3790 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003791 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003792 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003793 }
3794
Richard Smith79c927b2013-11-06 19:31:51 +00003795 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3796 CmdArgs.push_back("-foperator-arrow-depth");
3797 CmdArgs.push_back(A->getValue());
3798 }
3799
Richard Smith9a568822011-11-21 19:36:32 +00003800 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3801 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003802 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003803 }
3804
Richard Smitha3d3bd22013-05-08 02:12:03 +00003805 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3806 CmdArgs.push_back("-fconstexpr-steps");
3807 CmdArgs.push_back(A->getValue());
3808 }
3809
Richard Smithb3a14522013-02-22 01:59:51 +00003810 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3811 CmdArgs.push_back("-fbracket-depth");
3812 CmdArgs.push_back(A->getValue());
3813 }
3814
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003815 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3816 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003817 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003818 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003819 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3820 } else
3821 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003822 }
3823
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003824 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003825 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003826
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003827 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3828 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003829 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003830 }
David Chisnall5778fce2009-08-31 16:41:57 +00003831
Chris Lattnere23003d2010-01-09 21:54:33 +00003832 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3833 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003834 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003835 }
3836
Chris Lattnerb35583d2010-04-07 20:49:23 +00003837 CmdArgs.push_back("-ferror-limit");
3838 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003839 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003840 else
3841 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003842
Chandler Carrutha77a7272010-05-06 04:55:18 +00003843 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3844 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003845 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003846 }
3847
3848 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3849 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003850 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003851 }
3852
Richard Smithf6f003a2011-12-16 19:06:07 +00003853 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3854 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003855 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003856 }
3857
Nick Lewycky24653262014-12-16 21:39:02 +00003858 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3859 CmdArgs.push_back("-fspell-checking-limit");
3860 CmdArgs.push_back(A->getValue());
3861 }
3862
Daniel Dunbar2c978472009-11-04 06:24:47 +00003863 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003864 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003865 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003866 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003867 } else {
3868 // If -fmessage-length=N was not specified, determine whether this is a
3869 // terminal and, if so, implicitly define -fmessage-length appropriately.
3870 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003871 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003872 }
3873
John McCallb4a99d32013-02-19 01:57:35 +00003874 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3875 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3876 options::OPT_fvisibility_ms_compat)) {
3877 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3878 CmdArgs.push_back("-fvisibility");
3879 CmdArgs.push_back(A->getValue());
3880 } else {
3881 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3882 CmdArgs.push_back("-fvisibility");
3883 CmdArgs.push_back("hidden");
3884 CmdArgs.push_back("-ftype-visibility");
3885 CmdArgs.push_back("default");
3886 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003887 }
3888
Douglas Gregor08329632010-06-15 17:05:35 +00003889 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003890
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003891 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3892
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003893 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003894 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3895 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003896 CmdArgs.push_back("-ffreestanding");
3897
Daniel Dunbare357d562009-12-03 18:42:11 +00003898 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003899 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003900 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003901 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3902 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003903 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003904 // AltiVec language extensions aren't relevant for assembling.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003905 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm)
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003906 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003907 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3908 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003909
Alexey Bataevdb390212015-05-20 04:24:19 +00003910 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003911 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3912 options::OPT_fno_openmp, false))
3913 switch (getOpenMPRuntime(getToolChain(), Args)) {
3914 case OMPRT_OMP:
3915 case OMPRT_IOMP5:
3916 // Clang can generate useful OpenMP code for these two runtime libraries.
3917 CmdArgs.push_back("-fopenmp");
3918 break;
3919 default:
3920 // By default, if Clang doesn't know how to generate useful OpenMP code
3921 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3922 // down to the actual compilation.
3923 // FIXME: It would be better to have a mode which *only* omits IR
3924 // generation based on the OpenMP support so that we get consistent
3925 // semantic analysis, etc.
3926 break;
3927 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003928
Peter Collingbourne32701642013-11-01 18:16:25 +00003929 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00003930 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00003931
Eric Christopher459d2712013-02-19 06:16:53 +00003932 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003933 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
3934 const llvm::Triple::ArchType Arch = getToolChain().getArch();
3935 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
3936 Arch == llvm::Triple::ppc64le))
3937 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3938 << "ppc/ppc64/ppc64le";
3939 }
Chad Rosier864dfe12012-03-13 23:45:51 +00003940
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003941 if (getToolChain().SupportsProfiling())
3942 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003943
3944 // -flax-vector-conversions is default.
3945 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3946 options::OPT_fno_lax_vector_conversions))
3947 CmdArgs.push_back("-fno-lax-vector-conversions");
3948
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003949 if (Args.getLastArg(options::OPT_fapple_kext))
3950 CmdArgs.push_back("-fapple-kext");
3951
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003952 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003953 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003954 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003955 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3956 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003957
3958 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3959 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003960 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003961 }
3962
Bob Wilson14adb362012-02-03 06:27:22 +00003963 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003964
Chandler Carruth6e501032011-03-27 00:04:55 +00003965 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3966 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003967 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00003968 if (A->getOption().matches(options::OPT_fwrapv))
3969 CmdArgs.push_back("-fwrapv");
3970 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3971 options::OPT_fno_strict_overflow)) {
3972 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3973 CmdArgs.push_back("-fwrapv");
3974 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003975
3976 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3977 options::OPT_fno_reroll_loops))
3978 if (A->getOption().matches(options::OPT_freroll_loops))
3979 CmdArgs.push_back("-freroll-loops");
3980
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003981 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003982 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3983 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003984
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003985 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3986
Daniel Dunbar4930e332009-11-17 08:07:36 +00003987 // -stack-protector=0 is default.
3988 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00003989 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
3990 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
3991 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
3992 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
3993 Args.ClaimAllArgs(options::OPT_fstack_protector);
3994 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003995 options::OPT_fstack_protector_all,
3996 options::OPT_fstack_protector_strong,
3997 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003998 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003999 StackProtectorLevel = std::max<unsigned>(
4000 LangOptions::SSPOn,
4001 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004002 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004003 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004004 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004005 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004006 } else {
4007 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004008 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004009 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004010 if (StackProtectorLevel) {
4011 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004012 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004013 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004014
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004015 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004016 for (const Arg *A : Args.filtered(options::OPT__param)) {
4017 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004018 if (Str.startswith("ssp-buffer-size=")) {
4019 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004020 CmdArgs.push_back("-stack-protector-buffer-size");
4021 // FIXME: Verify the argument is a valid integer.
4022 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004023 }
Sean Silva14facf32015-06-09 01:57:17 +00004024 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004025 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004026 }
4027
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004028 // Translate -mstackrealign
4029 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4030 false)) {
4031 CmdArgs.push_back("-backend-option");
4032 CmdArgs.push_back("-force-align-stack");
4033 }
4034 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004035 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004036 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4037 }
4038
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004039 if (Args.hasArg(options::OPT_mstack_alignment)) {
4040 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4041 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004042 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004043
Hans Wennborg77dc2362015-01-20 19:45:50 +00004044 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4045 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4046
4047 if (!Size.empty())
4048 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4049 else
4050 CmdArgs.push_back("-mstack-probe-size=0");
4051 }
4052
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004053 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4054 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004055 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4056
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004057 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4058 options::OPT_mno_restrict_it)) {
4059 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4060 CmdArgs.push_back("-backend-option");
4061 CmdArgs.push_back("-arm-restrict-it");
4062 } else {
4063 CmdArgs.push_back("-backend-option");
4064 CmdArgs.push_back("-arm-no-restrict-it");
4065 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004066 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4067 TT.getArch() == llvm::Triple::thumb)) {
4068 // Windows on ARM expects restricted IT blocks
4069 CmdArgs.push_back("-backend-option");
4070 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004071 }
4072
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004073 if (TT.getArch() == llvm::Triple::arm ||
4074 TT.getArch() == llvm::Triple::thumb) {
4075 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
4076 options::OPT_mno_long_calls)) {
4077 if (A->getOption().matches(options::OPT_mlong_calls)) {
4078 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00004079 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004080 }
4081 }
4082 }
4083
Daniel Dunbard18049a2009-04-07 21:16:11 +00004084 // Forward -f options with positive and negative forms; we translate
4085 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004086 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4087 StringRef fname = A->getValue();
4088 if (!llvm::sys::fs::exists(fname))
4089 D.Diag(diag::err_drv_no_such_file) << fname;
4090 else
4091 A->render(Args, CmdArgs);
4092 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004093
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004094 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004095 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004096 CmdArgs.push_back("-fapple-kext");
4097 if (!Args.hasArg(options::OPT_fbuiltin))
4098 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004099 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004100 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004101 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004102 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004103 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004104
Nuno Lopes13c88c72009-12-16 16:59:22 +00004105 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4106 options::OPT_fno_assume_sane_operator_new))
4107 CmdArgs.push_back("-fno-assume-sane-operator-new");
4108
Daniel Dunbar4930e332009-11-17 08:07:36 +00004109 // -fblocks=0 is default.
4110 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004111 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004112 (Args.hasArg(options::OPT_fgnu_runtime) &&
4113 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4114 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004115 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004116
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004117 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004118 !getToolChain().hasBlocksRuntime())
4119 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004120 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004121
Richard Smith47972af2015-06-16 00:08:24 +00004122 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004123 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004124 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004125 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004126 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004127 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4128 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004129 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004130 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004131 HaveModules = true;
4132 }
4133 }
4134
Richard Smith47972af2015-06-16 00:08:24 +00004135 // -fmodule-maps enables implicit reading of module map files. By default,
4136 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004137 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4138 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004139 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004140 }
4141
Daniel Jasperac42b752013-10-21 06:34:34 +00004142 // -fmodules-decluse checks that modules used are declared so (off by
4143 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004144 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004145 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004146 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004147 }
4148
Daniel Jasper962b38e2014-04-11 11:47:45 +00004149 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4150 // all #included headers are part of modules.
4151 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004152 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004153 CmdArgs.push_back("-fmodules-strict-decluse");
4154 }
4155
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004156 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4157 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4158 options::OPT_fno_implicit_modules)) {
4159 CmdArgs.push_back("-fno-implicit-modules");
4160 }
4161
Daniel Jasperac42b752013-10-21 06:34:34 +00004162 // -fmodule-name specifies the module that is currently being built (or
4163 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004164 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004165
Richard Smith9887d792014-10-17 01:42:53 +00004166 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004167 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004168 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004169
Richard Smithe842a472014-10-22 02:05:46 +00004170 // -fmodule-file can be used to specify files containing precompiled modules.
4171 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4172
4173 // -fmodule-cache-path specifies where our implicitly-built module files
4174 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004175 SmallString<128> ModuleCachePath;
4176 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4177 ModuleCachePath = A->getValue();
4178 if (HaveModules) {
4179 if (C.isForDiagnostics()) {
4180 // When generating crash reports, we want to emit the modules along with
4181 // the reproduction sources, so we ignore any provided module path.
4182 ModuleCachePath = Output.getFilename();
4183 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4184 llvm::sys::path::append(ModuleCachePath, "modules");
4185 } else if (ModuleCachePath.empty()) {
4186 // No module path was provided: use the default.
4187 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4188 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004189 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4190 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004191 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4192 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004193 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004194 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4195 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4196 }
4197
4198 // When building modules and generating crashdumps, we need to dump a module
4199 // dependency VFS alongside the output.
4200 if (HaveModules && C.isForDiagnostics()) {
4201 SmallString<128> VFSDir(Output.getFilename());
4202 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004203 // Add the cache directory as a temp so the crash diagnostics pick it up.
4204 C.addTempFile(Args.MakeArgString(VFSDir));
4205
Justin Bognera88f0122014-06-20 22:59:50 +00004206 llvm::sys::path::append(VFSDir, "vfs");
4207 CmdArgs.push_back("-module-dependency-dir");
4208 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004209 }
4210
Richard Smith9887d792014-10-17 01:42:53 +00004211 if (HaveModules)
4212 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004213
Douglas Gregor35b04d62013-02-07 19:01:24 +00004214 // Pass through all -fmodules-ignore-macro arguments.
4215 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004216 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4217 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004218
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004219 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4220
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004221 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4222 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4223 D.Diag(diag::err_drv_argument_not_allowed_with)
4224 << A->getAsString(Args) << "-fbuild-session-timestamp";
4225
4226 llvm::sys::fs::file_status Status;
4227 if (llvm::sys::fs::status(A->getValue(), Status))
4228 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004229 CmdArgs.push_back(Args.MakeArgString(
4230 "-fbuild-session-timestamp=" +
4231 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004232 }
4233
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004234 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004235 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4236 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004237 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4238
4239 Args.AddLastArg(CmdArgs,
4240 options::OPT_fmodules_validate_once_per_build_session);
4241 }
4242
Ben Langmuirdcf73862014-03-12 00:06:17 +00004243 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4244
John McCalldfea9982010-04-09 19:12:06 +00004245 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004246 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004247 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004248 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004249
Anders Carlssond470fef2010-11-21 00:09:52 +00004250 // -felide-constructors is the default.
4251 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004252 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004253 CmdArgs.push_back("-fno-elide-constructors");
4254
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004255 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004256
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004257 if (KernelOrKext || (types::isCXX(InputType) &&
4258 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4259 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004260 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004261
Tony Linthicum76329bf2011-12-12 21:14:55 +00004262 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004263 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4264 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004265 CmdArgs.push_back("-fshort-enums");
4266
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004267 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004268 if (Arg *A = Args.getLastArg(
4269 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4270 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4271 if (A->getOption().matches(options::OPT_funsigned_char) ||
4272 A->getOption().matches(options::OPT_fno_signed_char)) {
4273 CmdArgs.push_back("-fno-signed-char");
4274 }
4275 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004276 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004277 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004278
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004279 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004280 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4281 options::OPT_fno_use_cxa_atexit,
4282 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004283 getToolChain().getArch() != llvm::Triple::hexagon &&
4284 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004285 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004286 CmdArgs.push_back("-fno-use-cxa-atexit");
4287
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004288 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004289 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004290 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004291 CmdArgs.push_back("-fms-extensions");
4292
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004293 // -fno-use-line-directives is default.
4294 if (Args.hasFlag(options::OPT_fuse_line_directives,
4295 options::OPT_fno_use_line_directives, false))
4296 CmdArgs.push_back("-fuse-line-directives");
4297
Francois Pichet1b4f1632011-09-17 04:32:15 +00004298 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004299 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004300 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004301 (IsWindowsMSVC &&
4302 Args.hasFlag(options::OPT_fms_extensions,
4303 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004304 CmdArgs.push_back("-fms-compatibility");
4305
David Majnemerc371ff02015-03-22 08:39:22 +00004306 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004307 VersionTuple MSVT = visualstudio::getMSVCVersion(
4308 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4309 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004310 CmdArgs.push_back(
4311 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004312
David Majnemer8db91762015-05-18 04:49:30 +00004313 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4314 if (ImplyVCPPCXXVer) {
4315 if (IsMSVC2015Compatible)
4316 CmdArgs.push_back("-std=c++14");
4317 else
4318 CmdArgs.push_back("-std=c++11");
4319 }
4320
Eric Christopher5ecce122013-02-18 00:38:31 +00004321 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004322 if (Args.hasFlag(options::OPT_fborland_extensions,
4323 options::OPT_fno_borland_extensions, false))
4324 CmdArgs.push_back("-fborland-extensions");
4325
David Majnemerc371ff02015-03-22 08:39:22 +00004326 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4327 // than 19.
4328 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4329 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004330 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004331 CmdArgs.push_back("-fno-threadsafe-statics");
4332
Francois Pichet02744872011-09-01 16:38:08 +00004333 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4334 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004335 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004336 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004337 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004338
Chandler Carruthe03aa552010-04-17 20:17:31 +00004339 // -fgnu-keywords default varies depending on language; only pass if
4340 // specified.
4341 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004342 options::OPT_fno_gnu_keywords))
4343 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004344
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004345 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004346 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004347 CmdArgs.push_back("-fgnu89-inline");
4348
Chad Rosier9c76d242012-03-15 22:31:42 +00004349 if (Args.hasArg(options::OPT_fno_inline))
4350 CmdArgs.push_back("-fno-inline");
4351
Chad Rosier64d6be92012-03-06 21:17:19 +00004352 if (Args.hasArg(options::OPT_fno_inline_functions))
4353 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004354
John McCall5fb5df92012-06-20 06:18:46 +00004355 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004356
John McCall5fb5df92012-06-20 06:18:46 +00004357 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004358 // legacy is the default. Except for deployment taget of 10.5,
4359 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4360 // gets ignored silently.
4361 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004362 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4363 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004364 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004365 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004366 if (getToolChain().UseObjCMixedDispatch())
4367 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4368 else
4369 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4370 }
4371 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004372
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004373 // When ObjectiveC legacy runtime is in effect on MacOSX,
4374 // turn on the option to do Array/Dictionary subscripting
4375 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004376 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004377 getToolChain().getTriple().isMacOSX() &&
4378 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4379 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004380 objcRuntime.isNeXTFamily())
4381 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004382
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004383 // -fencode-extended-block-signature=1 is default.
4384 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4385 CmdArgs.push_back("-fencode-extended-block-signature");
4386 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004387
John McCall24fc0de2011-07-06 00:26:06 +00004388 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4389 // NOTE: This logic is duplicated in ToolChains.cpp.
4390 bool ARC = isObjCAutoRefCount(Args);
4391 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004392 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004393
John McCall24fc0de2011-07-06 00:26:06 +00004394 CmdArgs.push_back("-fobjc-arc");
4395
Chandler Carruth491db322011-11-04 07:34:47 +00004396 // FIXME: It seems like this entire block, and several around it should be
4397 // wrapped in isObjC, but for now we just use it here as this is where it
4398 // was being used previously.
4399 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4400 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4401 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4402 else
4403 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4404 }
4405
John McCall24fc0de2011-07-06 00:26:06 +00004406 // Allow the user to enable full exceptions code emission.
4407 // We define off for Objective-CC, on for Objective-C++.
4408 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4409 options::OPT_fno_objc_arc_exceptions,
4410 /*default*/ types::isCXX(InputType)))
4411 CmdArgs.push_back("-fobjc-arc-exceptions");
4412 }
4413
4414 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4415 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004416 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004417 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004418
John McCall24fc0de2011-07-06 00:26:06 +00004419 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4420 // takes precedence.
4421 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4422 if (!GCArg)
4423 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4424 if (GCArg) {
4425 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004426 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004427 } else if (getToolChain().SupportsObjCGC()) {
4428 GCArg->render(Args, CmdArgs);
4429 } else {
4430 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004431 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004432 }
4433 }
4434
Bob Wilsonb111ec92015-03-02 19:01:14 +00004435 if (Args.hasFlag(options::OPT_fapplication_extension,
4436 options::OPT_fno_application_extension, false))
4437 CmdArgs.push_back("-fapplication-extension");
4438
Reid Klecknerc542d372014-06-27 17:02:02 +00004439 // Handle GCC-style exception args.
4440 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004441 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4442 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004443
4444 if (getToolChain().UseSjLjExceptions())
4445 CmdArgs.push_back("-fsjlj-exceptions");
4446
4447 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004448 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4449 options::OPT_fno_assume_sane_operator_new))
4450 CmdArgs.push_back("-fno-assume-sane-operator-new");
4451
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004452 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4453 // most platforms.
4454 if (Args.hasFlag(options::OPT_fsized_deallocation,
4455 options::OPT_fno_sized_deallocation, false))
4456 CmdArgs.push_back("-fsized-deallocation");
4457
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004458 // -fconstant-cfstrings is default, and may be subject to argument translation
4459 // on Darwin.
4460 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4461 options::OPT_fno_constant_cfstrings) ||
4462 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4463 options::OPT_mno_constant_cfstrings))
4464 CmdArgs.push_back("-fno-constant-cfstrings");
4465
John Thompsoned4e2952009-11-05 20:14:16 +00004466 // -fshort-wchar default varies depending on platform; only
4467 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004468 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4469 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004470 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004471
Hans Wennborg28c96312013-07-31 23:39:13 +00004472 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004473 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004474 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004475 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004476
Daniel Dunbar096ed292011-10-05 21:04:55 +00004477 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4478 // -fno-pack-struct doesn't apply to -fpack-struct=.
4479 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004480 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004481 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004482 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004483 } else if (Args.hasFlag(options::OPT_fpack_struct,
4484 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004485 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004486 }
4487
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004488 // Handle -fmax-type-align=N and -fno-type-align
4489 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4490 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4491 if (!SkipMaxTypeAlign) {
4492 std::string MaxTypeAlignStr = "-fmax-type-align=";
4493 MaxTypeAlignStr += A->getValue();
4494 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4495 }
4496 } else if (getToolChain().getTriple().isOSDarwin()) {
4497 if (!SkipMaxTypeAlign) {
4498 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4499 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4500 }
4501 }
4502
Robert Lytton0e076492013-08-13 09:43:10 +00004503 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004504 if (!Args.hasArg(options::OPT_fcommon))
4505 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004506 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004507 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004508
Daniel Dunbard18049a2009-04-07 21:16:11 +00004509 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004510 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004511 CmdArgs.push_back("-fno-common");
4512
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004513 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004514 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004515 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004516 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004517 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004518 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004519
Daniel Dunbar6358d682010-10-15 22:30:42 +00004520 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004521 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004522 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004523 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004524
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004525 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004526 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4527 StringRef value = inputCharset->getValue();
4528 if (value != "UTF-8")
4529 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4530 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004531 }
4532
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004533 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004534 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4535 StringRef value = execCharset->getValue();
4536 if (value != "UTF-8")
4537 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4538 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004539 }
4540
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004541 // -fcaret-diagnostics is default.
4542 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4543 options::OPT_fno_caret_diagnostics, true))
4544 CmdArgs.push_back("-fno-caret-diagnostics");
4545
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004546 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004547 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004548 options::OPT_fno_diagnostics_fixit_info))
4549 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004550
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004551 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004552 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004553 options::OPT_fno_diagnostics_show_option))
4554 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004555
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004556 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004557 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004558 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004559 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004560 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004561
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004562 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004563 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004564 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004565 }
4566
Chandler Carruthb6766f02011-03-27 01:50:55 +00004567 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004568 options::OPT_fdiagnostics_show_note_include_stack,
4569 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004570 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004571 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004572 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4573 else
4574 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4575 }
4576
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004577 // Color diagnostics are the default, unless the terminal doesn't support
4578 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004579 // Support both clang's -f[no-]color-diagnostics and gcc's
4580 // -f[no-]diagnostics-colors[=never|always|auto].
4581 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004582 for (const auto &Arg : Args) {
4583 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004584 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4585 !O.matches(options::OPT_fdiagnostics_color) &&
4586 !O.matches(options::OPT_fno_color_diagnostics) &&
4587 !O.matches(options::OPT_fno_diagnostics_color) &&
4588 !O.matches(options::OPT_fdiagnostics_color_EQ))
4589 continue;
4590
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004591 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004592 if (O.matches(options::OPT_fcolor_diagnostics) ||
4593 O.matches(options::OPT_fdiagnostics_color)) {
4594 ShowColors = Colors_On;
4595 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4596 O.matches(options::OPT_fno_diagnostics_color)) {
4597 ShowColors = Colors_Off;
4598 } else {
4599 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004600 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004601 if (value == "always")
4602 ShowColors = Colors_On;
4603 else if (value == "never")
4604 ShowColors = Colors_Off;
4605 else if (value == "auto")
4606 ShowColors = Colors_Auto;
4607 else
4608 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004609 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004610 }
4611 }
4612 if (ShowColors == Colors_On ||
4613 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004614 CmdArgs.push_back("-fcolor-diagnostics");
4615
Nico Rieck7857d462013-09-11 00:38:02 +00004616 if (Args.hasArg(options::OPT_fansi_escape_codes))
4617 CmdArgs.push_back("-fansi-escape-codes");
4618
Daniel Dunbardb097022009-06-08 21:13:54 +00004619 if (!Args.hasFlag(options::OPT_fshow_source_location,
4620 options::OPT_fno_show_source_location))
4621 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004622
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004623 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004624 true))
4625 CmdArgs.push_back("-fno-show-column");
4626
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004627 if (!Args.hasFlag(options::OPT_fspell_checking,
4628 options::OPT_fno_spell_checking))
4629 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004630
Chad Rosierc8e56e82012-12-05 21:08:21 +00004631 // -fno-asm-blocks is default.
4632 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4633 false))
4634 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004635
Steven Wucb0d13f2015-01-16 23:05:28 +00004636 // -fgnu-inline-asm is default.
4637 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4638 options::OPT_fno_gnu_inline_asm, true))
4639 CmdArgs.push_back("-fno-gnu-inline-asm");
4640
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004641 // Enable vectorization per default according to the optimization level
4642 // selected. For optimization levels that want vectorization we use the alias
4643 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004644 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004645 OptSpecifier VectorizeAliasOption =
4646 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004647 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004648 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004649 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004650
Chad Rosier136d67d2014-04-28 19:30:57 +00004651 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004652 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004653 OptSpecifier SLPVectAliasOption =
4654 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004655 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004656 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004657 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004658
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004659 // -fno-slp-vectorize-aggressive is default.
4660 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004661 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004662 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004663
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004664 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4665 A->render(Args, CmdArgs);
4666
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004667 // -fdollars-in-identifiers default varies depending on platform and
4668 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004669 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004670 options::OPT_fno_dollars_in_identifiers)) {
4671 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004672 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004673 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004674 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004675 }
4676
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004677 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4678 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004679 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004680 options::OPT_fno_unit_at_a_time)) {
4681 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004682 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004683 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004684
Eli Friedman055c9702011-11-02 01:53:16 +00004685 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4686 options::OPT_fno_apple_pragma_pack, false))
4687 CmdArgs.push_back("-fapple-pragma-pack");
4688
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004689 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004690 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4691 // by default.
4692 if (getToolChain().getArch() == llvm::Triple::le32) {
4693 CmdArgs.push_back("-fno-math-builtin");
4694 }
4695
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004696// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4697//
4698// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004699#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004700 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004701 (getToolChain().getArch() == llvm::Triple::arm ||
4702 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004703 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4704 CmdArgs.push_back("-fno-builtin-strcat");
4705 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4706 CmdArgs.push_back("-fno-builtin-strcpy");
4707 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004708#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004709
Justin Bognera88f0122014-06-20 22:59:50 +00004710 // Enable rewrite includes if the user's asked for it or if we're generating
4711 // diagnostics.
4712 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4713 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004714 if (Args.hasFlag(options::OPT_frewrite_includes,
4715 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004716 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004717 CmdArgs.push_back("-frewrite-includes");
4718
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004719 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004720 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004721 options::OPT_traditional_cpp)) {
4722 if (isa<PreprocessJobAction>(JA))
4723 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004724 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004725 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004726 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004727
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004728 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004729 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004730
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004731 // Handle serialized diagnostics.
4732 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4733 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004734 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004735 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004736
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004737 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4738 CmdArgs.push_back("-fretain-comments-from-system-headers");
4739
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004740 // Forward -fcomment-block-commands to -cc1.
4741 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004742 // Forward -fparse-all-comments to -cc1.
4743 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004744
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004745 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4746 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004747 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004748 bool OptDisabled = false;
Sean Silva14facf32015-06-09 01:57:17 +00004749 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4750 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004751
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004752 // We translate this by hand to the -cc1 argument, since nightly test uses
4753 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004754 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004755 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004756 OptDisabled = true;
4757 } else
Sean Silva14facf32015-06-09 01:57:17 +00004758 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004759 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004760
Bob Wilson23a55f12014-12-21 07:00:00 +00004761 // With -save-temps, we want to save the unoptimized bitcode output from the
4762 // CompileJobAction, so disable optimizations if they are not already
4763 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004764 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004765 isa<CompileJobAction>(JA))
4766 CmdArgs.push_back("-disable-llvm-optzns");
4767
Daniel Dunbard67a3222009-03-30 06:36:42 +00004768 if (Output.getType() == types::TY_Dependencies) {
4769 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004770 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004771 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004772 CmdArgs.push_back(Output.getFilename());
4773 } else {
4774 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004775 }
4776
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004777 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004778 addDashXForInput(Args, II, CmdArgs);
4779
Daniel Dunbarb440f562010-08-02 02:38:21 +00004780 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004781 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004782 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004783 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004784 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004785
Chris Lattnere9d7d782009-11-03 19:50:27 +00004786 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4787
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004788 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004789
4790 // Optionally embed the -cc1 level arguments into the debug info, for build
4791 // analysis.
4792 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004793 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004794 for (const auto &Arg : Args)
4795 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004796
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004797 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004798 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004799 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004800 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004801 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004802 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004803 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004804 }
4805 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004806 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004807 }
4808
Eric Christopherd3804002013-02-22 20:12:52 +00004809 // Add the split debug info name to the command lines here so we
4810 // can propagate it to the backend.
4811 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004812 getToolChain().getTriple().isOSLinux() &&
4813 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4814 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004815 const char *SplitDwarfOut;
4816 if (SplitDwarf) {
4817 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004818 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004819 CmdArgs.push_back(SplitDwarfOut);
4820 }
4821
4822 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004823 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004824 Output.getType() == types::TY_Object &&
4825 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004826 auto CLCommand =
4827 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4828 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4829 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004830 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004831 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004832 }
4833
Eric Christopherf1545832013-02-22 23:50:16 +00004834 // Handle the debug info splitting at object creation time if we're
4835 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004836 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004837 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004838 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004839
Roman Divacky178e01602011-02-10 16:52:03 +00004840 if (Arg *A = Args.getLastArg(options::OPT_pg))
4841 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004842 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
4843 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004844
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004845 // Claim some arguments which clang supports automatically.
4846
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004847 // -fpch-preprocess is used with gcc to add a special marker in the output to
4848 // include the PCH file. Clang's PTH solution is completely transparent, so we
4849 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004850 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004851
Daniel Dunbar17731772009-03-23 19:03:36 +00004852 // Claim some arguments which clang doesn't support, but we don't
4853 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004854 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4855 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004856
Rafael Espindolab0092d72013-09-04 19:37:35 +00004857 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004858 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004859}
4860
John McCall5fb5df92012-06-20 06:18:46 +00004861/// Add options related to the Objective-C runtime/ABI.
4862///
4863/// Returns true if the runtime is non-fragile.
4864ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4865 ArgStringList &cmdArgs,
4866 RewriteKind rewriteKind) const {
4867 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004868 Arg *runtimeArg =
4869 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
4870 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00004871
4872 // Just forward -fobjc-runtime= to the frontend. This supercedes
4873 // options about fragility.
4874 if (runtimeArg &&
4875 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4876 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004877 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004878 if (runtime.tryParse(value)) {
4879 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004880 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004881 }
4882
4883 runtimeArg->render(args, cmdArgs);
4884 return runtime;
4885 }
4886
4887 // Otherwise, we'll need the ABI "version". Version numbers are
4888 // slightly confusing for historical reasons:
4889 // 1 - Traditional "fragile" ABI
4890 // 2 - Non-fragile ABI, version 1
4891 // 3 - Non-fragile ABI, version 2
4892 unsigned objcABIVersion = 1;
4893 // If -fobjc-abi-version= is present, use that to set the version.
4894 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004895 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004896 if (value == "1")
4897 objcABIVersion = 1;
4898 else if (value == "2")
4899 objcABIVersion = 2;
4900 else if (value == "3")
4901 objcABIVersion = 3;
4902 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00004904 } else {
4905 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004906 bool nonFragileABIIsDefault =
4907 (rewriteKind == RK_NonFragile ||
4908 (rewriteKind == RK_None &&
4909 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00004910 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4911 options::OPT_fno_objc_nonfragile_abi,
4912 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004913// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00004914#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4915 unsigned nonFragileABIVersion = 1;
4916#else
4917 unsigned nonFragileABIVersion = 2;
4918#endif
4919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004920 if (Arg *abiArg =
4921 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004922 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004923 if (value == "1")
4924 nonFragileABIVersion = 1;
4925 else if (value == "2")
4926 nonFragileABIVersion = 2;
4927 else
4928 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004929 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004930 }
4931
4932 objcABIVersion = 1 + nonFragileABIVersion;
4933 } else {
4934 objcABIVersion = 1;
4935 }
4936 }
4937
4938 // We don't actually care about the ABI version other than whether
4939 // it's non-fragile.
4940 bool isNonFragile = objcABIVersion != 1;
4941
4942 // If we have no runtime argument, ask the toolchain for its default runtime.
4943 // However, the rewriter only really supports the Mac runtime, so assume that.
4944 ObjCRuntime runtime;
4945 if (!runtimeArg) {
4946 switch (rewriteKind) {
4947 case RK_None:
4948 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4949 break;
4950 case RK_Fragile:
4951 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4952 break;
4953 case RK_NonFragile:
4954 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4955 break;
4956 }
4957
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004958 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00004959 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4960 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004961 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004962 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4963
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004964 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00004965 } else {
4966 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4967 }
4968
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004969 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00004970 } else {
4971 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004972 // Legacy behaviour is to target the gnustep runtime if we are i
4973 // non-fragile mode or the GCC runtime in fragile mode.
4974 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004975 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00004976 else
4977 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004978 }
4979
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004980 cmdArgs.push_back(
4981 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00004982 return runtime;
4983}
4984
Reid Klecknerc542d372014-06-27 17:02:02 +00004985static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4986 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4987 I += HaveDash;
4988 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004989}
Reid Klecknerc542d372014-06-27 17:02:02 +00004990
4991struct EHFlags {
4992 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4993 bool Synch;
4994 bool Asynch;
4995 bool NoExceptC;
4996};
4997
4998/// /EH controls whether to run destructor cleanups when exceptions are
4999/// thrown. There are three modifiers:
5000/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5001/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5002/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5003/// - c: Assume that extern "C" functions are implicitly noexcept. This
5004/// modifier is an optimization, so we ignore it for now.
5005/// The default is /EHs-c-, meaning cleanups are disabled.
5006static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5007 EHFlags EH;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005008 std::vector<std::string> EHArgs =
5009 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005010 for (auto EHVal : EHArgs) {
5011 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5012 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005013 case 'a':
5014 EH.Asynch = maybeConsumeDash(EHVal, I);
5015 continue;
5016 case 'c':
5017 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5018 continue;
5019 case 's':
5020 EH.Synch = maybeConsumeDash(EHVal, I);
5021 continue;
5022 default:
5023 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005024 }
5025 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5026 break;
5027 }
5028 }
5029 return EH;
5030}
5031
Hans Wennborg75958c42013-08-08 00:17:41 +00005032void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5033 unsigned RTOptionID = options::OPT__SLASH_MT;
5034
Hans Wennborgf1a74252013-09-10 20:18:04 +00005035 if (Args.hasArg(options::OPT__SLASH_LDd))
5036 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5037 // but defining _DEBUG is sticky.
5038 RTOptionID = options::OPT__SLASH_MTd;
5039
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005040 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005041 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005042
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005043 switch (RTOptionID) {
5044 case options::OPT__SLASH_MD:
5045 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005046 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005047 CmdArgs.push_back("-D_MT");
5048 CmdArgs.push_back("-D_DLL");
5049 CmdArgs.push_back("--dependent-lib=msvcrt");
5050 break;
5051 case options::OPT__SLASH_MDd:
5052 CmdArgs.push_back("-D_DEBUG");
5053 CmdArgs.push_back("-D_MT");
5054 CmdArgs.push_back("-D_DLL");
5055 CmdArgs.push_back("--dependent-lib=msvcrtd");
5056 break;
5057 case options::OPT__SLASH_MT:
5058 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005059 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005060 CmdArgs.push_back("-D_MT");
5061 CmdArgs.push_back("--dependent-lib=libcmt");
5062 break;
5063 case options::OPT__SLASH_MTd:
5064 CmdArgs.push_back("-D_DEBUG");
5065 CmdArgs.push_back("-D_MT");
5066 CmdArgs.push_back("--dependent-lib=libcmtd");
5067 break;
5068 default:
5069 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005070 }
5071
Reid Kleckner6beca0e2013-08-08 19:33:10 +00005072 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5073 // users want. The /Za flag to cl.exe turns this off, but it's not
5074 // implemented in clang.
5075 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00005076
Hans Wennborg8858a032014-07-21 23:42:07 +00005077 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5078 // would produce interleaved output, so ignore /showIncludes in such cases.
5079 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5080 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5081 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005082
David Majnemerf6072342014-07-01 22:24:56 +00005083 // This controls whether or not we emit RTTI data for polymorphic types.
5084 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5085 /*default=*/false))
5086 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005087
Reid Klecknerc542d372014-06-27 17:02:02 +00005088 const Driver &D = getToolChain().getDriver();
5089 EHFlags EH = parseClangCLEHFlags(D, Args);
5090 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005091 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005092 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005093 CmdArgs.push_back("-fexceptions");
5094 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005095
Hans Wennborge50cec32014-06-13 20:59:54 +00005096 // /EP should expand to -E -P.
5097 if (Args.hasArg(options::OPT__SLASH_EP)) {
5098 CmdArgs.push_back("-E");
5099 CmdArgs.push_back("-P");
5100 }
5101
David Majnemera5b195a2015-02-14 01:35:12 +00005102 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005103 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5104 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005105 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5106 else
5107 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5108
5109 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5110 VolatileOptionID = A->getOption().getID();
5111
5112 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5113 CmdArgs.push_back("-fms-volatile");
5114
David Majnemer86c318f2014-02-11 21:05:00 +00005115 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5116 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5117 if (MostGeneralArg && BestCaseArg)
5118 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5119 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5120
5121 if (MostGeneralArg) {
5122 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5123 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5124 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5125
5126 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5127 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5128 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5129 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5130 << FirstConflict->getAsString(Args)
5131 << SecondConflict->getAsString(Args);
5132
5133 if (SingleArg)
5134 CmdArgs.push_back("-fms-memptr-rep=single");
5135 else if (MultipleArg)
5136 CmdArgs.push_back("-fms-memptr-rep=multiple");
5137 else
5138 CmdArgs.push_back("-fms-memptr-rep=virtual");
5139 }
5140
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005141 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5142 A->render(Args, CmdArgs);
5143
Hans Wennborg81f74482013-09-10 01:07:07 +00005144 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5145 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005146 if (Args.hasArg(options::OPT__SLASH_fallback))
5147 CmdArgs.push_back("msvc-fallback");
5148 else
5149 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005150 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005151}
5152
Douglas Katzman95354292015-06-23 20:42:09 +00005153visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005154 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005155 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005156 return CLFallback.get();
5157}
5158
Daniel Sanders7f933f42015-01-30 17:35:23 +00005159void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5160 ArgStringList &CmdArgs) const {
5161 StringRef CPUName;
5162 StringRef ABIName;
5163 const llvm::Triple &Triple = getToolChain().getTriple();
5164 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5165
5166 CmdArgs.push_back("-target-abi");
5167 CmdArgs.push_back(ABIName.data());
5168}
5169
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005170void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005171 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005172 const ArgList &Args,
5173 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005174 ArgStringList CmdArgs;
5175
5176 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5177 const InputInfo &Input = Inputs[0];
5178
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005179 // Don't warn about "clang -w -c foo.s"
5180 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005181 // and "clang -emit-llvm -c foo.s"
5182 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005183
Rafael Espindola577637a2015-01-03 00:06:04 +00005184 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005185
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005186 // Invoke ourselves in -cc1as mode.
5187 //
5188 // FIXME: Implement custom jobs for internal actions.
5189 CmdArgs.push_back("-cc1as");
5190
5191 // Add the "effective" target triple.
5192 CmdArgs.push_back("-triple");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005193 std::string TripleStr =
5194 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005195 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5196
5197 // Set the output mode, we currently only expect to be used as a real
5198 // assembler.
5199 CmdArgs.push_back("-filetype");
5200 CmdArgs.push_back("obj");
5201
Eric Christopher45f2e712012-12-18 00:31:10 +00005202 // Set the main file name, so that debug info works even with
5203 // -save-temps or preprocessed assembly.
5204 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005205 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005206
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005207 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005208 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005209 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005210 if (!CPU.empty()) {
5211 CmdArgs.push_back("-target-cpu");
5212 CmdArgs.push_back(Args.MakeArgString(CPU));
5213 }
5214
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005215 // Add the target features
5216 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005217 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005218
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005219 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005221
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005222 // Pass along any -I options so we get proper .include search paths.
5223 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5224
Eric Christopherfc3ee562012-01-10 00:38:01 +00005225 // Determine the original source input.
5226 const Action *SourceAction = &JA;
5227 while (SourceAction->getKind() != Action::InputClass) {
5228 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5229 SourceAction = SourceAction->getInputs()[0];
5230 }
5231
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005232 // Forward -g and handle debug info related flags, assuming we are dealing
5233 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005234 if (SourceAction->getType() == types::TY_Asm ||
5235 SourceAction->getType() == types::TY_PP_Asm) {
5236 Args.ClaimAllArgs(options::OPT_g_Group);
5237 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5238 if (!A->getOption().matches(options::OPT_g0))
5239 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005240
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005241 if (Args.hasArg(options::OPT_gdwarf_2))
5242 CmdArgs.push_back("-gdwarf-2");
5243 if (Args.hasArg(options::OPT_gdwarf_3))
5244 CmdArgs.push_back("-gdwarf-3");
5245 if (Args.hasArg(options::OPT_gdwarf_4))
5246 CmdArgs.push_back("-gdwarf-4");
5247
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005248 // Add the -fdebug-compilation-dir flag if needed.
5249 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005250
5251 // Set the AT_producer to the clang version when using the integrated
5252 // assembler on assembly source files.
5253 CmdArgs.push_back("-dwarf-debug-producer");
5254 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005255 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005256
5257 // Optionally embed the -cc1as level arguments into the debug info, for build
5258 // analysis.
5259 if (getToolChain().UseDwarfDebugFlags()) {
5260 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005261 for (const auto &Arg : Args)
5262 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005263
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005264 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005265 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5266 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005267 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005268 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005269 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005270 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005271 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005272 }
5273 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005274 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005275 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005276
5277 // FIXME: Add -static support, once we have it.
5278
Daniel Sanders7f933f42015-01-30 17:35:23 +00005279 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005280 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005281 default:
5282 break;
5283
5284 case llvm::Triple::mips:
5285 case llvm::Triple::mipsel:
5286 case llvm::Triple::mips64:
5287 case llvm::Triple::mips64el:
5288 AddMIPSTargetArgs(Args, CmdArgs);
5289 break;
5290 }
5291
David Blaikie372d9502014-01-17 03:17:40 +00005292 // Consume all the warning flags. Usually this would be handled more
5293 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5294 // doesn't handle that so rather than warning about unused flags that are
5295 // actually used, we'll lie by omission instead.
5296 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005297 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5298 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005299
David Blaikie9260ed62013-07-25 21:19:01 +00005300 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5301 getToolChain().getDriver());
5302
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005303 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005304
5305 assert(Output.isFilename() && "Unexpected lipo output.");
5306 CmdArgs.push_back("-o");
5307 CmdArgs.push_back(Output.getFilename());
5308
Daniel Dunbarb440f562010-08-02 02:38:21 +00005309 assert(Input.isFilename() && "Invalid input.");
5310 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005311
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005312 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005313 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005314
5315 // Handle the debug info splitting at object creation time if we're
5316 // creating an object.
5317 // TODO: Currently only works on linux with newer objcopy.
5318 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005319 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005320 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005321 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005322}
5323
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005324void GnuTool::anchor() {}
5325
Daniel Dunbara3246a02009-03-18 08:07:30 +00005326void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005327 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005328 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005329 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005330 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005331 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005332
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005333 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005334 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005335 // Don't forward any -g arguments to assembly steps.
5336 if (isa<AssembleJobAction>(JA) &&
5337 A->getOption().matches(options::OPT_g_Group))
5338 continue;
5339
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005340 // Don't forward any -W arguments to assembly and link steps.
5341 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5342 A->getOption().matches(options::OPT_W_Group))
5343 continue;
5344
Daniel Dunbar2da02722009-03-19 07:55:12 +00005345 // It is unfortunate that we have to claim here, as this means
5346 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005347 // platforms using a generic gcc, even if we are just using gcc
5348 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005349 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005350 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005351 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005352 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005353
Daniel Dunbar4e295052010-01-25 22:35:08 +00005354 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005355
5356 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005357 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005358 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005359 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005361 }
5362
Daniel Dunbar5716d872009-05-02 21:41:52 +00005363 // Try to force gcc to match the tool chain we want, if we recognize
5364 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005365 //
5366 // FIXME: The triple class should directly provide the information we want
5367 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005368 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005369 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005370 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005371 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5372 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005373 CmdArgs.push_back("-m64");
5374
Daniel Dunbarb440f562010-08-02 02:38:21 +00005375 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005376 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005377 CmdArgs.push_back(Output.getFilename());
5378 } else {
5379 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005380 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005381 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005382
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005383 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005384
5385 // Only pass -x if gcc will understand it; otherwise hope gcc
5386 // understands the suffix correctly. The main use case this would go
5387 // wrong in is for linker inputs if they happened to have an odd
5388 // suffix; really the only way to get this to happen is a command
5389 // like '-x foobar a.c' which will treat a.c like a linker input.
5390 //
5391 // FIXME: For the linker case specifically, can we safely convert
5392 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005393 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005394 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005395 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5396 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005397 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005398 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005399 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005400 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005401 else if (II.getType() == types::TY_ModuleFile)
5402 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005403 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005404
Daniel Dunbara3246a02009-03-18 08:07:30 +00005405 if (types::canTypeBeUserSpecified(II.getType())) {
5406 CmdArgs.push_back("-x");
5407 CmdArgs.push_back(types::getTypeName(II.getType()));
5408 }
5409
Daniel Dunbarb440f562010-08-02 02:38:21 +00005410 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005411 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005412 else {
5413 const Arg &A = II.getInputArg();
5414
5415 // Reverse translate some rewritten options.
5416 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5417 CmdArgs.push_back("-lstdc++");
5418 continue;
5419 }
5420
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005421 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005422 A.render(Args, CmdArgs);
5423 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005424 }
5425
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005426 const std::string customGCCName = D.getCCCGenericGCCName();
5427 const char *GCCName;
5428 if (!customGCCName.empty())
5429 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005430 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005431 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005432 } else
5433 GCCName = "gcc";
5434
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005435 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005437}
5438
Douglas Katzman95354292015-06-23 20:42:09 +00005439void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5440 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005441 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005442}
5443
Douglas Katzman95354292015-06-23 20:42:09 +00005444void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5445 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005446 const Driver &D = getToolChain().getDriver();
5447
Eric Christophercc7ff502015-01-29 00:56:17 +00005448 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005449 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005450 case types::TY_LLVM_IR:
5451 case types::TY_LTO_IR:
5452 case types::TY_LLVM_BC:
5453 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005454 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005455 break;
5456 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005457 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005458 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005459 case types::TY_Nothing:
5460 CmdArgs.push_back("-fsyntax-only");
5461 break;
5462 default:
5463 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005464 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005465}
5466
Douglas Katzman95354292015-06-23 20:42:09 +00005467void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5468 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005469 // The types are (hopefully) good enough.
5470}
5471
Tony Linthicum76329bf2011-12-12 21:14:55 +00005472// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005473void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5474 ArgStringList &CmdArgs) const {}
5475void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5476 const InputInfo &Output,
5477 const InputInfoList &Inputs,
5478 const ArgList &Args,
5479 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005480 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005481
5482 const Driver &D = getToolChain().getDriver();
5483 ArgStringList CmdArgs;
5484
5485 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005486 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005487 CmdArgs.push_back(Args.MakeArgString(MarchString));
5488
5489 RenderExtraToolArgs(JA, CmdArgs);
5490
5491 if (Output.isFilename()) {
5492 CmdArgs.push_back("-o");
5493 CmdArgs.push_back(Output.getFilename());
5494 } else {
5495 assert(Output.isNothing() && "Unexpected output");
5496 CmdArgs.push_back("-fsyntax-only");
5497 }
5498
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005499 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005500 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005502 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005503
Tony Linthicum76329bf2011-12-12 21:14:55 +00005504 // Only pass -x if gcc will understand it; otherwise hope gcc
5505 // understands the suffix correctly. The main use case this would go
5506 // wrong in is for linker inputs if they happened to have an odd
5507 // suffix; really the only way to get this to happen is a command
5508 // like '-x foobar a.c' which will treat a.c like a linker input.
5509 //
5510 // FIXME: For the linker case specifically, can we safely convert
5511 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005512 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005513 // Don't try to pass LLVM or AST inputs to a generic gcc.
5514 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5515 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5516 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005517 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005518 else if (II.getType() == types::TY_AST)
5519 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005520 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005521 else if (II.getType() == types::TY_ModuleFile)
5522 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005523 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005524
5525 if (II.isFilename())
5526 CmdArgs.push_back(II.getFilename());
5527 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005528 // Don't render as input, we need gcc to do the translations.
5529 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005530 II.getInputArg().render(Args, CmdArgs);
5531 }
5532
5533 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005534 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005535 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005536}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005537
Douglas Katzman95354292015-06-23 20:42:09 +00005538void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5539 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005540 // The types are (hopefully) good enough.
5541}
5542
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005543static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005544 const toolchains::Hexagon_TC &ToolChain,
5545 const InputInfo &Output,
5546 const InputInfoList &Inputs,
5547 const ArgList &Args,
5548 ArgStringList &CmdArgs,
5549 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005550
Matthew Curtise689b052012-12-06 15:46:07 +00005551 const Driver &D = ToolChain.getDriver();
5552
Matthew Curtise689b052012-12-06 15:46:07 +00005553 //----------------------------------------------------------------------------
5554 //
5555 //----------------------------------------------------------------------------
5556 bool hasStaticArg = Args.hasArg(options::OPT_static);
5557 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005558 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005559 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5560 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5561 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005562 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005563 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005564
Matthew Curtise689b052012-12-06 15:46:07 +00005565 //----------------------------------------------------------------------------
5566 // Silence warnings for various options
5567 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005568
Matthew Curtise689b052012-12-06 15:46:07 +00005569 Args.ClaimAllArgs(options::OPT_g_Group);
5570 Args.ClaimAllArgs(options::OPT_emit_llvm);
5571 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5572 // handled somewhere else.
5573 Args.ClaimAllArgs(options::OPT_static_libgcc);
5574
5575 //----------------------------------------------------------------------------
5576 //
5577 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005578 for (const auto &Opt : ToolChain.ExtraOpts)
5579 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005580
Matthew Curtisf10a5952012-12-06 14:16:43 +00005581 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5582 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005583
Matthew Curtise689b052012-12-06 15:46:07 +00005584 if (buildingLib) {
5585 CmdArgs.push_back("-shared");
5586 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5587 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005588 }
5589
Matthew Curtise689b052012-12-06 15:46:07 +00005590 if (hasStaticArg)
5591 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005592
Matthew Curtise8f80a12012-12-06 17:49:03 +00005593 if (buildPIE && !buildingLib)
5594 CmdArgs.push_back("-pie");
5595
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005596 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005597 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5598 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005599 }
5600
Matthew Curtise689b052012-12-06 15:46:07 +00005601 //----------------------------------------------------------------------------
5602 //
5603 //----------------------------------------------------------------------------
5604 CmdArgs.push_back("-o");
5605 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005606
Matthew Curtise689b052012-12-06 15:46:07 +00005607 const std::string MarchSuffix = "/" + MarchString;
5608 const std::string G0Suffix = "/G0";
5609 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005610 const std::string RootDir =
5611 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005612 const std::string StartFilesDir =
5613 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005614
5615 //----------------------------------------------------------------------------
5616 // moslib
5617 //----------------------------------------------------------------------------
5618 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005619 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005620
Sean Silva14facf32015-06-09 01:57:17 +00005621 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5622 A->claim();
5623 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005624 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005625 }
Matthew Curtise689b052012-12-06 15:46:07 +00005626 if (oslibs.empty()) {
5627 oslibs.push_back("standalone");
5628 hasStandalone = true;
5629 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005630
Matthew Curtise689b052012-12-06 15:46:07 +00005631 //----------------------------------------------------------------------------
5632 // Start Files
5633 //----------------------------------------------------------------------------
5634 if (incStdLib && incStartFiles) {
5635
5636 if (!buildingLib) {
5637 if (hasStandalone) {
5638 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005639 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005640 }
5641 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5642 }
5643 std::string initObj = useShared ? "/initS.o" : "/init.o";
5644 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5645 }
5646
5647 //----------------------------------------------------------------------------
5648 // Library Search Paths
5649 //----------------------------------------------------------------------------
5650 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005651 for (const auto &LibPath : LibPaths)
5652 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005653
5654 //----------------------------------------------------------------------------
5655 //
5656 //----------------------------------------------------------------------------
5657 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5658 Args.AddAllArgs(CmdArgs, options::OPT_e);
5659 Args.AddAllArgs(CmdArgs, options::OPT_s);
5660 Args.AddAllArgs(CmdArgs, options::OPT_t);
5661 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5662
5663 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5664
5665 //----------------------------------------------------------------------------
5666 // Libraries
5667 //----------------------------------------------------------------------------
5668 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005669 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005670 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5671 CmdArgs.push_back("-lm");
5672 }
5673
5674 CmdArgs.push_back("--start-group");
5675
5676 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005677 for (const std::string &Lib : oslibs)
5678 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005679 CmdArgs.push_back("-lc");
5680 }
5681 CmdArgs.push_back("-lgcc");
5682
5683 CmdArgs.push_back("--end-group");
5684 }
5685
5686 //----------------------------------------------------------------------------
5687 // End files
5688 //----------------------------------------------------------------------------
5689 if (incStdLib && incStartFiles) {
5690 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5691 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5692 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005693}
5694
Douglas Katzman95354292015-06-23 20:42:09 +00005695void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5696 const InputInfo &Output,
5697 const InputInfoList &Inputs,
5698 const ArgList &Args,
5699 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005700
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005701 const toolchains::Hexagon_TC &ToolChain =
5702 static_cast<const toolchains::Hexagon_TC &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005703
5704 ArgStringList CmdArgs;
5705 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5706 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005707
5708 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005709 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5710 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005711}
5712// Hexagon tools end.
5713
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005714const std::string arm::getARMArch(const ArgList &Args,
5715 const llvm::Triple &Triple) {
5716 std::string MArch;
Bernard Ogden31561762013-12-12 13:27:11 +00005717 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5718 // Otherwise, if we have -march= choose the base CPU for that arch.
5719 MArch = A->getValue();
5720 } else {
5721 // Otherwise, use the Arch from the triple.
5722 MArch = Triple.getArchName();
5723 }
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005724 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005725
5726 // Handle -march=native.
5727 if (MArch == "native") {
5728 std::string CPU = llvm::sys::getHostCPUName();
5729 if (CPU != "generic") {
5730 // Translate the native cpu into the architecture suffix for that CPU.
5731 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5732 // If there is no valid architecture suffix for this CPU we don't know how
5733 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005734 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005735 MArch = "";
5736 else
5737 MArch = std::string("arm") + Suffix;
5738 }
5739 }
5740
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005741 return MArch;
5742}
5743/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5744const char *arm::getARMCPUForMArch(const ArgList &Args,
5745 const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005746 std::string MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005747 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5748 // here means an -march=native that we can't handle, so instead return no CPU.
5749 if (MArch.empty())
5750 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005751
John Brawna95c1a82015-05-08 12:52:18 +00005752 // We need to return an empty string here on invalid MArch values as the
5753 // various places that call this function can't cope with a null result.
5754 const char *result = Triple.getARMCPUForArch(MArch);
5755 if (result)
5756 return result;
5757 else
5758 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005759}
5760
5761/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Gabor Ballabas208826c2015-06-04 17:56:32 +00005762std::string arm::getARMTargetCPU(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005763 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005764 // FIXME: Warn on inconsistent use of -mcpu and -march.
5765 // If we have -mcpu=, use that.
5766 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +00005767 std::string MCPU = StringRef(A->getValue()).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005768 // Handle -mcpu=native.
5769 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005770 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005771 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005772 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005773 }
5774
5775 return getARMCPUForMArch(Args, Triple);
5776}
5777
5778/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005779/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005780// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005781const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005782 if (CPU == "generic" &&
5783 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5784 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005785
Renato Golin3c007252015-05-28 15:05:53 +00005786 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5787 if (ArchKind == llvm::ARM::AK_INVALID)
5788 return "";
5789 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005790}
5791
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005792void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005793 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005794 if (Args.hasArg(options::OPT_r))
5795 return;
5796
John Brawn94fd9632015-05-21 12:19:49 +00005797 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5798 // to generate BE-8 executables.
5799 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5800 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005801}
5802
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005803mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5804 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5805 .Case("mips1", NanLegacy)
5806 .Case("mips2", NanLegacy)
5807 .Case("mips3", NanLegacy)
5808 .Case("mips4", NanLegacy)
5809 .Case("mips5", NanLegacy)
5810 .Case("mips32", NanLegacy)
5811 .Case("mips32r2", NanLegacy)
5812 .Case("mips32r3", NanLegacy | Nan2008)
5813 .Case("mips32r5", NanLegacy | Nan2008)
5814 .Case("mips32r6", Nan2008)
5815 .Case("mips64", NanLegacy)
5816 .Case("mips64r2", NanLegacy)
5817 .Case("mips64r3", NanLegacy | Nan2008)
5818 .Case("mips64r5", NanLegacy | Nan2008)
5819 .Case("mips64r6", Nan2008)
5820 .Default(NanLegacy);
5821}
5822
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005823bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5824 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5825 return A && (A->getValue() == StringRef(Value));
5826}
5827
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005828bool mips::isUCLibc(const ArgList &Args) {
5829 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005830 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005831}
5832
Daniel Sanders2bf13662014-07-10 14:40:57 +00005833bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005834 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5835 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005836 .Case("2008", true)
5837 .Case("legacy", false)
5838 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005839
5840 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005841 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005842 .Cases("mips32r6", "mips64r6", true)
5843 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005844
5845 return false;
5846}
5847
Daniel Sanders379d44b2014-07-16 11:52:23 +00005848bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00005849 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00005850 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005851 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005852 return false;
5853
5854 if (ABIName != "32")
5855 return false;
5856
Toma Tabacu94ea6862015-06-16 13:54:13 +00005857 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
5858 // present.
5859 if (FloatABI == "soft")
5860 return false;
5861
Daniel Sanders379d44b2014-07-16 11:52:23 +00005862 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005863 .Cases("mips2", "mips3", "mips4", "mips5", true)
5864 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5865 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
5866 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00005867}
5868
Toma Tabacu94ea6862015-06-16 13:54:13 +00005869bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
5870 StringRef CPUName, StringRef ABIName,
5871 StringRef FloatABI) {
5872 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
5873
5874 // FPXX shouldn't be used if -msingle-float is present.
5875 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
5876 options::OPT_mdouble_float))
5877 if (A->getOption().matches(options::OPT_msingle_float))
5878 UseFPXX = false;
5879
5880 return UseFPXX;
5881}
5882
Tim Northover157d9112014-01-16 08:48:16 +00005883llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005884 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5885 // archs which Darwin doesn't use.
5886
5887 // The matching this routine does is fairly pointless, since it is neither the
5888 // complete architecture list, nor a reasonable subset. The problem is that
5889 // historically the driver driver accepts this and also ties its -march=
5890 // handling to the architecture name, so we need to be careful before removing
5891 // support for it.
5892
5893 // This code must be kept in sync with Clang's Darwin specific argument
5894 // translation.
5895
5896 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005897 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5898 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5899 .Case("ppc64", llvm::Triple::ppc64)
5900 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5901 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5902 llvm::Triple::x86)
5903 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
5904 // This is derived from the driver driver.
5905 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
5906 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
5907 .Cases("armv7s", "xscale", llvm::Triple::arm)
5908 .Case("arm64", llvm::Triple::aarch64)
5909 .Case("r600", llvm::Triple::r600)
5910 .Case("amdgcn", llvm::Triple::amdgcn)
5911 .Case("nvptx", llvm::Triple::nvptx)
5912 .Case("nvptx64", llvm::Triple::nvptx64)
5913 .Case("amdil", llvm::Triple::amdil)
5914 .Case("spir", llvm::Triple::spir)
5915 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005916}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005917
Tim Northover157d9112014-01-16 08:48:16 +00005918void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005919 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00005920 T.setArch(Arch);
5921
5922 if (Str == "x86_64h")
5923 T.setArchName(Str);
5924 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5925 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005926 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005927 }
5928}
5929
Bob Wilsondecc03e2012-11-23 06:14:39 +00005930const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005931 const InputInfo &Input) {
5932 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005933}
5934
Bob Wilsondecc03e2012-11-23 06:14:39 +00005935const char *Clang::getBaseInputStem(const ArgList &Args,
5936 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005937 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005938
Chris Lattner906bb902011-01-16 08:14:11 +00005939 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005940 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005941
5942 return Str;
5943}
5944
Bob Wilsondecc03e2012-11-23 06:14:39 +00005945const char *Clang::getDependencyFileName(const ArgList &Args,
5946 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005947 // FIXME: Think about this more.
5948 std::string Res;
5949
5950 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005951 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005952 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005953 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005954 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005955 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005956 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005957}
5958
Douglas Katzman95354292015-06-23 20:42:09 +00005959void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5960 const InputInfo &Output,
5961 const InputInfoList &Inputs,
5962 const ArgList &Args,
5963 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005964 const ToolChain &ToolChain = getToolChain();
5965 const Driver &D = ToolChain.getDriver();
5966 ArgStringList CmdArgs;
5967
5968 // Silence warning for "clang -g foo.o -o foo"
5969 Args.ClaimAllArgs(options::OPT_g_Group);
5970 // and "clang -emit-llvm foo.o -o foo"
5971 Args.ClaimAllArgs(options::OPT_emit_llvm);
5972 // and for "clang -w foo.o -o foo". Other warning options are already
5973 // handled somewhere else.
5974 Args.ClaimAllArgs(options::OPT_w);
5975
5976 if (!D.SysRoot.empty())
5977 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5978
5979 // CloudABI only supports static linkage.
5980 CmdArgs.push_back("-Bstatic");
5981 CmdArgs.push_back("--eh-frame-hdr");
5982 CmdArgs.push_back("--gc-sections");
5983
5984 if (Output.isFilename()) {
5985 CmdArgs.push_back("-o");
5986 CmdArgs.push_back(Output.getFilename());
5987 } else {
5988 assert(Output.isNothing() && "Invalid output.");
5989 }
5990
5991 if (!Args.hasArg(options::OPT_nostdlib) &&
5992 !Args.hasArg(options::OPT_nostartfiles)) {
5993 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5994 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5995 }
5996
5997 Args.AddAllArgs(CmdArgs, options::OPT_L);
5998 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
5999 for (const auto &Path : Paths)
6000 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
6001 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6002 Args.AddAllArgs(CmdArgs, options::OPT_e);
6003 Args.AddAllArgs(CmdArgs, options::OPT_s);
6004 Args.AddAllArgs(CmdArgs, options::OPT_t);
6005 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6006 Args.AddAllArgs(CmdArgs, options::OPT_r);
6007
Alexey Samsonov907880e2015-06-19 19:57:46 +00006008 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006009 AddGoldPlugin(ToolChain, Args, CmdArgs);
6010
6011 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6012
6013 if (!Args.hasArg(options::OPT_nostdlib) &&
6014 !Args.hasArg(options::OPT_nodefaultlibs)) {
6015 if (D.CCCIsCXX())
6016 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6017 CmdArgs.push_back("-lc");
6018 CmdArgs.push_back("-lcompiler_rt");
6019 }
6020
6021 if (!Args.hasArg(options::OPT_nostdlib) &&
6022 !Args.hasArg(options::OPT_nostartfiles))
6023 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6024
6025 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
6026 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
6027}
6028
Douglas Katzman95354292015-06-23 20:42:09 +00006029void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6030 const InputInfo &Output,
6031 const InputInfoList &Inputs,
6032 const ArgList &Args,
6033 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006034 ArgStringList CmdArgs;
6035
6036 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6037 const InputInfo &Input = Inputs[0];
6038
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006039 // Determine the original source input.
6040 const Action *SourceAction = &JA;
6041 while (SourceAction->getKind() != Action::InputClass) {
6042 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6043 SourceAction = SourceAction->getInputs()[0];
6044 }
6045
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006046 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006047 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006048 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6049 // FIXME: at run-time detect assembler capabilities or rely on version
6050 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006051 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006052 const llvm::Triple &T(getToolChain().getTriple());
6053 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006054 CmdArgs.push_back("-Q");
6055 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006056
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006057 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006058 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006059 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006060 if (Args.hasArg(options::OPT_gstabs))
6061 CmdArgs.push_back("--gstabs");
6062 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006063 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006064 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006065
Daniel Dunbarbe220842009-03-20 16:06:39 +00006066 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006067 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006068
Daniel Dunbar6d484762010-07-22 01:47:22 +00006069 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006070 if (getToolChain().getArch() == llvm::Triple::x86 ||
6071 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006072 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6073 CmdArgs.push_back("-force_cpusubtype_ALL");
6074
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006075 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006076 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006077 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006078 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006079 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006080 CmdArgs.push_back("-static");
6081
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006082 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006083
6084 assert(Output.isFilename() && "Unexpected lipo output.");
6085 CmdArgs.push_back("-o");
6086 CmdArgs.push_back(Output.getFilename());
6087
Daniel Dunbarb440f562010-08-02 02:38:21 +00006088 assert(Input.isFilename() && "Invalid input.");
6089 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006090
6091 // asm_final spec is empty.
6092
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006093 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006094 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006095}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006096
Tim Northover157d9112014-01-16 08:48:16 +00006097void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006098
Tim Northover157d9112014-01-16 08:48:16 +00006099void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6100 ArgStringList &CmdArgs) const {
6101 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006102
Daniel Dunbarc1964212009-03-26 16:23:12 +00006103 // Derived from darwin_arch spec.
6104 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006105 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006106
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006107 // FIXME: Is this needed anymore?
6108 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006109 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006110}
6111
Douglas Katzman95354292015-06-23 20:42:09 +00006112bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006113 // We only need to generate a temp path for LTO if we aren't compiling object
6114 // files. When compiling source files, we run 'dsymutil' after linking. We
6115 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006116 for (const auto &Input : Inputs)
6117 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006118 return true;
6119
6120 return false;
6121}
6122
Douglas Katzman95354292015-06-23 20:42:09 +00006123void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6124 ArgStringList &CmdArgs,
6125 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006126 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006127 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006128
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006129 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006130 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6131 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006132 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6133 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006134 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006135 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006136 }
6137
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006138 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006139 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006140 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6141 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006142
Bob Wilson3d27dad2013-08-02 22:25:34 +00006143 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6144 CmdArgs.push_back("-export_dynamic");
6145
Bob Wilsonb111ec92015-03-02 19:01:14 +00006146 // If we are using App Extension restrictions, pass a flag to the linker
6147 // telling it that the compiled code has been audited.
6148 if (Args.hasFlag(options::OPT_fapplication_extension,
6149 options::OPT_fno_application_extension, false))
6150 CmdArgs.push_back("-application_extension");
6151
Bill Wendling313b6bf2012-11-16 23:03:00 +00006152 // If we are using LTO, then automatically create a temporary file path for
6153 // the linker to use, so that it's lifetime will extend past a possible
6154 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006155 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006156 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006157 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006158 C.addTempFile(TmpPath);
6159 CmdArgs.push_back("-object_path_lto");
6160 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006161 }
6162
Daniel Dunbarc1964212009-03-26 16:23:12 +00006163 // Derived from the "link" spec.
6164 Args.AddAllArgs(CmdArgs, options::OPT_static);
6165 if (!Args.hasArg(options::OPT_static))
6166 CmdArgs.push_back("-dynamic");
6167 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6168 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6169 // here. How do we wish to handle such things?
6170 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006171
Daniel Dunbarc1964212009-03-26 16:23:12 +00006172 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006173 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006174 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006175 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006176
6177 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6178 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6179 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6180
6181 Arg *A;
6182 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6183 (A = Args.getLastArg(options::OPT_current__version)) ||
6184 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006185 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6186 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006187
6188 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6189 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6190 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6191 } else {
6192 CmdArgs.push_back("-dylib");
6193
6194 Arg *A;
6195 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6196 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6197 (A = Args.getLastArg(options::OPT_client__name)) ||
6198 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6199 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6200 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006201 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6202 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006203
Daniel Dunbarc1964212009-03-26 16:23:12 +00006204 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6205 "-dylib_compatibility_version");
6206 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6207 "-dylib_current_version");
6208
Tim Northover157d9112014-01-16 08:48:16 +00006209 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006210
6211 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6212 "-dylib_install_name");
6213 }
6214
6215 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6216 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6217 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006218 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006219 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006220 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6221 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6222 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6223 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6224 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6225 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006226 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006227 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6228 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6229 Args.AddAllArgs(CmdArgs, options::OPT_init);
6230
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006231 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006232 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006233
Daniel Dunbarc1964212009-03-26 16:23:12 +00006234 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6235 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6236 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6237 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6238 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006239
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006240 if (const Arg *A =
6241 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6242 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006243 if (A->getOption().matches(options::OPT_fpie) ||
6244 A->getOption().matches(options::OPT_fPIE))
6245 CmdArgs.push_back("-pie");
6246 else
6247 CmdArgs.push_back("-no_pie");
6248 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006249
6250 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6251 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6252 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6253 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6254 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6255 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6256 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6257 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6258 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6259 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6260 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6261 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6262 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6263 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6264 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6265 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006266
Daniel Dunbar84384642011-05-02 21:03:47 +00006267 // Give --sysroot= preference, over the Apple specific behavior to also use
6268 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006269 StringRef sysroot = C.getSysRoot();
6270 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006271 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006272 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006273 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6274 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006275 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006276 }
6277
Daniel Dunbarc1964212009-03-26 16:23:12 +00006278 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6279 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6280 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6281 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6282 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006283 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006284 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6285 Args.AddAllArgs(CmdArgs, options::OPT_y);
6286 Args.AddLastArg(CmdArgs, options::OPT_w);
6287 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6288 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6289 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6290 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6291 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6292 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6293 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6294 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6295 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6296 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6297 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6298 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6299}
6300
Douglas Katzman95354292015-06-23 20:42:09 +00006301void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6302 const InputInfo &Output,
6303 const InputInfoList &Inputs,
6304 const ArgList &Args,
6305 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006306 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006307
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006308 // If the number of arguments surpasses the system limits, we will encode the
6309 // input files in a separate file, shortening the command line. To this end,
6310 // build a list of input file names that can be passed via a file with the
6311 // -filelist linker option.
6312 llvm::opt::ArgStringList InputFileList;
6313
Daniel Dunbarc1964212009-03-26 16:23:12 +00006314 // The logic here is derived from gcc's behavior; most of which
6315 // comes from specs (starting with link_command). Consult gcc for
6316 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006317 ArgStringList CmdArgs;
6318
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006319 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6320 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6321 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006322 for (const auto &Arg : Args)
6323 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006324 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006325 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006326 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006327 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006328 return;
6329 }
6330
Daniel Dunbarc1964212009-03-26 16:23:12 +00006331 // I'm not sure why this particular decomposition exists in gcc, but
6332 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006333 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006334
Daniel Dunbarc1964212009-03-26 16:23:12 +00006335 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6336 Args.AddAllArgs(CmdArgs, options::OPT_s);
6337 Args.AddAllArgs(CmdArgs, options::OPT_t);
6338 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6339 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006340 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006341 Args.AddAllArgs(CmdArgs, options::OPT_r);
6342
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006343 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6344 // members of static archive libraries which implement Objective-C classes or
6345 // categories.
6346 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6347 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006348
Daniel Dunbarc1964212009-03-26 16:23:12 +00006349 CmdArgs.push_back("-o");
6350 CmdArgs.push_back(Output.getFilename());
6351
Chad Rosier06fd3c62012-05-16 23:45:12 +00006352 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006353 !Args.hasArg(options::OPT_nostartfiles))
6354 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006355
Peter Collingbournec4122c12015-06-15 21:08:13 +00006356 // SafeStack requires its own runtime libraries
6357 // These libraries should be linked first, to make sure the
6358 // __safestack_init constructor executes before everything else
6359 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6360 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6361 "libclang_rt.safestack_osx.a",
6362 /*AlwaysLink=*/true);
6363 }
6364
Daniel Dunbarc1964212009-03-26 16:23:12 +00006365 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006366
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006367 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6368 options::OPT_fno_openmp, false)) {
6369 switch (getOpenMPRuntime(getToolChain(), Args)) {
6370 case OMPRT_OMP:
6371 CmdArgs.push_back("-lomp");
6372 break;
6373 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006374 CmdArgs.push_back("-lgomp");
6375 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006376 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006377 CmdArgs.push_back("-liomp5");
6378 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006379 case OMPRT_Unknown:
6380 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006381 break;
6382 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006383 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006384
Douglas Gregor9295df02012-05-15 21:00:27 +00006385 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006386 // Build the input file for -filelist (list of linker input files) in case we
6387 // need it later
6388 for (const auto &II : Inputs) {
6389 if (!II.isFilename()) {
6390 // This is a linker input argument.
6391 // We cannot mix input arguments and file names in a -filelist input, thus
6392 // we prematurely stop our list (remaining files shall be passed as
6393 // arguments).
6394 if (InputFileList.size() > 0)
6395 break;
6396
6397 continue;
6398 }
6399
6400 InputFileList.push_back(II.getFilename());
6401 }
6402
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006403 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006404 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006405 // We use arclite library for both ARC and subscripting support.
6406 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6407
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006408 CmdArgs.push_back("-framework");
6409 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006410 // Link libobj.
6411 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006412 }
John McCall31168b02011-06-15 23:02:42 +00006413
Daniel Dunbarc1964212009-03-26 16:23:12 +00006414 if (LinkingOutput) {
6415 CmdArgs.push_back("-arch_multiple");
6416 CmdArgs.push_back("-final_output");
6417 CmdArgs.push_back(LinkingOutput);
6418 }
6419
Daniel Dunbarc1964212009-03-26 16:23:12 +00006420 if (Args.hasArg(options::OPT_fnested_functions))
6421 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006422
Justin Bognerc7701242015-05-12 05:44:36 +00006423 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6424 // paths are different enough from other toolchains that this needs a fair
6425 // amount of refactoring done first.
6426 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6427
Daniel Dunbarc1964212009-03-26 16:23:12 +00006428 if (!Args.hasArg(options::OPT_nostdlib) &&
6429 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006430 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006431 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006432
Daniel Dunbarc1964212009-03-26 16:23:12 +00006433 // link_ssp spec is empty.
6434
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006435 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006436 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006437 }
6438
Chad Rosier06fd3c62012-05-16 23:45:12 +00006439 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006440 !Args.hasArg(options::OPT_nostartfiles)) {
6441 // endfile_spec is empty.
6442 }
6443
6444 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6445 Args.AddAllArgs(CmdArgs, options::OPT_F);
6446
Steven Wu3ffb61b2015-02-06 18:08:29 +00006447 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006448 for (const Arg *A : Args.filtered(options::OPT_iframework))
6449 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006450
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006451 if (!Args.hasArg(options::OPT_nostdlib) &&
6452 !Args.hasArg(options::OPT_nodefaultlibs)) {
6453 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6454 if (A->getValue() == StringRef("Accelerate")) {
6455 CmdArgs.push_back("-framework");
6456 CmdArgs.push_back("Accelerate");
6457 }
6458 }
6459 }
6460
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006461 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006462 std::unique_ptr<Command> Cmd =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006463 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006464 Cmd->setInputFileList(std::move(InputFileList));
6465 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006466}
6467
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006468void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006469 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006470 const InputInfoList &Inputs,
6471 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006472 const char *LinkingOutput) const {
6473 ArgStringList CmdArgs;
6474
6475 CmdArgs.push_back("-create");
6476 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006477
6478 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006479 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006480
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006481 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006482 assert(II.isFilename() && "Unexpected lipo input.");
6483 CmdArgs.push_back(II.getFilename());
6484 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006485
6486 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006487 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006488}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006489
Daniel Dunbar88299622010-06-04 18:28:36 +00006490void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006491 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006492 const InputInfoList &Inputs,
6493 const ArgList &Args,
6494 const char *LinkingOutput) const {
6495 ArgStringList CmdArgs;
6496
Daniel Dunbareb86b042011-05-09 17:23:16 +00006497 CmdArgs.push_back("-o");
6498 CmdArgs.push_back(Output.getFilename());
6499
Daniel Dunbar88299622010-06-04 18:28:36 +00006500 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6501 const InputInfo &Input = Inputs[0];
6502 assert(Input.isFilename() && "Unexpected dsymutil input.");
6503 CmdArgs.push_back(Input.getFilename());
6504
Daniel Dunbar88299622010-06-04 18:28:36 +00006505 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006506 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006507 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006508}
6509
Eric Christopher551ef452011-08-23 17:56:55 +00006510void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006511 const InputInfo &Output,
6512 const InputInfoList &Inputs,
6513 const ArgList &Args,
6514 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006515 ArgStringList CmdArgs;
6516 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006517 CmdArgs.push_back("--debug-info");
6518 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006519 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006520
6521 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6522 const InputInfo &Input = Inputs[0];
6523 assert(Input.isFilename() && "Unexpected verify input");
6524
6525 // Grabbing the output of the earlier dsymutil run.
6526 CmdArgs.push_back(Input.getFilename());
6527
6528 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006529 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006530 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006531}
6532
Douglas Katzman95354292015-06-23 20:42:09 +00006533void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006534 const InputInfo &Output,
6535 const InputInfoList &Inputs,
6536 const ArgList &Args,
6537 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006538 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006539 ArgStringList CmdArgs;
6540
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006541 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006542
6543 CmdArgs.push_back("-o");
6544 CmdArgs.push_back(Output.getFilename());
6545
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006546 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006547 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006548
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006549 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006550 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006551}
6552
Douglas Katzman95354292015-06-23 20:42:09 +00006553void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6554 const InputInfo &Output,
6555 const InputInfoList &Inputs,
6556 const ArgList &Args,
6557 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006558 // FIXME: Find a real GCC, don't hard-code versions here
6559 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6560 const llvm::Triple &T = getToolChain().getTriple();
6561 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006562 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006563 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006564 case llvm::Triple::x86:
6565 GCCLibPath +=
6566 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6567 break;
6568 case llvm::Triple::x86_64:
6569 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6570 GCCLibPath += "/4.5.2/amd64/";
6571 LibPath += "amd64/";
6572 break;
6573 default:
6574 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006575 }
6576
6577 ArgStringList CmdArgs;
6578
David Chisnall272a0712012-02-29 15:06:12 +00006579 // Demangle C++ names in errors
6580 CmdArgs.push_back("-C");
6581
David Chisnallf571cde2012-02-15 13:39:01 +00006582 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6583 (!Args.hasArg(options::OPT_shared))) {
6584 CmdArgs.push_back("-e");
6585 CmdArgs.push_back("_start");
6586 }
6587
6588 if (Args.hasArg(options::OPT_static)) {
6589 CmdArgs.push_back("-Bstatic");
6590 CmdArgs.push_back("-dn");
6591 } else {
6592 CmdArgs.push_back("-Bdynamic");
6593 if (Args.hasArg(options::OPT_shared)) {
6594 CmdArgs.push_back("-shared");
6595 } else {
6596 CmdArgs.push_back("--dynamic-linker");
6597 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6598 }
6599 }
6600
6601 if (Output.isFilename()) {
6602 CmdArgs.push_back("-o");
6603 CmdArgs.push_back(Output.getFilename());
6604 } else {
6605 assert(Output.isNothing() && "Invalid output.");
6606 }
6607
6608 if (!Args.hasArg(options::OPT_nostdlib) &&
6609 !Args.hasArg(options::OPT_nostartfiles)) {
6610 if (!Args.hasArg(options::OPT_shared)) {
6611 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6612 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006613 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006614 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6615 } else {
6616 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006617 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6618 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006619 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006620 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006621 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006622 }
6623
6624 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6625
6626 Args.AddAllArgs(CmdArgs, options::OPT_L);
6627 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6628 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006629 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006630
6631 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6632
6633 if (!Args.hasArg(options::OPT_nostdlib) &&
6634 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006635 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006636 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006637 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006638 if (!Args.hasArg(options::OPT_shared)) {
6639 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006640 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006641 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006642 }
David Chisnallf571cde2012-02-15 13:39:01 +00006643 }
6644
6645 if (!Args.hasArg(options::OPT_nostdlib) &&
6646 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006647 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006648 }
David Chisnall96de9932012-02-16 16:00:47 +00006649 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006650
Alexey Samsonov7811d192014-02-20 13:57:37 +00006651 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006653 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006654 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006655}
6656
Douglas Katzman95354292015-06-23 20:42:09 +00006657void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6658 const InputInfo &Output,
6659 const InputInfoList &Inputs,
6660 const ArgList &Args,
6661 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006662 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006663 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006664 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006665
Rafael Espindolacc126272014-02-28 01:55:21 +00006666 switch (getToolChain().getArch()) {
6667 case llvm::Triple::x86:
6668 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6669 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006670 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006671 break;
6672
6673 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006674 CmdArgs.push_back("-mppc");
6675 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006676 break;
6677
6678 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006679 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006680 CmdArgs.push_back("-32");
6681 NeedsKPIC = true;
6682 break;
6683
6684 case llvm::Triple::sparcv9:
6685 CmdArgs.push_back("-64");
6686 CmdArgs.push_back("-Av9a");
6687 NeedsKPIC = true;
6688 break;
6689
6690 case llvm::Triple::mips64:
6691 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006692 StringRef CPUName;
6693 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006694 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006695
6696 CmdArgs.push_back("-mabi");
6697 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6698
6699 if (getToolChain().getArch() == llvm::Triple::mips64)
6700 CmdArgs.push_back("-EB");
6701 else
6702 CmdArgs.push_back("-EL");
6703
Rafael Espindolacc126272014-02-28 01:55:21 +00006704 NeedsKPIC = true;
6705 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006706 }
6707
Rafael Espindolacc126272014-02-28 01:55:21 +00006708 default:
6709 break;
6710 }
6711
6712 if (NeedsKPIC)
6713 addAssemblerKPIC(Args, CmdArgs);
6714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006715 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006716
6717 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006718 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006719
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006720 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006721 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006722
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006723 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006724 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006725}
6726
Douglas Katzman95354292015-06-23 20:42:09 +00006727void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6728 const InputInfo &Output,
6729 const InputInfoList &Inputs,
6730 const ArgList &Args,
6731 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006732 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006733 ArgStringList CmdArgs;
6734
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006735 // Silence warning for "clang -g foo.o -o foo"
6736 Args.ClaimAllArgs(options::OPT_g_Group);
6737 // and "clang -emit-llvm foo.o -o foo"
6738 Args.ClaimAllArgs(options::OPT_emit_llvm);
6739 // and for "clang -w foo.o -o foo". Other warning options are already
6740 // handled somewhere else.
6741 Args.ClaimAllArgs(options::OPT_w);
6742
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006743 if (getToolChain().getArch() == llvm::Triple::mips64)
6744 CmdArgs.push_back("-EB");
6745 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6746 CmdArgs.push_back("-EL");
6747
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006748 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006749 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006750 CmdArgs.push_back("-e");
6751 CmdArgs.push_back("__start");
6752 }
6753
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006754 if (Args.hasArg(options::OPT_static)) {
6755 CmdArgs.push_back("-Bstatic");
6756 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006757 if (Args.hasArg(options::OPT_rdynamic))
6758 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006759 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006760 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006761 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006762 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006763 } else {
6764 CmdArgs.push_back("-dynamic-linker");
6765 CmdArgs.push_back("/usr/libexec/ld.so");
6766 }
6767 }
6768
Rafael Espindola044f7832013-06-05 04:28:55 +00006769 if (Args.hasArg(options::OPT_nopie))
6770 CmdArgs.push_back("-nopie");
6771
Daniel Dunbarb440f562010-08-02 02:38:21 +00006772 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006773 CmdArgs.push_back("-o");
6774 CmdArgs.push_back(Output.getFilename());
6775 } else {
6776 assert(Output.isNothing() && "Invalid output.");
6777 }
6778
6779 if (!Args.hasArg(options::OPT_nostdlib) &&
6780 !Args.hasArg(options::OPT_nostartfiles)) {
6781 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006782 if (Args.hasArg(options::OPT_pg))
6783 CmdArgs.push_back(
6784 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00006785 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006786 CmdArgs.push_back(
6787 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6788 CmdArgs.push_back(
6789 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006790 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006791 CmdArgs.push_back(
6792 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006793 }
6794 }
6795
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006796 std::string Triple = getToolChain().getTripleString();
6797 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006798 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006799 CmdArgs.push_back(
6800 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006801
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006802 Args.AddAllArgs(CmdArgs, options::OPT_L);
6803 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6804 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006805 Args.AddAllArgs(CmdArgs, options::OPT_s);
6806 Args.AddAllArgs(CmdArgs, options::OPT_t);
6807 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6808 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006809
Daniel Dunbar54423b22010-09-17 00:24:54 +00006810 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006811
6812 if (!Args.hasArg(options::OPT_nostdlib) &&
6813 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006814 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006815 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006816 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006817 CmdArgs.push_back("-lm_p");
6818 else
6819 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006820 }
6821
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006822 // FIXME: For some reason GCC passes -lgcc before adding
6823 // the default system libraries. Just mimic this for now.
6824 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006825
Eric Christopher17674ec2012-09-13 06:32:34 +00006826 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006827 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
6828 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00006829 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006830 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00006831 }
6832
Chandler Carruth45661652011-12-17 22:32:42 +00006833 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006834 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006835 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00006836 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006837 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006838 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006839
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006840 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006841 }
6842
6843 if (!Args.hasArg(options::OPT_nostdlib) &&
6844 !Args.hasArg(options::OPT_nostartfiles)) {
6845 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006846 CmdArgs.push_back(
6847 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006848 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006849 CmdArgs.push_back(
6850 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006851 }
6852
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006853 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006855}
Ed Schoutene33194b2009-04-02 19:13:12 +00006856
Douglas Katzman95354292015-06-23 20:42:09 +00006857void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6858 const InputInfo &Output,
6859 const InputInfoList &Inputs,
6860 const ArgList &Args,
6861 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006862 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006863 ArgStringList CmdArgs;
6864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006865 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00006866
6867 CmdArgs.push_back("-o");
6868 CmdArgs.push_back(Output.getFilename());
6869
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006870 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006871 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006872
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006873 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006874 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006875}
6876
Douglas Katzman95354292015-06-23 20:42:09 +00006877void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6878 const InputInfo &Output,
6879 const InputInfoList &Inputs,
6880 const ArgList &Args,
6881 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00006882 const Driver &D = getToolChain().getDriver();
6883 ArgStringList CmdArgs;
6884
6885 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6886 (!Args.hasArg(options::OPT_shared))) {
6887 CmdArgs.push_back("-e");
6888 CmdArgs.push_back("__start");
6889 }
6890
6891 if (Args.hasArg(options::OPT_static)) {
6892 CmdArgs.push_back("-Bstatic");
6893 } else {
6894 if (Args.hasArg(options::OPT_rdynamic))
6895 CmdArgs.push_back("-export-dynamic");
6896 CmdArgs.push_back("--eh-frame-hdr");
6897 CmdArgs.push_back("-Bdynamic");
6898 if (Args.hasArg(options::OPT_shared)) {
6899 CmdArgs.push_back("-shared");
6900 } else {
6901 CmdArgs.push_back("-dynamic-linker");
6902 CmdArgs.push_back("/usr/libexec/ld.so");
6903 }
6904 }
6905
6906 if (Output.isFilename()) {
6907 CmdArgs.push_back("-o");
6908 CmdArgs.push_back(Output.getFilename());
6909 } else {
6910 assert(Output.isNothing() && "Invalid output.");
6911 }
6912
6913 if (!Args.hasArg(options::OPT_nostdlib) &&
6914 !Args.hasArg(options::OPT_nostartfiles)) {
6915 if (!Args.hasArg(options::OPT_shared)) {
6916 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006917 CmdArgs.push_back(
6918 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006919 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006920 CmdArgs.push_back(
6921 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6922 CmdArgs.push_back(
6923 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006924 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006925 CmdArgs.push_back(
6926 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006927 }
6928 }
6929
6930 Args.AddAllArgs(CmdArgs, options::OPT_L);
6931 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6932 Args.AddAllArgs(CmdArgs, options::OPT_e);
6933
6934 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6935
6936 if (!Args.hasArg(options::OPT_nostdlib) &&
6937 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006938 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006939 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6940 if (Args.hasArg(options::OPT_pg))
6941 CmdArgs.push_back("-lm_p");
6942 else
6943 CmdArgs.push_back("-lm");
6944 }
6945
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006946 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006947 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006948 CmdArgs.push_back("-lpthread_p");
6949 else
6950 CmdArgs.push_back("-lpthread");
6951 }
6952
Eli Friedman9fa28852012-08-08 23:57:20 +00006953 if (!Args.hasArg(options::OPT_shared)) {
6954 if (Args.hasArg(options::OPT_pg))
6955 CmdArgs.push_back("-lc_p");
6956 else
6957 CmdArgs.push_back("-lc");
6958 }
6959
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006960 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006961 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006962 case llvm::Triple::arm:
6963 MyArch = "arm";
6964 break;
6965 case llvm::Triple::x86:
6966 MyArch = "i386";
6967 break;
6968 case llvm::Triple::x86_64:
6969 MyArch = "amd64";
6970 break;
6971 default:
6972 llvm_unreachable("Unsupported architecture");
6973 }
6974 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006975 }
6976
6977 if (!Args.hasArg(options::OPT_nostdlib) &&
6978 !Args.hasArg(options::OPT_nostartfiles)) {
6979 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006980 CmdArgs.push_back(
6981 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006982 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006983 CmdArgs.push_back(
6984 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006985 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006986
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006987 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006988 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006989}
6990
Douglas Katzman95354292015-06-23 20:42:09 +00006991void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6992 const InputInfo &Output,
6993 const InputInfoList &Inputs,
6994 const ArgList &Args,
6995 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006996 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006997 ArgStringList CmdArgs;
6998
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006999 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7000 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007001 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007002 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007003 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007004 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007005 else if (getToolChain().getArch() == llvm::Triple::mips ||
7006 getToolChain().getArch() == llvm::Triple::mipsel ||
7007 getToolChain().getArch() == llvm::Triple::mips64 ||
7008 getToolChain().getArch() == llvm::Triple::mips64el) {
7009 StringRef CPUName;
7010 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007011 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007012
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007013 CmdArgs.push_back("-march");
7014 CmdArgs.push_back(CPUName.data());
7015
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007016 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007017 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007018
7019 if (getToolChain().getArch() == llvm::Triple::mips ||
7020 getToolChain().getArch() == llvm::Triple::mips64)
7021 CmdArgs.push_back("-EB");
7022 else
7023 CmdArgs.push_back("-EL");
7024
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007025 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007026 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007027 getToolChain().getArch() == llvm::Triple::armeb ||
7028 getToolChain().getArch() == llvm::Triple::thumb ||
7029 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007030 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007031 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007032 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7033
7034 if (FloatABI == "hard") {
7035 CmdArgs.push_back("-mfpu=vfp");
7036 } else {
7037 CmdArgs.push_back("-mfpu=softvfp");
7038 }
7039
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007040 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007041 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007042 case llvm::Triple::GNUEABI:
7043 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007044 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007045 break;
7046
7047 default:
7048 CmdArgs.push_back("-matpcs");
7049 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007050 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007051 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007052 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007053 if (getToolChain().getArch() == llvm::Triple::sparc)
7054 CmdArgs.push_back("-Av8plusa");
7055 else
7056 CmdArgs.push_back("-Av9a");
7057
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007058 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007059 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007060
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007061 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007062
7063 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007064 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007065
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007066 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007067 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007068
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007069 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007070 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007071}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007072
Douglas Katzman95354292015-06-23 20:42:09 +00007073void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7074 const InputInfo &Output,
7075 const InputInfoList &Inputs,
7076 const ArgList &Args,
7077 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007078 const toolchains::FreeBSD &ToolChain =
7079 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007080 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007081 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007082 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007083 !Args.hasArg(options::OPT_shared) &&
7084 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007085 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007086
7087 // Silence warning for "clang -g foo.o -o foo"
7088 Args.ClaimAllArgs(options::OPT_g_Group);
7089 // and "clang -emit-llvm foo.o -o foo"
7090 Args.ClaimAllArgs(options::OPT_emit_llvm);
7091 // and for "clang -w foo.o -o foo". Other warning options are already
7092 // handled somewhere else.
7093 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007094
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007095 if (!D.SysRoot.empty())
7096 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7097
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007098 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007099 CmdArgs.push_back("-pie");
7100
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007101 if (Args.hasArg(options::OPT_static)) {
7102 CmdArgs.push_back("-Bstatic");
7103 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007104 if (Args.hasArg(options::OPT_rdynamic))
7105 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007106 CmdArgs.push_back("--eh-frame-hdr");
7107 if (Args.hasArg(options::OPT_shared)) {
7108 CmdArgs.push_back("-Bshareable");
7109 } else {
7110 CmdArgs.push_back("-dynamic-linker");
7111 CmdArgs.push_back("/libexec/ld-elf.so.1");
7112 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007113 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007114 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7115 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7116 CmdArgs.push_back("--hash-style=both");
7117 }
7118 }
7119 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007120 }
7121
7122 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7123 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007124 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007125 CmdArgs.push_back("-m");
7126 CmdArgs.push_back("elf_i386_fbsd");
7127 }
7128
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007129 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007130 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007131 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007132 }
7133
Daniel Dunbarb440f562010-08-02 02:38:21 +00007134 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007135 CmdArgs.push_back("-o");
7136 CmdArgs.push_back(Output.getFilename());
7137 } else {
7138 assert(Output.isNothing() && "Invalid output.");
7139 }
7140
7141 if (!Args.hasArg(options::OPT_nostdlib) &&
7142 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007143 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007144 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007145 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007146 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007147 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007148 crt1 = "Scrt1.o";
7149 else
7150 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007151 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007152 if (crt1)
7153 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7154
7155 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7156
Craig Topper92fc2df2014-05-17 16:56:41 +00007157 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007158 if (Args.hasArg(options::OPT_static))
7159 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007160 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007161 crtbegin = "crtbeginS.o";
7162 else
7163 crtbegin = "crtbegin.o";
7164
7165 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007166 }
7167
7168 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007169 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007170 for (const auto &Path : Paths)
7171 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007172 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7173 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007174 Args.AddAllArgs(CmdArgs, options::OPT_s);
7175 Args.AddAllArgs(CmdArgs, options::OPT_t);
7176 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7177 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007178
Alexey Samsonov907880e2015-06-19 19:57:46 +00007179 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007180 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007181
Alexey Samsonov52550342014-09-15 19:58:40 +00007182 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007183 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007184
7185 if (!Args.hasArg(options::OPT_nostdlib) &&
7186 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007187 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007188 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007189 if (Args.hasArg(options::OPT_pg))
7190 CmdArgs.push_back("-lm_p");
7191 else
7192 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007193 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007194 if (NeedsSanitizerDeps)
7195 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007196 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7197 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007198 if (Args.hasArg(options::OPT_pg))
7199 CmdArgs.push_back("-lgcc_p");
7200 else
7201 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007202 if (Args.hasArg(options::OPT_static)) {
7203 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007204 } else if (Args.hasArg(options::OPT_pg)) {
7205 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007206 } else {
7207 CmdArgs.push_back("--as-needed");
7208 CmdArgs.push_back("-lgcc_s");
7209 CmdArgs.push_back("--no-as-needed");
7210 }
7211
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007212 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007213 if (Args.hasArg(options::OPT_pg))
7214 CmdArgs.push_back("-lpthread_p");
7215 else
7216 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007217 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007218
Roman Divacky66f22762011-02-10 16:59:40 +00007219 if (Args.hasArg(options::OPT_pg)) {
7220 if (Args.hasArg(options::OPT_shared))
7221 CmdArgs.push_back("-lc");
7222 else
7223 CmdArgs.push_back("-lc_p");
7224 CmdArgs.push_back("-lgcc_p");
7225 } else {
7226 CmdArgs.push_back("-lc");
7227 CmdArgs.push_back("-lgcc");
7228 }
7229
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007230 if (Args.hasArg(options::OPT_static)) {
7231 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007232 } else if (Args.hasArg(options::OPT_pg)) {
7233 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007234 } else {
7235 CmdArgs.push_back("--as-needed");
7236 CmdArgs.push_back("-lgcc_s");
7237 CmdArgs.push_back("--no-as-needed");
7238 }
7239 }
7240
7241 if (!Args.hasArg(options::OPT_nostdlib) &&
7242 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007243 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007244 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007245 else
7246 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007247 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007248 }
7249
Alexey Samsonov7811d192014-02-20 13:57:37 +00007250 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007251
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007252 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007253 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007254}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007255
Douglas Katzman95354292015-06-23 20:42:09 +00007256void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007257 const InputInfo &Output,
7258 const InputInfoList &Inputs,
7259 const ArgList &Args,
7260 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007261 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007262 ArgStringList CmdArgs;
7263
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007264 // GNU as needs different flags for creating the correct output format
7265 // on architectures with different ABIs or optional feature sets.
7266 switch (getToolChain().getArch()) {
7267 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007268 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007269 break;
7270 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007271 case llvm::Triple::armeb:
7272 case llvm::Triple::thumb:
7273 case llvm::Triple::thumbeb: {
Gabor Ballabas208826c2015-06-04 17:56:32 +00007274 std::string MArch = arm::getARMTargetCPU(Args, getToolChain().getTriple());
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007275 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007276 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007277 }
7278
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007279 case llvm::Triple::mips:
7280 case llvm::Triple::mipsel:
7281 case llvm::Triple::mips64:
7282 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007283 StringRef CPUName;
7284 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007285 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007286
7287 CmdArgs.push_back("-march");
7288 CmdArgs.push_back(CPUName.data());
7289
7290 CmdArgs.push_back("-mabi");
7291 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7292
7293 if (getToolChain().getArch() == llvm::Triple::mips ||
7294 getToolChain().getArch() == llvm::Triple::mips64)
7295 CmdArgs.push_back("-EB");
7296 else
7297 CmdArgs.push_back("-EL");
7298
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007299 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007300 break;
7301 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007302
7303 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007304 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007305 CmdArgs.push_back("-32");
7306 addAssemblerKPIC(Args, CmdArgs);
7307 break;
7308
7309 case llvm::Triple::sparcv9:
7310 CmdArgs.push_back("-64");
7311 CmdArgs.push_back("-Av9");
7312 addAssemblerKPIC(Args, CmdArgs);
7313 break;
7314
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007315 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007316 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007317 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007318
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007319 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007320
7321 CmdArgs.push_back("-o");
7322 CmdArgs.push_back(Output.getFilename());
7323
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007324 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007325 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007326
David Chisnallddbd68f2011-09-27 22:03:18 +00007327 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007328 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007329}
7330
Douglas Katzman95354292015-06-23 20:42:09 +00007331void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7332 const InputInfo &Output,
7333 const InputInfoList &Inputs,
7334 const ArgList &Args,
7335 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007336 const Driver &D = getToolChain().getDriver();
7337 ArgStringList CmdArgs;
7338
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007339 if (!D.SysRoot.empty())
7340 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7341
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007342 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007343 if (Args.hasArg(options::OPT_static)) {
7344 CmdArgs.push_back("-Bstatic");
7345 } else {
7346 if (Args.hasArg(options::OPT_rdynamic))
7347 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007348 if (Args.hasArg(options::OPT_shared)) {
7349 CmdArgs.push_back("-Bshareable");
7350 } else {
7351 CmdArgs.push_back("-dynamic-linker");
7352 CmdArgs.push_back("/libexec/ld.elf_so");
7353 }
7354 }
7355
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007356 // Many NetBSD architectures support more than one ABI.
7357 // Determine the correct emulation for ld.
7358 switch (getToolChain().getArch()) {
7359 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007360 CmdArgs.push_back("-m");
7361 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007362 break;
7363 case llvm::Triple::arm:
7364 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007365 CmdArgs.push_back("-m");
7366 switch (getToolChain().getTriple().getEnvironment()) {
7367 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007368 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007369 CmdArgs.push_back("armelf_nbsd_eabi");
7370 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007371 case llvm::Triple::EABIHF:
7372 case llvm::Triple::GNUEABIHF:
7373 CmdArgs.push_back("armelf_nbsd_eabihf");
7374 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007375 default:
7376 CmdArgs.push_back("armelf_nbsd");
7377 break;
7378 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007379 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007380 case llvm::Triple::armeb:
7381 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007382 arm::appendEBLinkFlags(
7383 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007384 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007385 CmdArgs.push_back("-m");
7386 switch (getToolChain().getTriple().getEnvironment()) {
7387 case llvm::Triple::EABI:
7388 case llvm::Triple::GNUEABI:
7389 CmdArgs.push_back("armelfb_nbsd_eabi");
7390 break;
7391 case llvm::Triple::EABIHF:
7392 case llvm::Triple::GNUEABIHF:
7393 CmdArgs.push_back("armelfb_nbsd_eabihf");
7394 break;
7395 default:
7396 CmdArgs.push_back("armelfb_nbsd");
7397 break;
7398 }
7399 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007400 case llvm::Triple::mips64:
7401 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007402 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007403 CmdArgs.push_back("-m");
7404 if (getToolChain().getArch() == llvm::Triple::mips64)
7405 CmdArgs.push_back("elf32btsmip");
7406 else
7407 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007408 } else if (mips::hasMipsAbiArg(Args, "64")) {
7409 CmdArgs.push_back("-m");
7410 if (getToolChain().getArch() == llvm::Triple::mips64)
7411 CmdArgs.push_back("elf64btsmip");
7412 else
7413 CmdArgs.push_back("elf64ltsmip");
7414 }
7415 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007416 case llvm::Triple::ppc:
7417 CmdArgs.push_back("-m");
7418 CmdArgs.push_back("elf32ppc_nbsd");
7419 break;
7420
7421 case llvm::Triple::ppc64:
7422 case llvm::Triple::ppc64le:
7423 CmdArgs.push_back("-m");
7424 CmdArgs.push_back("elf64ppc");
7425 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007426
7427 case llvm::Triple::sparc:
7428 CmdArgs.push_back("-m");
7429 CmdArgs.push_back("elf32_sparc");
7430 break;
7431
7432 case llvm::Triple::sparcv9:
7433 CmdArgs.push_back("-m");
7434 CmdArgs.push_back("elf64_sparc");
7435 break;
7436
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007437 default:
7438 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007439 }
7440
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007441 if (Output.isFilename()) {
7442 CmdArgs.push_back("-o");
7443 CmdArgs.push_back(Output.getFilename());
7444 } else {
7445 assert(Output.isNothing() && "Invalid output.");
7446 }
7447
7448 if (!Args.hasArg(options::OPT_nostdlib) &&
7449 !Args.hasArg(options::OPT_nostartfiles)) {
7450 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007451 CmdArgs.push_back(
7452 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7453 CmdArgs.push_back(
7454 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7455 CmdArgs.push_back(
7456 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007457 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007458 CmdArgs.push_back(
7459 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7460 CmdArgs.push_back(
7461 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007462 }
7463 }
7464
7465 Args.AddAllArgs(CmdArgs, options::OPT_L);
7466 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7467 Args.AddAllArgs(CmdArgs, options::OPT_e);
7468 Args.AddAllArgs(CmdArgs, options::OPT_s);
7469 Args.AddAllArgs(CmdArgs, options::OPT_t);
7470 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7471 Args.AddAllArgs(CmdArgs, options::OPT_r);
7472
7473 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7474
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007475 unsigned Major, Minor, Micro;
7476 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7477 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007478 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007479 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007480 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007481 case llvm::Triple::arm:
7482 case llvm::Triple::armeb:
7483 case llvm::Triple::thumb:
7484 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007485 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007486 case llvm::Triple::ppc64:
7487 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007488 case llvm::Triple::x86:
7489 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007490 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007491 break;
7492 default:
7493 break;
7494 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007495 }
7496
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007497 if (!Args.hasArg(options::OPT_nostdlib) &&
7498 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007499 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007500 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7501 CmdArgs.push_back("-lm");
7502 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007503 if (Args.hasArg(options::OPT_pthread))
7504 CmdArgs.push_back("-lpthread");
7505 CmdArgs.push_back("-lc");
7506
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007507 if (useLibgcc) {
7508 if (Args.hasArg(options::OPT_static)) {
7509 // libgcc_eh depends on libc, so resolve as much as possible,
7510 // pull in any new requirements from libc and then get the rest
7511 // of libgcc.
7512 CmdArgs.push_back("-lgcc_eh");
7513 CmdArgs.push_back("-lc");
7514 CmdArgs.push_back("-lgcc");
7515 } else {
7516 CmdArgs.push_back("-lgcc");
7517 CmdArgs.push_back("--as-needed");
7518 CmdArgs.push_back("-lgcc_s");
7519 CmdArgs.push_back("--no-as-needed");
7520 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007521 }
7522 }
7523
7524 if (!Args.hasArg(options::OPT_nostdlib) &&
7525 !Args.hasArg(options::OPT_nostartfiles)) {
7526 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007527 CmdArgs.push_back(
7528 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007529 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007530 CmdArgs.push_back(
7531 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7532 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007533 }
7534
Alexey Samsonov7811d192014-02-20 13:57:37 +00007535 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007536
Logan Chieneb9162f2014-06-26 14:23:45 +00007537 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007538 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007539}
7540
Douglas Katzman95354292015-06-23 20:42:09 +00007541void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7542 const InputInfo &Output,
7543 const InputInfoList &Inputs,
7544 const ArgList &Args,
7545 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007546 claimNoWarnArgs(Args);
7547
Rafael Espindola92b00932010-08-10 00:25:48 +00007548 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007549 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007550
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007551 switch (getToolChain().getArch()) {
7552 default:
7553 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007554 // Add --32/--64 to make sure we get the format we want.
7555 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007556 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007557 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007558 break;
7559 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007560 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7561 CmdArgs.push_back("--x32");
7562 else
7563 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007564 break;
7565 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007566 CmdArgs.push_back("-a32");
7567 CmdArgs.push_back("-mppc");
7568 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007569 break;
7570 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007571 CmdArgs.push_back("-a64");
7572 CmdArgs.push_back("-mppc64");
7573 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007574 break;
7575 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007576 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007577 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007578 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007579 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007580 break;
7581 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007582 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007583 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007584 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007585 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007586 break;
7587 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007588 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007589 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007590 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007591 break;
7592 case llvm::Triple::arm:
7593 case llvm::Triple::armeb:
7594 case llvm::Triple::thumb:
7595 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007596 const llvm::Triple &Triple = getToolChain().getTriple();
7597 switch (Triple.getSubArch()) {
7598 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007599 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007600 break;
7601 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007602 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007603 break;
7604 default:
7605 break;
7606 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007607
Tim Northover9c7e0352013-12-12 11:55:52 +00007608 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007609 getToolChain().getDriver(), Args,
7610 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007611 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007612
7613 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007614
7615 // FIXME: remove krait check when GNU tools support krait cpu
7616 // for now replace it with -march=armv7-a to avoid a lower
7617 // march from being picked in the absence of a cpu flag.
7618 Arg *A;
7619 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007620 StringRef(A->getValue()).lower() == "krait")
7621 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007622 else
7623 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007624 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007625 break;
7626 }
7627 case llvm::Triple::mips:
7628 case llvm::Triple::mipsel:
7629 case llvm::Triple::mips64:
7630 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007631 StringRef CPUName;
7632 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007633 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007634 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007635
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007636 CmdArgs.push_back("-march");
7637 CmdArgs.push_back(CPUName.data());
7638
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007639 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007640 CmdArgs.push_back(ABIName.data());
7641
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007642 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7643 // or -mshared (not implemented) is in effect.
7644 bool IsPicOrPie = false;
7645 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7646 options::OPT_fpic, options::OPT_fno_pic,
7647 options::OPT_fPIE, options::OPT_fno_PIE,
7648 options::OPT_fpie, options::OPT_fno_pie)) {
7649 if (A->getOption().matches(options::OPT_fPIC) ||
7650 A->getOption().matches(options::OPT_fpic) ||
7651 A->getOption().matches(options::OPT_fPIE) ||
7652 A->getOption().matches(options::OPT_fpie))
7653 IsPicOrPie = true;
7654 }
7655 if (!IsPicOrPie)
7656 CmdArgs.push_back("-mno-shared");
7657
Daniel Sanders379d44b2014-07-16 11:52:23 +00007658 // LLVM doesn't support -mplt yet and acts as if it is always given.
7659 // However, -mplt has no effect with the N64 ABI.
7660 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007661
7662 if (getToolChain().getArch() == llvm::Triple::mips ||
7663 getToolChain().getArch() == llvm::Triple::mips64)
7664 CmdArgs.push_back("-EB");
7665 else
7666 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007667
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007668 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7669 if (StringRef(A->getValue()) == "2008")
7670 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7671 }
7672
Daniel Sanders379d44b2014-07-16 11:52:23 +00007673 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007674 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007675 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7676 options::OPT_mfp64)) {
7677 A->claim();
7678 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007679 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7680 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007681 CmdArgs.push_back("-mfpxx");
7682
7683 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7684 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007685 if (Arg *A =
7686 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007687 if (A->getOption().matches(options::OPT_mips16)) {
7688 A->claim();
7689 A->render(Args, CmdArgs);
7690 } else {
7691 A->claim();
7692 CmdArgs.push_back("-no-mips16");
7693 }
7694 }
7695
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007696 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7697 options::OPT_mno_micromips);
7698 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7699 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7700
Simon Atanasyanbd986632013-11-26 11:58:04 +00007701 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7702 // Do not use AddLastArg because not all versions of MIPS assembler
7703 // support -mmsa / -mno-msa options.
7704 if (A->getOption().matches(options::OPT_mmsa))
7705 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7706 }
7707
Daniel Sanders379d44b2014-07-16 11:52:23 +00007708 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7709 options::OPT_msoft_float);
7710
Toma Tabacub36d6102015-06-11 12:13:18 +00007711 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7712 options::OPT_msingle_float);
7713
Daniel Sanders379d44b2014-07-16 11:52:23 +00007714 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7715 options::OPT_mno_odd_spreg);
7716
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007717 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007718 break;
7719 }
7720 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007721 // Always pass an -march option, since our default of z10 is later
7722 // than the GNU assembler's default.
7723 StringRef CPUName = getSystemZTargetCPU(Args);
7724 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007725 break;
7726 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007727 }
7728
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007729 if (NeedsKPIC)
7730 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007731
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007732 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007733
7734 CmdArgs.push_back("-o");
7735 CmdArgs.push_back(Output.getFilename());
7736
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007737 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007738 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007739
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007740 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007741 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007742
7743 // Handle the debug info splitting at object creation time if we're
7744 // creating an object.
7745 // TODO: Currently only works on linux with newer objcopy.
7746 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007747 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007748 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007749 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007750}
7751
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007752static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007753 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007754 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007755 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7756 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007757 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007758 CmdArgs.push_back("-lgcc");
7759
Logan Chien3d3373c2012-11-19 12:04:11 +00007760 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007761 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007762 CmdArgs.push_back("-lgcc");
7763 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007764 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007765 CmdArgs.push_back("--as-needed");
7766 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007767 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007768 CmdArgs.push_back("--no-as-needed");
7769 }
7770
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007771 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007772 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007773 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007774 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007775
7776 // According to Android ABI, we have to link with libdl if we are
7777 // linking with non-static libgcc.
7778 //
7779 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7780 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7781 if (isAndroid && !StaticLibgcc)
7782 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007783}
7784
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007785static std::string getLinuxDynamicLinker(const ArgList &Args,
7786 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007787 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7788
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007789 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7790 if (ToolChain.getTriple().isArch64Bit())
7791 return "/system/bin/linker64";
7792 else
7793 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007794 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7795 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007796 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007797 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007798 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007799 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007800 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007801 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007802 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7803 return "/lib/ld-linux-armhf.so.3";
7804 else
7805 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007806 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7807 // TODO: check which dynamic linker name.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007808 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007809 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007810 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007811 return "/lib/ld-linux.so.3";
7812 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7813 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007814 StringRef CPUName;
7815 StringRef ABIName;
7816 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7817 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7818
7819 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7820 .Case("o32", "/lib")
7821 .Case("n32", "/lib32")
7822 .Case("n64", "/lib64")
7823 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007824 StringRef LibName;
7825 if (mips::isUCLibc(Args))
7826 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7827 else
7828 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007829
7830 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007831 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007832 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007833 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007834 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7835 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007836 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007837 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007838 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7839 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007840 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007841 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00007842 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007843 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007844 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007845 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00007846 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7847 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007848 else
7849 return "/lib64/ld-linux-x86-64.so.2";
7850}
7851
Renato Golinc4b49242014-02-13 10:01:16 +00007852static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007853 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007854 // Make use of compiler-rt if --rtlib option is used
7855 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7856
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007857 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007858 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007859 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007860 default:
7861 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007862 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007863 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007864 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007865 break;
7866 }
Renato Golinc4b49242014-02-13 10:01:16 +00007867 break;
7868 case ToolChain::RLT_Libgcc:
7869 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7870 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007871 }
7872}
7873
Rafael Espindola1e085772014-08-15 17:14:35 +00007874static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7875 switch (T.getArch()) {
7876 case llvm::Triple::x86:
7877 return "elf_i386";
7878 case llvm::Triple::aarch64:
7879 return "aarch64linux";
7880 case llvm::Triple::aarch64_be:
7881 return "aarch64_be_linux";
7882 case llvm::Triple::arm:
7883 case llvm::Triple::thumb:
7884 return "armelf_linux_eabi";
7885 case llvm::Triple::armeb:
7886 case llvm::Triple::thumbeb:
7887 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7888 case llvm::Triple::ppc:
7889 return "elf32ppclinux";
7890 case llvm::Triple::ppc64:
7891 return "elf64ppc";
7892 case llvm::Triple::ppc64le:
7893 return "elf64lppc";
7894 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007895 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007896 return "elf32_sparc";
7897 case llvm::Triple::sparcv9:
7898 return "elf64_sparc";
7899 case llvm::Triple::mips:
7900 return "elf32btsmip";
7901 case llvm::Triple::mipsel:
7902 return "elf32ltsmip";
7903 case llvm::Triple::mips64:
7904 if (mips::hasMipsAbiArg(Args, "n32"))
7905 return "elf32btsmipn32";
7906 return "elf64btsmip";
7907 case llvm::Triple::mips64el:
7908 if (mips::hasMipsAbiArg(Args, "n32"))
7909 return "elf32ltsmipn32";
7910 return "elf64ltsmip";
7911 case llvm::Triple::systemz:
7912 return "elf64_s390";
7913 case llvm::Triple::x86_64:
7914 if (T.getEnvironment() == llvm::Triple::GNUX32)
7915 return "elf32_x86_64";
7916 return "elf_x86_64";
7917 default:
7918 llvm_unreachable("Unexpected arch");
7919 }
7920}
7921
Douglas Katzman95354292015-06-23 20:42:09 +00007922void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7923 const InputInfo &Output,
7924 const InputInfoList &Inputs,
7925 const ArgList &Args,
7926 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007927 const toolchains::Linux &ToolChain =
7928 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007929 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007930 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007931 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007932 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007933 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007934 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
7935 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007936
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007937 ArgStringList CmdArgs;
7938
Rafael Espindolad1002f62010-11-15 18:28:16 +00007939 // Silence warning for "clang -g foo.o -o foo"
7940 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007941 // and "clang -emit-llvm foo.o -o foo"
7942 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007943 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007944 // handled somewhere else.
7945 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007946
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007947 if (!D.SysRoot.empty())
7948 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007949
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007950 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007951 CmdArgs.push_back("-pie");
7952
Rafael Espindola1c76c592010-11-07 22:57:16 +00007953 if (Args.hasArg(options::OPT_rdynamic))
7954 CmdArgs.push_back("-export-dynamic");
7955
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007956 if (Args.hasArg(options::OPT_s))
7957 CmdArgs.push_back("-s");
7958
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007959 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
7960 arm::appendEBLinkFlags(
7961 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007962 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007963
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007964 for (const auto &Opt : ToolChain.ExtraOpts)
7965 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007966
7967 if (!Args.hasArg(options::OPT_static)) {
7968 CmdArgs.push_back("--eh-frame-hdr");
7969 }
7970
7971 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007972 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007973
7974 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007975 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7976 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007977 CmdArgs.push_back("-Bstatic");
7978 else
7979 CmdArgs.push_back("-static");
7980 } else if (Args.hasArg(options::OPT_shared)) {
7981 CmdArgs.push_back("-shared");
7982 }
7983
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007984 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7985 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007986 (!Args.hasArg(options::OPT_static) &&
7987 !Args.hasArg(options::OPT_shared))) {
7988 CmdArgs.push_back("-dynamic-linker");
7989 CmdArgs.push_back(Args.MakeArgString(
7990 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7991 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007992
7993 CmdArgs.push_back("-o");
7994 CmdArgs.push_back(Output.getFilename());
7995
Rafael Espindola81937ec2010-12-01 01:52:43 +00007996 if (!Args.hasArg(options::OPT_nostdlib) &&
7997 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007998 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007999 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008000 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008001 if (Args.hasArg(options::OPT_pg))
8002 crt1 = "gcrt1.o";
8003 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008004 crt1 = "Scrt1.o";
8005 else
8006 crt1 = "crt1.o";
8007 }
8008 if (crt1)
8009 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008010
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008011 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8012 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008013
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008014 const char *crtbegin;
8015 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008016 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008017 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008018 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008019 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008020 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008021 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008022 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008023 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008024
8025 // Add crtfastmath.o if available and fast math is enabled.
8026 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008027 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008028
8029 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008030 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008031
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008032 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008033
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008034 for (const auto &Path : Paths)
8035 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008036
Alexey Samsonov907880e2015-06-19 19:57:46 +00008037 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008038 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008039
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008040 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8041 CmdArgs.push_back("--no-demangle");
8042
Alexey Samsonov52550342014-09-15 19:58:40 +00008043 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008044 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008045 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008046 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008048 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008049 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008050 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008051 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008052 if (OnlyLibstdcxxStatic)
8053 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008054 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008055 if (OnlyLibstdcxxStatic)
8056 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008057 CmdArgs.push_back("-lm");
8058 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008059 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8060 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008061
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008062 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008063 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8064 if (Args.hasArg(options::OPT_static))
8065 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008066
Alexey Samsonov52550342014-09-15 19:58:40 +00008067 if (NeedsSanitizerDeps)
8068 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8069
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008070 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8071 Args.hasArg(options::OPT_pthreads);
8072
8073 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8074 options::OPT_fno_openmp, false)) {
8075 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8076 // FIXME: Does this really make sense for all GNU toolchains?
8077 WantPthread = true;
8078
8079 // Also link the particular OpenMP runtimes.
8080 switch (getOpenMPRuntime(ToolChain, Args)) {
8081 case OMPRT_OMP:
8082 CmdArgs.push_back("-lomp");
8083 break;
8084 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008085 CmdArgs.push_back("-lgomp");
8086
8087 // FIXME: Exclude this for platforms with libgomp that don't require
8088 // librt. Most modern Linux platforms require it, but some may not.
8089 CmdArgs.push_back("-lrt");
8090 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008091 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008092 CmdArgs.push_back("-liomp5");
8093 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008094 case OMPRT_Unknown:
8095 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008096 break;
8097 }
Chandler Carruth01538002013-01-17 13:19:29 +00008098 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008099
Renato Golinc4b49242014-02-13 10:01:16 +00008100 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008101
Richard Smith31d1de22015-05-20 22:48:44 +00008102 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008103 CmdArgs.push_back("-lpthread");
8104
8105 CmdArgs.push_back("-lc");
8106
8107 if (Args.hasArg(options::OPT_static))
8108 CmdArgs.push_back("--end-group");
8109 else
Renato Golinc4b49242014-02-13 10:01:16 +00008110 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008111 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008112
Rafael Espindola81937ec2010-12-01 01:52:43 +00008113 if (!Args.hasArg(options::OPT_nostartfiles)) {
8114 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008115 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008116 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008117 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008118 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008119 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008120 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008121
Rafael Espindola81937ec2010-12-01 01:52:43 +00008122 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008123 if (!isAndroid)
8124 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008125 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008126 }
8127
David Blaikiec11bf802014-09-04 16:04:28 +00008128 C.addCommand(
8129 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008130}
8131
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008132// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8133// for the various SFI requirements like register masking. The assembly tool
8134// inserts the file containing the macros as an input into all the assembly
8135// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008136void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8137 const InputInfo &Output,
8138 const InputInfoList &Inputs,
8139 const ArgList &Args,
8140 const char *LinkingOutput) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008141 const toolchains::NaCl_TC &ToolChain =
8142 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008143 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8144 "nacl-arm-macros.s");
8145 InputInfoList NewInputs;
8146 NewInputs.push_back(NaClMacros);
8147 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008148 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8149 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008150}
8151
Douglas Katzman750cfc52015-06-29 18:42:16 +00008152// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008153// we use static by default, do not yet support sanitizers or LTO, and a few
8154// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008155// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008156void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8157 const InputInfo &Output,
8158 const InputInfoList &Inputs,
8159 const ArgList &Args,
8160 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008161
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008162 const toolchains::NaCl_TC &ToolChain =
8163 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008164 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008165 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008166 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008167 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008168
8169 ArgStringList CmdArgs;
8170
8171 // Silence warning for "clang -g foo.o -o foo"
8172 Args.ClaimAllArgs(options::OPT_g_Group);
8173 // and "clang -emit-llvm foo.o -o foo"
8174 Args.ClaimAllArgs(options::OPT_emit_llvm);
8175 // and for "clang -w foo.o -o foo". Other warning options are already
8176 // handled somewhere else.
8177 Args.ClaimAllArgs(options::OPT_w);
8178
8179 if (!D.SysRoot.empty())
8180 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8181
8182 if (Args.hasArg(options::OPT_rdynamic))
8183 CmdArgs.push_back("-export-dynamic");
8184
8185 if (Args.hasArg(options::OPT_s))
8186 CmdArgs.push_back("-s");
8187
8188 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8189 // there is --build-id, which we do want.
8190 CmdArgs.push_back("--build-id");
8191
8192 if (!IsStatic)
8193 CmdArgs.push_back("--eh-frame-hdr");
8194
8195 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008196 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008197 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008198 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008199 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008200 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008201 CmdArgs.push_back("elf_x86_64_nacl");
8202 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008203 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8204 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008205
8206 if (IsStatic)
8207 CmdArgs.push_back("-static");
8208 else if (Args.hasArg(options::OPT_shared))
8209 CmdArgs.push_back("-shared");
8210
8211 CmdArgs.push_back("-o");
8212 CmdArgs.push_back(Output.getFilename());
8213 if (!Args.hasArg(options::OPT_nostdlib) &&
8214 !Args.hasArg(options::OPT_nostartfiles)) {
8215 if (!Args.hasArg(options::OPT_shared))
8216 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8217 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8218
8219 const char *crtbegin;
8220 if (IsStatic)
8221 crtbegin = "crtbeginT.o";
8222 else if (Args.hasArg(options::OPT_shared))
8223 crtbegin = "crtbeginS.o";
8224 else
8225 crtbegin = "crtbegin.o";
8226 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8227 }
8228
8229 Args.AddAllArgs(CmdArgs, options::OPT_L);
8230 Args.AddAllArgs(CmdArgs, options::OPT_u);
8231
8232 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8233
8234 for (const auto &Path : Paths)
8235 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8236
8237 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8238 CmdArgs.push_back("--no-demangle");
8239
8240 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8241
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008242 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008243 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008244 bool OnlyLibstdcxxStatic =
8245 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008246 if (OnlyLibstdcxxStatic)
8247 CmdArgs.push_back("-Bstatic");
8248 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8249 if (OnlyLibstdcxxStatic)
8250 CmdArgs.push_back("-Bdynamic");
8251 CmdArgs.push_back("-lm");
8252 }
8253
8254 if (!Args.hasArg(options::OPT_nostdlib)) {
8255 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8256 // Always use groups, since it has no effect on dynamic libraries.
8257 CmdArgs.push_back("--start-group");
8258 CmdArgs.push_back("-lc");
8259 // NaCl's libc++ currently requires libpthread, so just always include it
8260 // in the group for C++.
8261 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008262 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008263 CmdArgs.push_back("-lpthread");
8264 }
8265
8266 CmdArgs.push_back("-lgcc");
8267 CmdArgs.push_back("--as-needed");
8268 if (IsStatic)
8269 CmdArgs.push_back("-lgcc_eh");
8270 else
8271 CmdArgs.push_back("-lgcc_s");
8272 CmdArgs.push_back("--no-as-needed");
8273 CmdArgs.push_back("--end-group");
8274 }
8275
8276 if (!Args.hasArg(options::OPT_nostartfiles)) {
8277 const char *crtend;
8278 if (Args.hasArg(options::OPT_shared))
8279 crtend = "crtendS.o";
8280 else
8281 crtend = "crtend.o";
8282
8283 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8284 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8285 }
8286 }
8287
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008288 C.addCommand(
8289 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008290}
8291
Douglas Katzman95354292015-06-23 20:42:09 +00008292void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8293 const InputInfo &Output,
8294 const InputInfoList &Inputs,
8295 const ArgList &Args,
8296 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008297 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008298 ArgStringList CmdArgs;
8299
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008300 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008301
8302 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008303 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008304
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008305 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008306 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008307
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008308 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008309 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008310}
8311
Douglas Katzman95354292015-06-23 20:42:09 +00008312void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8313 const InputInfo &Output,
8314 const InputInfoList &Inputs,
8315 const ArgList &Args,
8316 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008317 const Driver &D = getToolChain().getDriver();
8318 ArgStringList CmdArgs;
8319
Daniel Dunbarb440f562010-08-02 02:38:21 +00008320 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008321 CmdArgs.push_back("-o");
8322 CmdArgs.push_back(Output.getFilename());
8323 } else {
8324 assert(Output.isNothing() && "Invalid output.");
8325 }
8326
8327 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008328 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008329 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8330 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8331 CmdArgs.push_back(
8332 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8333 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008334 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008335
8336 Args.AddAllArgs(CmdArgs, options::OPT_L);
8337 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8338 Args.AddAllArgs(CmdArgs, options::OPT_e);
8339
Daniel Dunbar54423b22010-09-17 00:24:54 +00008340 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008341
Alexey Samsonov7811d192014-02-20 13:57:37 +00008342 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008343
Chris Lattner3e2ee142010-07-07 16:01:42 +00008344 if (!Args.hasArg(options::OPT_nostdlib) &&
8345 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008346 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008347 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008348 CmdArgs.push_back("-lm");
8349 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008350 }
8351
8352 if (!Args.hasArg(options::OPT_nostdlib) &&
8353 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008354 if (Args.hasArg(options::OPT_pthread))
8355 CmdArgs.push_back("-lpthread");
8356 CmdArgs.push_back("-lc");
8357 CmdArgs.push_back("-lCompilerRT-Generic");
8358 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8359 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008360 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008361 }
8362
Logan Chieneb9162f2014-06-26 14:23:45 +00008363 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008364 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008365}
8366
Daniel Dunbarcc912342009-05-02 18:28:39 +00008367/// DragonFly Tools
8368
8369// For now, DragonFly Assemble does just about the same as for
8370// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008371void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8372 const InputInfo &Output,
8373 const InputInfoList &Inputs,
8374 const ArgList &Args,
8375 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008376 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008377 ArgStringList CmdArgs;
8378
8379 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8380 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008381 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008382 CmdArgs.push_back("--32");
8383
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008384 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008385
8386 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008387 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008388
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008389 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008390 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008391
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008392 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008393 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008394}
8395
Douglas Katzman95354292015-06-23 20:42:09 +00008396void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8397 const InputInfo &Output,
8398 const InputInfoList &Inputs,
8399 const ArgList &Args,
8400 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008401 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008402 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008403 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008404
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008405 if (!D.SysRoot.empty())
8406 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8407
John McCall65b8da02013-04-11 22:55:55 +00008408 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008409 if (Args.hasArg(options::OPT_static)) {
8410 CmdArgs.push_back("-Bstatic");
8411 } else {
John McCall65b8da02013-04-11 22:55:55 +00008412 if (Args.hasArg(options::OPT_rdynamic))
8413 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008414 if (Args.hasArg(options::OPT_shared))
8415 CmdArgs.push_back("-Bshareable");
8416 else {
8417 CmdArgs.push_back("-dynamic-linker");
8418 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8419 }
John McCall65b8da02013-04-11 22:55:55 +00008420 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008421 }
8422
8423 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8424 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008425 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008426 CmdArgs.push_back("-m");
8427 CmdArgs.push_back("elf_i386");
8428 }
8429
Daniel Dunbarb440f562010-08-02 02:38:21 +00008430 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008431 CmdArgs.push_back("-o");
8432 CmdArgs.push_back(Output.getFilename());
8433 } else {
8434 assert(Output.isNothing() && "Invalid output.");
8435 }
8436
8437 if (!Args.hasArg(options::OPT_nostdlib) &&
8438 !Args.hasArg(options::OPT_nostartfiles)) {
8439 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008440 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008441 CmdArgs.push_back(
8442 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008443 else {
8444 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008445 CmdArgs.push_back(
8446 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008447 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008448 CmdArgs.push_back(
8449 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008450 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008451 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008452 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008453 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008454 CmdArgs.push_back(
8455 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008456 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008457 CmdArgs.push_back(
8458 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008459 }
8460
8461 Args.AddAllArgs(CmdArgs, options::OPT_L);
8462 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8463 Args.AddAllArgs(CmdArgs, options::OPT_e);
8464
Daniel Dunbar54423b22010-09-17 00:24:54 +00008465 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008466
8467 if (!Args.hasArg(options::OPT_nostdlib) &&
8468 !Args.hasArg(options::OPT_nodefaultlibs)) {
8469 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8470 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008471 if (UseGCC47)
8472 CmdArgs.push_back("-L/usr/lib/gcc47");
8473 else
8474 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008475
8476 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008477 if (UseGCC47) {
8478 CmdArgs.push_back("-rpath");
8479 CmdArgs.push_back("/usr/lib/gcc47");
8480 } else {
8481 CmdArgs.push_back("-rpath");
8482 CmdArgs.push_back("/usr/lib/gcc44");
8483 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008484 }
8485
Hans Wennborg70850d82013-07-18 20:29:38 +00008486 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008487 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008488 CmdArgs.push_back("-lm");
8489 }
8490
Daniel Dunbarcc912342009-05-02 18:28:39 +00008491 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008492 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008493
8494 if (!Args.hasArg(options::OPT_nolibc)) {
8495 CmdArgs.push_back("-lc");
8496 }
8497
John McCall65b8da02013-04-11 22:55:55 +00008498 if (UseGCC47) {
8499 if (Args.hasArg(options::OPT_static) ||
8500 Args.hasArg(options::OPT_static_libgcc)) {
8501 CmdArgs.push_back("-lgcc");
8502 CmdArgs.push_back("-lgcc_eh");
8503 } else {
8504 if (Args.hasArg(options::OPT_shared_libgcc)) {
8505 CmdArgs.push_back("-lgcc_pic");
8506 if (!Args.hasArg(options::OPT_shared))
8507 CmdArgs.push_back("-lgcc");
8508 } else {
8509 CmdArgs.push_back("-lgcc");
8510 CmdArgs.push_back("--as-needed");
8511 CmdArgs.push_back("-lgcc_pic");
8512 CmdArgs.push_back("--no-as-needed");
8513 }
8514 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008515 } else {
John McCall65b8da02013-04-11 22:55:55 +00008516 if (Args.hasArg(options::OPT_shared)) {
8517 CmdArgs.push_back("-lgcc_pic");
8518 } else {
8519 CmdArgs.push_back("-lgcc");
8520 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008521 }
8522 }
8523
8524 if (!Args.hasArg(options::OPT_nostdlib) &&
8525 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008526 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008527 CmdArgs.push_back(
8528 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008529 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008530 CmdArgs.push_back(
8531 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8532 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008533 }
8534
Alexey Samsonov7811d192014-02-20 13:57:37 +00008535 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008536
Logan Chieneb9162f2014-06-26 14:23:45 +00008537 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008538 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008539}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008540
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008541// Try to find Exe from a Visual Studio distribution. This first tries to find
8542// an installed copy of Visual Studio and, failing that, looks in the PATH,
8543// making sure that whatever executable that's found is not a same-named exe
8544// from clang itself to prevent clang from falling back to itself.
8545static std::string FindVisualStudioExecutable(const ToolChain &TC,
8546 const char *Exe,
8547 const char *ClangProgramPath) {
8548 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8549 std::string visualStudioBinDir;
8550 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8551 visualStudioBinDir)) {
8552 SmallString<128> FilePath(visualStudioBinDir);
8553 llvm::sys::path::append(FilePath, Exe);
8554 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8555 return FilePath.str();
8556 }
8557
8558 return Exe;
8559}
8560
Douglas Katzman95354292015-06-23 20:42:09 +00008561void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8562 const InputInfo &Output,
8563 const InputInfoList &Inputs,
8564 const ArgList &Args,
8565 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008566 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008567 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008568
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008569 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8570 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008571 CmdArgs.push_back(
8572 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008573
8574 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008575 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008576 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008577
Zachary Turner10d75b22014-10-22 20:40:43 +00008578 if (!llvm::sys::Process::GetEnv("LIB")) {
8579 // If the VC environment hasn't been configured (perhaps because the user
8580 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008581 // the environment variable is set however, assume the user knows what
8582 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008583 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008584 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008585 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8586 SmallString<128> LibDir(VisualStudioDir);
8587 llvm::sys::path::append(LibDir, "VC", "lib");
8588 switch (MSVC.getArch()) {
8589 case llvm::Triple::x86:
8590 // x86 just puts the libraries directly in lib
8591 break;
8592 case llvm::Triple::x86_64:
8593 llvm::sys::path::append(LibDir, "amd64");
8594 break;
8595 case llvm::Triple::arm:
8596 llvm::sys::path::append(LibDir, "arm");
8597 break;
8598 default:
8599 break;
8600 }
8601 CmdArgs.push_back(
8602 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8603 }
8604
8605 std::string WindowsSdkLibPath;
8606 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8607 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8608 WindowsSdkLibPath.c_str()));
8609 }
8610
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008611 CmdArgs.push_back("-nologo");
8612
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008613 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008614 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008615
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008616 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008617 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008618 if (DLL) {
8619 CmdArgs.push_back(Args.MakeArgString("-dll"));
8620
8621 SmallString<128> ImplibName(Output.getFilename());
8622 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008623 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008624 }
8625
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008626 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008627 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008628 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008629 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008630 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008631 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008632 };
8633 for (const auto &Component : CompilerRTComponents)
8634 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008635 // Make sure the dynamic runtime thunk is not optimized out at link time
8636 // to ensure proper SEH handling.
8637 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008638 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008639 CmdArgs.push_back(
8640 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008641 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008642 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008643 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008644 };
8645 for (const auto &Component : CompilerRTComponents)
8646 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008647 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008648 }
8649
Hans Wennborg2e274592013-08-13 23:38:57 +00008650 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008651
Reid Kleckner337188f2014-09-16 19:22:00 +00008652 // Add filenames, libraries, and other linker inputs.
8653 for (const auto &Input : Inputs) {
8654 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008655 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008656 continue;
8657 }
8658
8659 const Arg &A = Input.getInputArg();
8660
8661 // Render -l options differently for the MSVC linker.
8662 if (A.getOption().matches(options::OPT_l)) {
8663 StringRef Lib = A.getValue();
8664 const char *LinkLibArg;
8665 if (Lib.endswith(".lib"))
8666 LinkLibArg = Args.MakeArgString(Lib);
8667 else
8668 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8669 CmdArgs.push_back(LinkLibArg);
8670 continue;
8671 }
8672
8673 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8674 // or -L. Render it, even if MSVC doesn't understand it.
8675 A.renderAsInput(Args, CmdArgs);
8676 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008677
Zachary Turner719f58c2014-12-01 23:06:47 +00008678 // We need to special case some linker paths. In the case of lld, we need to
8679 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8680 // linker, we need to use a special search algorithm.
8681 llvm::SmallString<128> linkPath;
8682 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8683 if (Linker.equals_lower("lld"))
8684 Linker = "lld-link";
8685
8686 if (Linker.equals_lower("link")) {
8687 // If we're using the MSVC linker, it's not sufficient to just use link
8688 // from the program PATH, because other environments like GnuWin32 install
8689 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008690 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008691 C.getDriver().getClangProgramPath());
8692 } else {
8693 linkPath = Linker;
8694 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008695 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008696 }
8697
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008698 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008699 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008700}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008701
Douglas Katzman95354292015-06-23 20:42:09 +00008702void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8703 const InputInfo &Output,
8704 const InputInfoList &Inputs,
8705 const ArgList &Args,
8706 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008707 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8708}
8709
Douglas Katzman95354292015-06-23 20:42:09 +00008710std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008711 Compilation &C, const JobAction &JA, const InputInfo &Output,
8712 const InputInfoList &Inputs, const ArgList &Args,
8713 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008714 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008715 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008716 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008717 CmdArgs.push_back("/W0"); // No warnings.
8718
8719 // The goal is to be able to invoke this tool correctly based on
8720 // any flag accepted by clang-cl.
8721
8722 // These are spelled the same way in clang and cl.exe,.
8723 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8724 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008725
8726 // Optimization level.
8727 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8728 if (A->getOption().getID() == options::OPT_O0) {
8729 CmdArgs.push_back("/Od");
8730 } else {
8731 StringRef OptLevel = A->getValue();
8732 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8733 A->render(Args, CmdArgs);
8734 else if (OptLevel == "3")
8735 CmdArgs.push_back("/Ox");
8736 }
8737 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008738
Nico Weber3f8dafb2015-03-12 19:37:10 +00008739 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008740 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8741
David Majnemerf6072342014-07-01 22:24:56 +00008742 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8743 /*default=*/false))
8744 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008745 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8746 options::OPT_fno_function_sections))
8747 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8748 ? "/Gy"
8749 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008750 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8751 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008752 CmdArgs.push_back(
8753 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008754 if (Args.hasArg(options::OPT_fsyntax_only))
8755 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008756 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8757 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008758
Nico Weber3f8dafb2015-03-12 19:37:10 +00008759 std::vector<std::string> Includes =
8760 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008761 for (const auto &Include : Includes)
8762 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008763
Hans Wennborg87cfa712013-09-19 20:32:16 +00008764 // Flags that can simply be passed through.
8765 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8766 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008767 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008768
8769 // The order of these flags is relevant, so pick the last one.
8770 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8771 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8772 A->render(Args, CmdArgs);
8773
Hans Wennborg87cfa712013-09-19 20:32:16 +00008774 // Input filename.
8775 assert(Inputs.size() == 1);
8776 const InputInfo &II = Inputs[0];
8777 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8778 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8779 if (II.isFilename())
8780 CmdArgs.push_back(II.getFilename());
8781 else
8782 II.getInputArg().renderAsInput(Args, CmdArgs);
8783
8784 // Output filename.
8785 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008786 const char *Fo =
8787 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00008788 CmdArgs.push_back(Fo);
8789
Hans Wennborg188382e2013-09-20 18:16:35 +00008790 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008791 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8792 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008793 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8794 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008795}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008796
Yaron Keren1c0070c2015-07-02 04:45:27 +00008797/// MinGW Tools
8798void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8799 const InputInfo &Output,
8800 const InputInfoList &Inputs,
8801 const ArgList &Args,
8802 const char *LinkingOutput) const {
8803 claimNoWarnArgs(Args);
8804 ArgStringList CmdArgs;
8805
8806 if (getToolChain().getArch() == llvm::Triple::x86) {
8807 CmdArgs.push_back("--32");
8808 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
8809 CmdArgs.push_back("--64");
8810 }
8811
8812 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8813
8814 CmdArgs.push_back("-o");
8815 CmdArgs.push_back(Output.getFilename());
8816
8817 for (const auto &II : Inputs)
8818 CmdArgs.push_back(II.getFilename());
8819
8820 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
8821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8822
8823 if (Args.hasArg(options::OPT_gsplit_dwarf))
8824 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
8825 SplitDebugName(Args, Inputs[0]));
8826}
8827
8828void MinGW::Linker::AddLibGCC(const ArgList &Args,
8829 ArgStringList &CmdArgs) const {
8830 if (Args.hasArg(options::OPT_mthreads))
8831 CmdArgs.push_back("-lmingwthrd");
8832 CmdArgs.push_back("-lmingw32");
8833 if (Args.hasArg(options::OPT_shared) ||
8834 Args.hasArg(options::OPT_shared_libgcc) ||
8835 !Args.hasArg(options::OPT_static_libgcc)) {
8836 CmdArgs.push_back("-lgcc_s");
8837 CmdArgs.push_back("-lgcc");
8838 } else {
8839 CmdArgs.push_back("-lgcc");
8840 CmdArgs.push_back("-lgcc_eh");
8841 }
8842 CmdArgs.push_back("-lmoldname");
8843 CmdArgs.push_back("-lmingwex");
8844 CmdArgs.push_back("-lmsvcrt");
8845}
8846
8847void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8848 const InputInfo &Output,
8849 const InputInfoList &Inputs,
8850 const ArgList &Args,
8851 const char *LinkingOutput) const {
8852 const ToolChain &TC = getToolChain();
8853 const Driver &D = TC.getDriver();
8854 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
8855
8856 ArgStringList CmdArgs;
8857
8858 // Silence warning for "clang -g foo.o -o foo"
8859 Args.ClaimAllArgs(options::OPT_g_Group);
8860 // and "clang -emit-llvm foo.o -o foo"
8861 Args.ClaimAllArgs(options::OPT_emit_llvm);
8862 // and for "clang -w foo.o -o foo". Other warning options are already
8863 // handled somewhere else.
8864 Args.ClaimAllArgs(options::OPT_w);
8865
8866 if (!D.SysRoot.empty())
8867 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8868
8869 if (Args.hasArg(options::OPT_s))
8870 CmdArgs.push_back("-s");
8871
8872 CmdArgs.push_back("-m");
8873 if (TC.getArch() == llvm::Triple::x86)
8874 CmdArgs.push_back("i386pe");
8875 if (TC.getArch() == llvm::Triple::x86_64)
8876 CmdArgs.push_back("i386pep");
8877
8878 if (Args.hasArg(options::OPT_mwindows)) {
8879 CmdArgs.push_back("--subsystem");
8880 CmdArgs.push_back("windows");
8881 } else if (Args.hasArg(options::OPT_mconsole)) {
8882 CmdArgs.push_back("--subsystem");
8883 CmdArgs.push_back("console");
8884 }
8885
8886 if (Args.hasArg(options::OPT_static))
8887 CmdArgs.push_back("-Bstatic");
8888 else {
8889 if (Args.hasArg(options::OPT_mdll))
8890 CmdArgs.push_back("--dll");
8891 else if (Args.hasArg(options::OPT_shared))
8892 CmdArgs.push_back("--shared");
8893 CmdArgs.push_back("-Bdynamic");
8894 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
8895 CmdArgs.push_back("-e");
8896 if (TC.getArch() == llvm::Triple::x86)
8897 CmdArgs.push_back("_DllMainCRTStartup@12");
8898 else
8899 CmdArgs.push_back("DllMainCRTStartup");
8900 CmdArgs.push_back("--enable-auto-image-base");
8901 }
8902 }
8903
8904 CmdArgs.push_back("-o");
8905 CmdArgs.push_back(Output.getFilename());
8906
8907 Args.AddAllArgs(CmdArgs, options::OPT_e);
8908 // FIXME: add -N, -n flags
8909 Args.AddLastArg(CmdArgs, options::OPT_r);
8910 Args.AddLastArg(CmdArgs, options::OPT_s);
8911 Args.AddLastArg(CmdArgs, options::OPT_t);
8912 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
8913 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
8914
8915 if (!Args.hasArg(options::OPT_nostdlib) &&
8916 !Args.hasArg(options::OPT_nostartfiles)) {
8917 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
8918 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
8919 } else {
8920 if (Args.hasArg(options::OPT_municode))
8921 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
8922 else
8923 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
8924 }
8925 if (Args.hasArg(options::OPT_pg))
8926 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
8927 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
8928 }
8929
8930 Args.AddAllArgs(CmdArgs, options::OPT_L);
8931 const ToolChain::path_list Paths = TC.getFilePaths();
8932 for (const auto &Path : Paths)
8933 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8934
8935 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8936
8937 // TODO: Add ASan stuff here
8938
8939 // TODO: Add profile stuff here
8940
8941 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8942 !Args.hasArg(options::OPT_nodefaultlibs)) {
8943 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8944 !Args.hasArg(options::OPT_static);
8945 if (OnlyLibstdcxxStatic)
8946 CmdArgs.push_back("-Bstatic");
8947 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8948 if (OnlyLibstdcxxStatic)
8949 CmdArgs.push_back("-Bdynamic");
8950 }
8951
8952 if (!Args.hasArg(options::OPT_nostdlib)) {
8953 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8954 if (Args.hasArg(options::OPT_static))
8955 CmdArgs.push_back("--start-group");
8956
8957 if (Args.hasArg(options::OPT_fstack_protector) ||
8958 Args.hasArg(options::OPT_fstack_protector_strong) ||
8959 Args.hasArg(options::OPT_fstack_protector_all)) {
8960 CmdArgs.push_back("-lssp_nonshared");
8961 CmdArgs.push_back("-lssp");
8962 }
8963 if (Args.hasArg(options::OPT_fopenmp))
8964 CmdArgs.push_back("-lgomp");
8965
8966 AddLibGCC(Args, CmdArgs);
8967
8968 if (Args.hasArg(options::OPT_pg))
8969 CmdArgs.push_back("-lgmon");
8970
8971 // FIXME: what to do about pthreads library?
8972 // Currently required for OpenMP and posix-threading libgcc,
8973 // does not exists in mingw.org.
8974 //CmdArgs.push_back("-lpthread");
8975
8976 // add system libraries
8977 if (Args.hasArg(options::OPT_mwindows)) {
8978 CmdArgs.push_back("-lgdi32");
8979 CmdArgs.push_back("-lcomdlg32");
8980 }
8981 CmdArgs.push_back("-ladvapi32");
8982 CmdArgs.push_back("-lshell32");
8983 CmdArgs.push_back("-luser32");
8984 CmdArgs.push_back("-lkernel32");
8985
8986 if (Args.hasArg(options::OPT_static))
8987 CmdArgs.push_back("--end-group");
8988 else
8989 AddLibGCC(Args, CmdArgs);
8990 }
8991
8992 if (!Args.hasArg(options::OPT_nostartfiles)) {
8993 // Add crtfastmath.o if available and fast math is enabled.
8994 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
8995
8996 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
8997 }
8998 }
8999 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ld"));
9000 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9001}
9002
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009003/// XCore Tools
9004// We pass assemble and link construction to the xcc tool.
9005
Douglas Katzman95354292015-06-23 20:42:09 +00009006void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9007 const InputInfo &Output,
9008 const InputInfoList &Inputs,
9009 const ArgList &Args,
9010 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009011 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009012 ArgStringList CmdArgs;
9013
9014 CmdArgs.push_back("-o");
9015 CmdArgs.push_back(Output.getFilename());
9016
9017 CmdArgs.push_back("-c");
9018
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009019 if (Args.hasArg(options::OPT_v))
9020 CmdArgs.push_back("-v");
9021
Robert Lytton894d25c2014-05-02 09:33:25 +00009022 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9023 if (!A->getOption().matches(options::OPT_g0))
9024 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009025
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009026 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9027 false))
9028 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009029
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009030 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009031
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009032 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009033 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009034
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009035 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00009036 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009037}
9038
Douglas Katzman95354292015-06-23 20:42:09 +00009039void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9040 const InputInfo &Output,
9041 const InputInfoList &Inputs,
9042 const ArgList &Args,
9043 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009044 ArgStringList CmdArgs;
9045
9046 if (Output.isFilename()) {
9047 CmdArgs.push_back("-o");
9048 CmdArgs.push_back(Output.getFilename());
9049 } else {
9050 assert(Output.isNothing() && "Invalid output.");
9051 }
9052
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009053 if (Args.hasArg(options::OPT_v))
9054 CmdArgs.push_back("-v");
9055
David Majnemer8de68642014-12-05 08:11:58 +00009056 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009057 CmdArgs.push_back("-fexceptions");
9058
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009059 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9060
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009061 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00009062 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009063}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009064
Douglas Katzman95354292015-06-23 20:42:09 +00009065void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9066 const InputInfo &Output,
9067 const InputInfoList &Inputs,
9068 const ArgList &Args,
9069 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009070 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009071 const auto &TC =
9072 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9073 ArgStringList CmdArgs;
9074 const char *Exec;
9075
9076 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009077 default:
9078 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009079 case llvm::Triple::arm:
9080 case llvm::Triple::thumb:
9081 break;
9082 case llvm::Triple::x86:
9083 CmdArgs.push_back("--32");
9084 break;
9085 case llvm::Triple::x86_64:
9086 CmdArgs.push_back("--64");
9087 break;
9088 }
9089
9090 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9091
9092 CmdArgs.push_back("-o");
9093 CmdArgs.push_back(Output.getFilename());
9094
9095 for (const auto &Input : Inputs)
9096 CmdArgs.push_back(Input.getFilename());
9097
9098 const std::string Assembler = TC.GetProgramPath("as");
9099 Exec = Args.MakeArgString(Assembler);
9100
9101 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9102}
9103
Douglas Katzman95354292015-06-23 20:42:09 +00009104void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9105 const InputInfo &Output,
9106 const InputInfoList &Inputs,
9107 const ArgList &Args,
9108 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009109 const auto &TC =
9110 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9111 const llvm::Triple &T = TC.getTriple();
9112 const Driver &D = TC.getDriver();
9113 SmallString<128> EntryPoint;
9114 ArgStringList CmdArgs;
9115 const char *Exec;
9116
9117 // Silence warning for "clang -g foo.o -o foo"
9118 Args.ClaimAllArgs(options::OPT_g_Group);
9119 // and "clang -emit-llvm foo.o -o foo"
9120 Args.ClaimAllArgs(options::OPT_emit_llvm);
9121 // and for "clang -w foo.o -o foo"
9122 Args.ClaimAllArgs(options::OPT_w);
9123 // Other warning options are already handled somewhere else.
9124
9125 if (!D.SysRoot.empty())
9126 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9127
9128 if (Args.hasArg(options::OPT_pie))
9129 CmdArgs.push_back("-pie");
9130 if (Args.hasArg(options::OPT_rdynamic))
9131 CmdArgs.push_back("-export-dynamic");
9132 if (Args.hasArg(options::OPT_s))
9133 CmdArgs.push_back("--strip-all");
9134
9135 CmdArgs.push_back("-m");
9136 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009137 default:
9138 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009139 case llvm::Triple::arm:
9140 case llvm::Triple::thumb:
9141 // FIXME: this is incorrect for WinCE
9142 CmdArgs.push_back("thumb2pe");
9143 break;
9144 case llvm::Triple::x86:
9145 CmdArgs.push_back("i386pe");
9146 EntryPoint.append("_");
9147 break;
9148 case llvm::Triple::x86_64:
9149 CmdArgs.push_back("i386pep");
9150 break;
9151 }
9152
9153 if (Args.hasArg(options::OPT_shared)) {
9154 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009155 default:
9156 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009157 case llvm::Triple::arm:
9158 case llvm::Triple::thumb:
9159 case llvm::Triple::x86_64:
9160 EntryPoint.append("_DllMainCRTStartup");
9161 break;
9162 case llvm::Triple::x86:
9163 EntryPoint.append("_DllMainCRTStartup@12");
9164 break;
9165 }
9166
9167 CmdArgs.push_back("-shared");
9168 CmdArgs.push_back("-Bdynamic");
9169
9170 CmdArgs.push_back("--enable-auto-image-base");
9171
9172 CmdArgs.push_back("--entry");
9173 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9174 } else {
9175 EntryPoint.append("mainCRTStartup");
9176
9177 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9178 : "-Bdynamic");
9179
9180 if (!Args.hasArg(options::OPT_nostdlib) &&
9181 !Args.hasArg(options::OPT_nostartfiles)) {
9182 CmdArgs.push_back("--entry");
9183 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9184 }
9185
9186 // FIXME: handle subsystem
9187 }
9188
9189 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009190 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009191
9192 CmdArgs.push_back("-o");
9193 CmdArgs.push_back(Output.getFilename());
9194
9195 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9196 SmallString<261> ImpLib(Output.getFilename());
9197 llvm::sys::path::replace_extension(ImpLib, ".lib");
9198
9199 CmdArgs.push_back("--out-implib");
9200 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9201 }
9202
9203 if (!Args.hasArg(options::OPT_nostdlib) &&
9204 !Args.hasArg(options::OPT_nostartfiles)) {
9205 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9206 const char *CRTBegin;
9207
9208 CRTBegin =
9209 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9210 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9211 }
9212
9213 Args.AddAllArgs(CmdArgs, options::OPT_L);
9214
9215 const auto &Paths = TC.getFilePaths();
9216 for (const auto &Path : Paths)
9217 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9218
9219 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9220
9221 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9222 !Args.hasArg(options::OPT_nodefaultlibs)) {
9223 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9224 !Args.hasArg(options::OPT_static);
9225 if (StaticCXX)
9226 CmdArgs.push_back("-Bstatic");
9227 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9228 if (StaticCXX)
9229 CmdArgs.push_back("-Bdynamic");
9230 }
9231
9232 if (!Args.hasArg(options::OPT_nostdlib)) {
9233 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9234 // TODO handle /MT[d] /MD[d]
9235 CmdArgs.push_back("-lmsvcrt");
9236 AddRunTimeLibs(TC, D, CmdArgs, Args);
9237 }
9238 }
9239
9240 const std::string Linker = TC.GetProgramPath("ld");
9241 Exec = Args.MakeArgString(Linker);
9242
9243 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9244}
Douglas Katzman84a75642015-06-19 14:55:19 +00009245
Douglas Katzman95354292015-06-23 20:42:09 +00009246void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9247 const InputInfo &Output,
9248 const InputInfoList &Inputs,
9249 const ArgList &Args,
9250 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009251
9252 ArgStringList CmdArgs;
9253
9254 assert(Inputs.size() == 1);
9255 const InputInfo &II = Inputs[0];
9256 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9257 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9258
9259 // Append all -I, -iquote, -isystem paths.
9260 Args.AddAllArgs(CmdArgs, options::OPT_clang_i_Group);
9261 // These are spelled the same way in clang and moviCompile.
9262 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
9263
9264 CmdArgs.push_back("-DMYRIAD2");
9265 CmdArgs.push_back("-mcpu=myriad2");
9266 CmdArgs.push_back("-S");
9267
9268 // Any -O option passes through without translation. What about -Ofast ?
9269 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9270 A->render(Args, CmdArgs);
9271
9272 if (Args.hasFlag(options::OPT_ffunction_sections,
9273 options::OPT_fno_function_sections)) {
9274 CmdArgs.push_back("-ffunction-sections");
9275 }
9276 if (Args.hasArg(options::OPT_fno_inline_functions))
9277 CmdArgs.push_back("-fno-inline-functions");
9278
9279 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9280
9281 CmdArgs.push_back(II.getFilename());
9282 CmdArgs.push_back("-o");
9283 CmdArgs.push_back(Output.getFilename());
9284
9285 std::string Exec =
9286 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
9287 C.addCommand(
9288 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9289}
9290
Douglas Katzman95354292015-06-23 20:42:09 +00009291void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9292 const InputInfo &Output,
9293 const InputInfoList &Inputs,
9294 const ArgList &Args,
9295 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009296 ArgStringList CmdArgs;
9297
9298 assert(Inputs.size() == 1);
9299 const InputInfo &II = Inputs[0];
9300 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9301 assert(Output.getType() == types::TY_Object);
9302
9303 CmdArgs.push_back("-no6thSlotCompression");
9304 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9305 CmdArgs.push_back("-noSPrefixing");
9306 CmdArgs.push_back("-a"); // Mystery option.
9307 for (auto Arg : Args.filtered(options::OPT_I)) {
9308 Arg->claim();
9309 CmdArgs.push_back(
9310 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9311 }
9312 CmdArgs.push_back("-elf"); // Output format.
9313 CmdArgs.push_back(II.getFilename());
9314 CmdArgs.push_back(
9315 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9316
9317 std::string Exec =
9318 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
9319 C.addCommand(
9320 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9321}