blob: 3ea2b36cf52a5793e01d7366705ebd9c4961697b [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
Teresa Johnson8749d8042015-07-06 16:23:00 +00002808 if (JA.getType() == types::TY_LTO_IR ||
2809 JA.getType() == types::TY_LTO_BC) {
2810 CmdArgs.push_back("-flto");
2811 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002812 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002813 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002814 } else if (JA.getType() == types::TY_LLVM_IR ||
2815 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002816 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002817 } else if (JA.getType() == types::TY_LLVM_BC ||
2818 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002819 CmdArgs.push_back("-emit-llvm-bc");
2820 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002821 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002822 } else if (JA.getType() == types::TY_AST) {
2823 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002824 } else if (JA.getType() == types::TY_ModuleFile) {
2825 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002826 } else if (JA.getType() == types::TY_RewrittenObjC) {
2827 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002828 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002829 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2830 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002831 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002832 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002833 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002834 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00002835
2836 // Preserve use-list order by default when emitting bitcode, so that
2837 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
2838 // same result as running passes here. For LTO, we don't need to preserve
2839 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00002840 if (JA.getType() == types::TY_LLVM_BC)
2841 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002842 }
2843
Justin Bognera88f0122014-06-20 22:59:50 +00002844 // We normally speed up the clang process a bit by skipping destructors at
2845 // exit, but when we're generating diagnostics we can rely on some of the
2846 // cleanup.
2847 if (!C.isForDiagnostics())
2848 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002849
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002850// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00002851#ifdef NDEBUG
2852 CmdArgs.push_back("-disable-llvm-verifier");
2853#endif
2854
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002855 // Set the main file name, so that debug info works even with
2856 // -save-temps.
2857 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00002858 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002859
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002860 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002861 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002862 if (Args.hasArg(options::OPT_static))
2863 CmdArgs.push_back("-static-define");
2864
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002865 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002866 // Enable region store model by default.
2867 CmdArgs.push_back("-analyzer-store=region");
2868
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002869 // Treat blocks as analysis entry points.
2870 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2871
Ted Kremenek49c79792011-03-24 00:28:47 +00002872 CmdArgs.push_back("-analyzer-eagerly-assume");
2873
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002874 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002875 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002876 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002877
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002878 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002879 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002880
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002881 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002882 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002883
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002884 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002885
Artem Belevichba558952015-05-06 18:20:23 +00002886 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00002887 CmdArgs.push_back("-analyzer-checker=cplusplus");
2888
Nico Webere8e53112014-05-11 01:04:02 +00002889 // Enable the following experimental checkers for testing.
2890 CmdArgs.push_back(
2891 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002892 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2893 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002894 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00002895 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2896 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002897 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002898
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002899 // Set the output format. The default is plist, for (lame) historical
2900 // reasons.
2901 CmdArgs.push_back("-analyzer-output");
2902 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002903 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002904 else
2905 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002906
Ted Kremenekfe449a22010-03-22 22:32:05 +00002907 // Disable the presentation of standard compiler warnings when
2908 // using --analyze. We only want to show static analyzer diagnostics
2909 // or frontend errors.
2910 CmdArgs.push_back("-w");
2911
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002912 // Add -Xanalyzer arguments when running as analyzer.
2913 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002914 }
2915
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002916 CheckCodeGenerationOptions(D, Args);
2917
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002918 bool PIE = getToolChain().isPIEDefault();
2919 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002920 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002921
Alexey Bataev40e75222014-01-28 06:30:35 +00002922 // Android-specific defaults for PIC/PIE
2923 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002924 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00002925 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002926 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002927 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002928 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002929 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002930 case llvm::Triple::mips:
2931 case llvm::Triple::mipsel:
2932 case llvm::Triple::mips64:
2933 case llvm::Triple::mips64el:
2934 PIC = true; // "-fpic"
2935 break;
2936
2937 case llvm::Triple::x86:
2938 case llvm::Triple::x86_64:
2939 PIC = true; // "-fPIC"
2940 IsPICLevelTwo = true;
2941 break;
2942
2943 default:
2944 break;
2945 }
2946 }
2947
Brad Smith5b05db82014-06-24 19:51:29 +00002948 // OpenBSD-specific defaults for PIE
2949 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002950 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00002951 case llvm::Triple::mips64:
2952 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00002953 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00002954 case llvm::Triple::x86:
2955 case llvm::Triple::x86_64:
2956 IsPICLevelTwo = false; // "-fpie"
2957 break;
2958
2959 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00002960 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00002961 case llvm::Triple::sparcv9:
2962 IsPICLevelTwo = true; // "-fPIE"
2963 break;
2964
2965 default:
2966 break;
2967 }
2968 }
2969
Alexey Samsonov090301e2013-04-09 12:28:19 +00002970 // For the PIC and PIE flag options, this logic is different from the
2971 // legacy logic in very old versions of GCC, as that logic was just
2972 // a bug no one had ever fixed. This logic is both more rational and
2973 // consistent with GCC's new logic now that the bugs are fixed. The last
2974 // argument relating to either PIC or PIE wins, and no other argument is
2975 // used. If the last argument is any flavor of the '-fno-...' arguments,
2976 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2977 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002978 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2979 options::OPT_fpic, options::OPT_fno_pic,
2980 options::OPT_fPIE, options::OPT_fno_PIE,
2981 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002982 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2983 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002984 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002985 if (LastPICArg) {
2986 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002987 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2988 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2989 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002990 PIC =
2991 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
2992 IsPICLevelTwo =
2993 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002994 } else {
2995 PIE = PIC = false;
2996 }
2997 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002998 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002999
Nick Lewycky609dd662013-10-11 03:33:53 +00003000 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00003001 // specified while enabling PIC enabled level 1 PIC, just force it back to
3002 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
3003 // informal testing).
3004 if (PIC && getToolChain().getTriple().isOSDarwin())
3005 IsPICLevelTwo |= getToolChain().isPICDefault();
3006
Chandler Carruthc0c04552012-04-08 16:40:35 +00003007 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3008 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003009 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00003010 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003011 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003012 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003013 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003014
Chandler Carruth76a943b2012-11-19 03:52:03 +00003015 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3016 // This is a very special mode. It trumps the other modes, almost no one
3017 // uses it, and it isn't even valid on any OS but Darwin.
3018 if (!getToolChain().getTriple().isOSDarwin())
3019 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003020 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003021
3022 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3023
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003024 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003025 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003026
Chandler Carruth76a943b2012-11-19 03:52:03 +00003027 // Only a forced PIC mode can cause the actual compile to have PIC defines
3028 // etc., no flags are sufficient. This behavior was selected to closely
3029 // match that of llvm-gcc and Apple GCC before that.
3030 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3031 CmdArgs.push_back("-pic-level");
3032 CmdArgs.push_back("2");
3033 }
3034 } else {
3035 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3036 // handled in Clang's IRGen by the -pie-level flag.
3037 CmdArgs.push_back("-mrelocation-model");
3038 CmdArgs.push_back(PIC ? "pic" : "static");
3039
3040 if (PIC) {
3041 CmdArgs.push_back("-pic-level");
3042 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3043 if (PIE) {
3044 CmdArgs.push_back("-pie-level");
3045 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3046 }
3047 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003048 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003049
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003050 CmdArgs.push_back("-mthread-model");
3051 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3052 CmdArgs.push_back(A->getValue());
3053 else
3054 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3055
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003056 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3057
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003058 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3059 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003060 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003061
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003062 // LLVM Code Generator Options.
3063
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003064 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3065 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003066 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3067 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003068 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003069 CmdArgs.push_back(A->getValue());
3070 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003071 }
3072 }
3073
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003074 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3075 StringRef v = A->getValue();
3076 CmdArgs.push_back("-mllvm");
3077 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3078 A->claim();
3079 }
3080
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003081 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3082 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003083 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003084 }
3085
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003086 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3087 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003088 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003089 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003090 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003091 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3092 CmdArgs.push_back("-fpcc-struct-return");
3093 } else {
3094 assert(A->getOption().matches(options::OPT_freg_struct_return));
3095 CmdArgs.push_back("-freg-struct-return");
3096 }
3097 }
3098
Roman Divacky65b88cd2011-03-01 17:40:53 +00003099 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3100 CmdArgs.push_back("-mrtd");
3101
Rafael Espindola224dd632011-12-14 21:02:23 +00003102 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003103 CmdArgs.push_back("-mdisable-fp-elim");
3104 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3105 options::OPT_fno_zero_initialized_in_bss))
3106 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003107
3108 bool OFastEnabled = isOptimizationLevelFast(Args);
3109 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3110 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003111 OptSpecifier StrictAliasingAliasOption =
3112 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003113 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3114 // doesn't do any TBAA.
3115 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003116 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003117 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003118 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003119 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3120 options::OPT_fno_struct_path_tbaa))
3121 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003122 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3123 false))
3124 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003125 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3126 options::OPT_fno_optimize_sibling_calls))
3127 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003128
Eric Christopher006208c2013-04-04 06:29:47 +00003129 // Handle segmented stacks.
3130 if (Args.hasArg(options::OPT_fsplit_stack))
3131 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003132
3133 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3134 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003135 OptSpecifier FastMathAliasOption =
3136 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3137
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003138 // Handle various floating point optimization flags, mapping them to the
3139 // appropriate LLVM code generation flags. The pattern for all of these is to
3140 // default off the codegen optimizations, and if any flag enables them and no
3141 // flag disables them after the flag enabling them, enable the codegen
3142 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003143 if (Arg *A = Args.getLastArg(
3144 options::OPT_ffast_math, FastMathAliasOption,
3145 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3146 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3147 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003148 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3149 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003150 A->getOption().getID() != options::OPT_fhonor_infinities)
3151 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003152 if (Arg *A = Args.getLastArg(
3153 options::OPT_ffast_math, FastMathAliasOption,
3154 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3155 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3156 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003157 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3158 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003159 A->getOption().getID() != options::OPT_fhonor_nans)
3160 CmdArgs.push_back("-menable-no-nans");
3161
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003162 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3163 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003164 if (Arg *A =
3165 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3166 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3167 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003168 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3169 // However, turning *off* -ffast_math merely restores the toolchain default
3170 // (which may be false).
3171 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3172 A->getOption().getID() == options::OPT_ffast_math ||
3173 A->getOption().getID() == options::OPT_Ofast)
3174 MathErrno = false;
3175 else if (A->getOption().getID() == options::OPT_fmath_errno)
3176 MathErrno = true;
3177 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003178 if (MathErrno)
3179 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003180
3181 // There are several flags which require disabling very specific
3182 // optimizations. Any of these being disabled forces us to turn off the
3183 // entire set of LLVM optimizations, so collect them through all the flag
3184 // madness.
3185 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003186 if (Arg *A = Args.getLastArg(
3187 options::OPT_ffast_math, FastMathAliasOption,
3188 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3189 options::OPT_fno_unsafe_math_optimizations,
3190 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003191 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3192 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003193 A->getOption().getID() != options::OPT_fno_associative_math)
3194 AssociativeMath = true;
3195 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003196 if (Arg *A = Args.getLastArg(
3197 options::OPT_ffast_math, FastMathAliasOption,
3198 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3199 options::OPT_fno_unsafe_math_optimizations,
3200 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003201 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3202 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003203 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3204 ReciprocalMath = true;
3205 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003206 if (Arg *A = Args.getLastArg(
3207 options::OPT_ffast_math, FastMathAliasOption,
3208 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3209 options::OPT_fno_unsafe_math_optimizations,
3210 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003211 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3212 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003213 A->getOption().getID() != options::OPT_fsigned_zeros)
3214 SignedZeros = false;
3215 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003216 if (Arg *A = Args.getLastArg(
3217 options::OPT_ffast_math, FastMathAliasOption,
3218 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3219 options::OPT_fno_unsafe_math_optimizations,
3220 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003221 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3222 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003223 A->getOption().getID() != options::OPT_ftrapping_math)
3224 TrappingMath = false;
3225 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3226 !TrappingMath)
3227 CmdArgs.push_back("-menable-unsafe-fp-math");
3228
Sanjay Patel76c9e092015-01-23 16:40:50 +00003229 if (!SignedZeros)
3230 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003231
Sanjay Patel359b1052015-04-09 15:03:23 +00003232 if (ReciprocalMath)
3233 CmdArgs.push_back("-freciprocal-math");
3234
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003235 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003236 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003237 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003238 options::OPT_ffp_contract)) {
3239 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003240 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003241 if (Val == "fast" || Val == "on" || Val == "off") {
3242 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3243 } else {
3244 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003245 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003246 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003247 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3248 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003249 // If fast-math is set then set the fp-contract mode to fast.
3250 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3251 }
3252 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003253
Sanjay Patel2987c292015-06-11 14:53:41 +00003254 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003255
Bob Wilson6a039162012-07-19 03:52:53 +00003256 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3257 // and if we find them, tell the frontend to provide the appropriate
3258 // preprocessor macros. This is distinct from enabling any optimizations as
3259 // these options induce language changes which must survive serialization
3260 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003261 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3262 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003263 if (!A->getOption().matches(options::OPT_fno_fast_math))
3264 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003265 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3266 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003267 if (A->getOption().matches(options::OPT_ffinite_math_only))
3268 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003269
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003270 // Decide whether to use verbose asm. Verbose assembly is the default on
3271 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003272 bool IsIntegratedAssemblerDefault =
3273 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003274 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003275 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003276 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003277 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003278
Rafael Espindolab8a12932015-05-22 20:44:03 +00003279 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3280 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003281 CmdArgs.push_back("-no-integrated-as");
3282
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003283 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3284 CmdArgs.push_back("-mdebug-pass");
3285 CmdArgs.push_back("Structure");
3286 }
3287 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3288 CmdArgs.push_back("-mdebug-pass");
3289 CmdArgs.push_back("Arguments");
3290 }
3291
John McCall8517abc2010-02-19 02:45:38 +00003292 // Enable -mconstructor-aliases except on darwin, where we have to
3293 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003294 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003295 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003296
John McCall7ef5cb32011-03-18 02:56:14 +00003297 // Darwin's kernel doesn't support guard variables; just die if we
3298 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003299 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003300 CmdArgs.push_back("-fforbid-guard-variables");
3301
Douglas Gregordbe39272011-02-01 15:15:22 +00003302 if (Args.hasArg(options::OPT_mms_bitfields)) {
3303 CmdArgs.push_back("-mms-bitfields");
3304 }
John McCall8517abc2010-02-19 02:45:38 +00003305
Daniel Dunbar306945d2009-09-16 06:17:29 +00003306 // This is a coarse approximation of what llvm-gcc actually does, both
3307 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3308 // complicated ways.
3309 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003310 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3311 options::OPT_fno_asynchronous_unwind_tables,
3312 (getToolChain().IsUnwindTablesDefault() ||
3313 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3314 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003315 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3316 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003317 CmdArgs.push_back("-munwind-tables");
3318
Chandler Carruth05fb5852012-11-21 23:40:23 +00003319 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003320
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003321 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3322 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003323 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003324 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003325
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003326 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003327 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003328
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003329 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003330 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003331 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003332 }
3333
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003334 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00003335 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003336 if (!CPU.empty()) {
3337 CmdArgs.push_back("-target-cpu");
3338 CmdArgs.push_back(Args.MakeArgString(CPU));
3339 }
3340
Rafael Espindolaeb265472013-08-21 21:59:03 +00003341 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3342 CmdArgs.push_back("-mfpmath");
3343 CmdArgs.push_back(A->getValue());
3344 }
3345
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003346 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003347 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003348
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003349 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003350 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003351 default:
3352 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003353
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003354 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003355 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003356 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003357 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003358 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003359 break;
3360
Tim Northover573cbee2014-05-24 12:52:07 +00003361 case llvm::Triple::aarch64:
3362 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003363 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003364 break;
3365
Eric Christopher0b26a612010-03-02 02:41:08 +00003366 case llvm::Triple::mips:
3367 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003368 case llvm::Triple::mips64:
3369 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003370 AddMIPSTargetArgs(Args, CmdArgs);
3371 break;
3372
Ulrich Weigand8afad612014-07-28 13:17:52 +00003373 case llvm::Triple::ppc:
3374 case llvm::Triple::ppc64:
3375 case llvm::Triple::ppc64le:
3376 AddPPCTargetArgs(Args, CmdArgs);
3377 break;
3378
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003379 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003380 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003381 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003382 AddSparcTargetArgs(Args, CmdArgs);
3383 break;
3384
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003385 case llvm::Triple::x86:
3386 case llvm::Triple::x86_64:
3387 AddX86TargetArgs(Args, CmdArgs);
3388 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003389
3390 case llvm::Triple::hexagon:
3391 AddHexagonTargetArgs(Args, CmdArgs);
3392 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003393 }
3394
Hans Wennborg75958c42013-08-08 00:17:41 +00003395 // Add clang-cl arguments.
3396 if (getToolChain().getDriver().IsCLMode())
3397 AddClangCLArgs(Args, CmdArgs);
3398
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003399 // Pass the linker version in use.
3400 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3401 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003402 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003403 }
3404
Eric Christopherb7d97e92013-04-03 01:58:53 +00003405 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003406 CmdArgs.push_back("-momit-leaf-frame-pointer");
3407
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003408 // Explicitly error on some things we know we don't support and can't just
3409 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003410 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003411 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3412 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003413 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003414 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003415 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3416 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003417 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003418 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003419 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003420 }
3421
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003422 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003423 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003424 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003425 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003426 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3427 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003428 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003429 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003430 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003431
Chad Rosierbe10f982011-08-02 17:58:04 +00003432 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003433 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003434 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3435 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003436 }
3437
Manman Ren17bdb0f2013-11-20 20:22:14 +00003438 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3439 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003440 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003441 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003442 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3443 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003444 // FIXME: we should support specifying dwarf version with
3445 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003446 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003447 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003448 const llvm::Triple &Triple = getToolChain().getTriple();
3449 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003450 Triple.getOS() == llvm::Triple::FreeBSD ||
3451 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003452 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003453 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003454 CmdArgs.push_back("-gdwarf-2");
3455 else if (A->getOption().matches(options::OPT_gdwarf_3))
3456 CmdArgs.push_back("-gdwarf-3");
3457 else if (A->getOption().matches(options::OPT_gdwarf_4))
3458 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003459 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003460 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003461 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003462 const llvm::Triple &Triple = getToolChain().getTriple();
3463 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003464 Triple.getOS() == llvm::Triple::FreeBSD ||
3465 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003466 CmdArgs.push_back("-gdwarf-2");
3467 else
3468 CmdArgs.push_back("-g");
3469 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003470 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003471
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003472 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3473 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003474 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3475 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003476 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003477
Eric Christopher138c32b2013-09-13 22:37:55 +00003478 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003479 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3480 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003481 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003482 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003483 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003484 CmdArgs.push_back("-g");
3485 CmdArgs.push_back("-backend-option");
3486 CmdArgs.push_back("-split-dwarf=Enable");
3487 }
3488
Eric Christopher138c32b2013-09-13 22:37:55 +00003489 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3490 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3491 CmdArgs.push_back("-backend-option");
3492 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3493 }
Eric Christophereec89c22013-06-18 00:03:50 +00003494
Eric Christopher0d403d22014-02-14 01:27:03 +00003495 // -gdwarf-aranges turns on the emission of the aranges section in the
3496 // backend.
3497 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3498 CmdArgs.push_back("-backend-option");
3499 CmdArgs.push_back("-generate-arange-section");
3500 }
3501
David Blaikief36d9ba2014-01-27 18:52:43 +00003502 if (Args.hasFlag(options::OPT_fdebug_types_section,
3503 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003504 CmdArgs.push_back("-backend-option");
3505 CmdArgs.push_back("-generate-type-units");
3506 }
Eric Christophereec89c22013-06-18 00:03:50 +00003507
Ed Schouten6e576152015-03-26 17:50:28 +00003508 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3509 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3510
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003511 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003512 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003513 CmdArgs.push_back("-ffunction-sections");
3514 }
3515
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003516 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3517 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003518 CmdArgs.push_back("-fdata-sections");
3519 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003520
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003521 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003522 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003523 CmdArgs.push_back("-fno-unique-section-names");
3524
Chris Lattner3c77a352010-06-22 00:03:40 +00003525 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3526
Justin Bognera71e6812015-04-30 23:49:42 +00003527 if ((Args.hasArg(options::OPT_fprofile_instr_generate) ||
3528 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)) &&
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003529 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3530 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3531 D.Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003532 << "-fprofile-instr-generate"
3533 << "-fprofile-instr-use";
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003534
Justin Bognera71e6812015-04-30 23:49:42 +00003535 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_generate_EQ))
3536 A->render(Args, CmdArgs);
3537 else
3538 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003539
3540 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3541 A->render(Args, CmdArgs);
3542 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3543 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3544
Nick Lewycky207bce32011-04-21 23:44:07 +00003545 if (Args.hasArg(options::OPT_ftest_coverage) ||
3546 Args.hasArg(options::OPT_coverage))
3547 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003548 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3549 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003550 Args.hasArg(options::OPT_coverage))
3551 CmdArgs.push_back("-femit-coverage-data");
3552
Alex Lorenzee024992014-08-04 18:41:51 +00003553 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
Justin Bognera71e6812015-04-30 23:49:42 +00003554 !(Args.hasArg(options::OPT_fprofile_instr_generate) ||
3555 Args.hasArg(options::OPT_fprofile_instr_generate_EQ)))
Alex Lorenzee024992014-08-04 18:41:51 +00003556 D.Diag(diag::err_drv_argument_only_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003557 << "-fcoverage-mapping"
3558 << "-fprofile-instr-generate";
Alex Lorenzee024992014-08-04 18:41:51 +00003559
3560 if (Args.hasArg(options::OPT_fcoverage_mapping))
3561 CmdArgs.push_back("-fcoverage-mapping");
3562
Nick Lewycky480cb992011-05-04 20:46:58 +00003563 if (C.getArgs().hasArg(options::OPT_c) ||
3564 C.getArgs().hasArg(options::OPT_S)) {
3565 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003566 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003567 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003568 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003569 CoverageFilename = FinalOutput->getValue();
3570 } else {
3571 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3572 }
Yaron Keren92e1b622015-03-18 10:17:07 +00003573 if (llvm::sys::path::is_relative(CoverageFilename)) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003574 SmallString<128> Pwd;
3575 if (!llvm::sys::fs::current_path(Pwd)) {
Yaron Keren92e1b622015-03-18 10:17:07 +00003576 llvm::sys::path::append(Pwd, CoverageFilename);
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003577 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003578 }
3579 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003580 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003581 }
3582 }
3583
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003584 // Pass options for controlling the default header search paths.
3585 if (Args.hasArg(options::OPT_nostdinc)) {
3586 CmdArgs.push_back("-nostdsysteminc");
3587 CmdArgs.push_back("-nobuiltininc");
3588 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003589 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003590 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003591 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3592 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3593 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003594
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003595 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003596 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003597 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003598
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003599 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3600
Ted Kremenekf7639e12012-03-06 20:06:33 +00003601 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003602 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003603 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003604 options::OPT_ccc_arcmt_modify,
3605 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003606 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003607 switch (A->getOption().getID()) {
3608 default:
3609 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003610 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003611 CmdArgs.push_back("-arcmt-check");
3612 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003613 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003614 CmdArgs.push_back("-arcmt-modify");
3615 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003616 case options::OPT_ccc_arcmt_migrate:
3617 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003618 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003619 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003620
3621 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3622 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003623 break;
John McCalld70fb982011-06-15 23:25:17 +00003624 }
3625 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003626 } else {
3627 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3628 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3629 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003630 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003631
Ted Kremenekf7639e12012-03-06 20:06:33 +00003632 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3633 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003634 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3635 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003636 }
3637 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003638 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003639
3640 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003641 options::OPT_objcmt_migrate_subscripting,
3642 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003643 // None specified, means enable them all.
3644 CmdArgs.push_back("-objcmt-migrate-literals");
3645 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003646 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003647 } else {
3648 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3649 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003650 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003651 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003652 } else {
3653 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3654 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3655 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3656 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3657 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3658 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003659 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003660 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3661 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3662 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3663 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3664 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3665 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3666 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003667 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003668 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003669 }
3670
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003671 // Add preprocessing options like -I, -D, etc. if we are using the
3672 // preprocessor.
3673 //
3674 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003675 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003676 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003677
Rafael Espindolaa7431922011-07-21 23:40:37 +00003678 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3679 // that "The compiler can only warn and ignore the option if not recognized".
3680 // When building with ccache, it will pass -D options to clang even on
3681 // preprocessed inputs and configure concludes that -fPIC is not supported.
3682 Args.ClaimAllArgs(options::OPT_D);
3683
Alp Toker7874bdc2013-11-15 20:40:58 +00003684 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003685 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3686 if (A->getOption().matches(options::OPT_O4)) {
3687 CmdArgs.push_back("-O3");
3688 D.Diag(diag::warn_O4_is_O3);
3689 } else {
3690 A->render(Args, CmdArgs);
3691 }
3692 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003693
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003694 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003695 for (const Arg *A :
3696 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3697 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003698 }
3699
Rafael Espindola577637a2015-01-03 00:06:04 +00003700 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003701
Richard Smith3be1cb22014-08-07 00:24:21 +00003702 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003703 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003704 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3705 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003706 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003707 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003708
3709 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003710 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003711 //
3712 // If a std is supplied, only add -trigraphs if it follows the
3713 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003714 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003715 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3716 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003717 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003718 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003719 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003720 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003721 else
3722 Std->render(Args, CmdArgs);
3723
Nico Weber00721502014-12-23 22:32:37 +00003724 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003725 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003726 options::OPT_ftrigraphs,
3727 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003728 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003729 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003730 } else {
3731 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003732 //
3733 // FIXME: Clang doesn't correctly handle -std= when the input language
3734 // doesn't match. For the time being just ignore this for C++ inputs;
3735 // eventually we want to do all the standard defaulting here instead of
3736 // splitting it between the driver and clang -cc1.
3737 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003738 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3739 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003740 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003741 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003742
Nico Weber00721502014-12-23 22:32:37 +00003743 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3744 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003745 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003746
Richard Smith282b4492013-09-04 22:50:31 +00003747 // GCC's behavior for -Wwrite-strings is a bit strange:
3748 // * In C, this "warning flag" changes the types of string literals from
3749 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3750 // for the discarded qualifier.
3751 // * In C++, this is just a normal warning flag.
3752 //
3753 // Implementing this warning correctly in C is hard, so we follow GCC's
3754 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3755 // a non-const char* in C, rather than using this crude hack.
3756 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003757 // FIXME: This should behave just like a warning flag, and thus should also
3758 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3759 Arg *WriteStrings =
3760 Args.getLastArg(options::OPT_Wwrite_strings,
3761 options::OPT_Wno_write_strings, options::OPT_w);
3762 if (WriteStrings &&
3763 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003764 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003765 }
3766
Chandler Carruth61fbf622011-04-23 09:27:53 +00003767 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003768 // during C++ compilation, which it is by default. GCC keeps this define even
3769 // in the presence of '-w', match this behavior bug-for-bug.
3770 if (types::isCXX(InputType) &&
3771 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3772 true)) {
3773 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003774 }
3775
Chandler Carruthe0391482010-05-22 02:21:53 +00003776 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3777 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3778 if (Asm->getOption().matches(options::OPT_fasm))
3779 CmdArgs.push_back("-fgnu-keywords");
3780 else
3781 CmdArgs.push_back("-fno-gnu-keywords");
3782 }
3783
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003784 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3785 CmdArgs.push_back("-fno-dwarf-directory-asm");
3786
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003787 if (ShouldDisableAutolink(Args, getToolChain()))
3788 CmdArgs.push_back("-fno-autolink");
3789
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003790 // Add in -fdebug-compilation-dir if necessary.
3791 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003792
Richard Smith9a568822011-11-21 19:36:32 +00003793 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3794 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003795 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003796 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003797 }
3798
Richard Smith79c927b2013-11-06 19:31:51 +00003799 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3800 CmdArgs.push_back("-foperator-arrow-depth");
3801 CmdArgs.push_back(A->getValue());
3802 }
3803
Richard Smith9a568822011-11-21 19:36:32 +00003804 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3805 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003806 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003807 }
3808
Richard Smitha3d3bd22013-05-08 02:12:03 +00003809 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3810 CmdArgs.push_back("-fconstexpr-steps");
3811 CmdArgs.push_back(A->getValue());
3812 }
3813
Richard Smithb3a14522013-02-22 01:59:51 +00003814 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3815 CmdArgs.push_back("-fbracket-depth");
3816 CmdArgs.push_back(A->getValue());
3817 }
3818
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003819 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3820 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003821 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003822 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003823 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3824 } else
3825 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003826 }
3827
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003828 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003829 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003830
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003831 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3832 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003833 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003834 }
David Chisnall5778fce2009-08-31 16:41:57 +00003835
Chris Lattnere23003d2010-01-09 21:54:33 +00003836 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3837 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003838 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003839 }
3840
Chris Lattnerb35583d2010-04-07 20:49:23 +00003841 CmdArgs.push_back("-ferror-limit");
3842 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003843 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003844 else
3845 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003846
Chandler Carrutha77a7272010-05-06 04:55:18 +00003847 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3848 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003849 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003850 }
3851
3852 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3853 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003854 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003855 }
3856
Richard Smithf6f003a2011-12-16 19:06:07 +00003857 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3858 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003859 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003860 }
3861
Nick Lewycky24653262014-12-16 21:39:02 +00003862 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3863 CmdArgs.push_back("-fspell-checking-limit");
3864 CmdArgs.push_back(A->getValue());
3865 }
3866
Daniel Dunbar2c978472009-11-04 06:24:47 +00003867 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003868 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003869 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003870 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003871 } else {
3872 // If -fmessage-length=N was not specified, determine whether this is a
3873 // terminal and, if so, implicitly define -fmessage-length appropriately.
3874 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003875 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003876 }
3877
John McCallb4a99d32013-02-19 01:57:35 +00003878 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3879 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3880 options::OPT_fvisibility_ms_compat)) {
3881 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3882 CmdArgs.push_back("-fvisibility");
3883 CmdArgs.push_back(A->getValue());
3884 } else {
3885 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3886 CmdArgs.push_back("-fvisibility");
3887 CmdArgs.push_back("hidden");
3888 CmdArgs.push_back("-ftype-visibility");
3889 CmdArgs.push_back("default");
3890 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003891 }
3892
Douglas Gregor08329632010-06-15 17:05:35 +00003893 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003894
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003895 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3896
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003897 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003898 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3899 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003900 CmdArgs.push_back("-ffreestanding");
3901
Daniel Dunbare357d562009-12-03 18:42:11 +00003902 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003903 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003904 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003905 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3906 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003907 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003908 // AltiVec language extensions aren't relevant for assembling.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003909 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm)
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003910 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003911 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3912 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003913
Alexey Bataevdb390212015-05-20 04:24:19 +00003914 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003915 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3916 options::OPT_fno_openmp, false))
3917 switch (getOpenMPRuntime(getToolChain(), Args)) {
3918 case OMPRT_OMP:
3919 case OMPRT_IOMP5:
3920 // Clang can generate useful OpenMP code for these two runtime libraries.
3921 CmdArgs.push_back("-fopenmp");
3922 break;
3923 default:
3924 // By default, if Clang doesn't know how to generate useful OpenMP code
3925 // for a specific runtime library, we just don't pass the '-fopenmp' flag
3926 // down to the actual compilation.
3927 // FIXME: It would be better to have a mode which *only* omits IR
3928 // generation based on the OpenMP support so that we get consistent
3929 // semantic analysis, etc.
3930 break;
3931 }
Alexey Bataevdb390212015-05-20 04:24:19 +00003932
Peter Collingbourne32701642013-11-01 18:16:25 +00003933 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00003934 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00003935
Eric Christopher459d2712013-02-19 06:16:53 +00003936 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003937 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
3938 const llvm::Triple::ArchType Arch = getToolChain().getArch();
3939 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
3940 Arch == llvm::Triple::ppc64le))
3941 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3942 << "ppc/ppc64/ppc64le";
3943 }
Chad Rosier864dfe12012-03-13 23:45:51 +00003944
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003945 if (getToolChain().SupportsProfiling())
3946 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003947
3948 // -flax-vector-conversions is default.
3949 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3950 options::OPT_fno_lax_vector_conversions))
3951 CmdArgs.push_back("-fno-lax-vector-conversions");
3952
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003953 if (Args.getLastArg(options::OPT_fapple_kext))
3954 CmdArgs.push_back("-fapple-kext");
3955
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003956 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003957 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003958 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003959 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3960 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003961
3962 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3963 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003964 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003965 }
3966
Bob Wilson14adb362012-02-03 06:27:22 +00003967 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003968
Chandler Carruth6e501032011-03-27 00:04:55 +00003969 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3970 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003971 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00003972 if (A->getOption().matches(options::OPT_fwrapv))
3973 CmdArgs.push_back("-fwrapv");
3974 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3975 options::OPT_fno_strict_overflow)) {
3976 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3977 CmdArgs.push_back("-fwrapv");
3978 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003979
3980 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3981 options::OPT_fno_reroll_loops))
3982 if (A->getOption().matches(options::OPT_freroll_loops))
3983 CmdArgs.push_back("-freroll-loops");
3984
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003985 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003986 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3987 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003988
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003989 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3990
Daniel Dunbar4930e332009-11-17 08:07:36 +00003991 // -stack-protector=0 is default.
3992 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00003993 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
3994 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
3995 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
3996 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
3997 Args.ClaimAllArgs(options::OPT_fstack_protector);
3998 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003999 options::OPT_fstack_protector_all,
4000 options::OPT_fstack_protector_strong,
4001 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004002 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004003 StackProtectorLevel = std::max<unsigned>(
4004 LangOptions::SSPOn,
4005 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004006 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004007 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004008 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004009 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004010 } else {
4011 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004012 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004013 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004014 if (StackProtectorLevel) {
4015 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004016 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004017 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004018
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004019 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004020 for (const Arg *A : Args.filtered(options::OPT__param)) {
4021 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004022 if (Str.startswith("ssp-buffer-size=")) {
4023 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004024 CmdArgs.push_back("-stack-protector-buffer-size");
4025 // FIXME: Verify the argument is a valid integer.
4026 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004027 }
Sean Silva14facf32015-06-09 01:57:17 +00004028 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004029 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004030 }
4031
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004032 // Translate -mstackrealign
4033 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4034 false)) {
4035 CmdArgs.push_back("-backend-option");
4036 CmdArgs.push_back("-force-align-stack");
4037 }
4038 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004039 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004040 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4041 }
4042
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004043 if (Args.hasArg(options::OPT_mstack_alignment)) {
4044 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4045 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004046 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004047
Hans Wennborg77dc2362015-01-20 19:45:50 +00004048 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4049 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4050
4051 if (!Size.empty())
4052 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4053 else
4054 CmdArgs.push_back("-mstack-probe-size=0");
4055 }
4056
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004057 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4058 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004059 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4060
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004061 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4062 options::OPT_mno_restrict_it)) {
4063 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4064 CmdArgs.push_back("-backend-option");
4065 CmdArgs.push_back("-arm-restrict-it");
4066 } else {
4067 CmdArgs.push_back("-backend-option");
4068 CmdArgs.push_back("-arm-no-restrict-it");
4069 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004070 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4071 TT.getArch() == llvm::Triple::thumb)) {
4072 // Windows on ARM expects restricted IT blocks
4073 CmdArgs.push_back("-backend-option");
4074 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004075 }
4076
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004077 if (TT.getArch() == llvm::Triple::arm ||
4078 TT.getArch() == llvm::Triple::thumb) {
4079 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
4080 options::OPT_mno_long_calls)) {
4081 if (A->getOption().matches(options::OPT_mlong_calls)) {
4082 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00004083 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00004084 }
4085 }
4086 }
4087
Daniel Dunbard18049a2009-04-07 21:16:11 +00004088 // Forward -f options with positive and negative forms; we translate
4089 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004090 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4091 StringRef fname = A->getValue();
4092 if (!llvm::sys::fs::exists(fname))
4093 D.Diag(diag::err_drv_no_such_file) << fname;
4094 else
4095 A->render(Args, CmdArgs);
4096 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004097
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004098 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004099 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004100 CmdArgs.push_back("-fapple-kext");
4101 if (!Args.hasArg(options::OPT_fbuiltin))
4102 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004103 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004104 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004105 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004106 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004107 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004108
Nuno Lopes13c88c72009-12-16 16:59:22 +00004109 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4110 options::OPT_fno_assume_sane_operator_new))
4111 CmdArgs.push_back("-fno-assume-sane-operator-new");
4112
Daniel Dunbar4930e332009-11-17 08:07:36 +00004113 // -fblocks=0 is default.
4114 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004115 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004116 (Args.hasArg(options::OPT_fgnu_runtime) &&
4117 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4118 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004119 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004120
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004121 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004122 !getToolChain().hasBlocksRuntime())
4123 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004124 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004125
Richard Smith47972af2015-06-16 00:08:24 +00004126 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004127 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004128 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004129 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004130 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004131 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4132 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004133 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004134 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004135 HaveModules = true;
4136 }
4137 }
4138
Richard Smith47972af2015-06-16 00:08:24 +00004139 // -fmodule-maps enables implicit reading of module map files. By default,
4140 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004141 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4142 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004143 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004144 }
4145
Daniel Jasperac42b752013-10-21 06:34:34 +00004146 // -fmodules-decluse checks that modules used are declared so (off by
4147 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004148 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004149 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004150 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004151 }
4152
Daniel Jasper962b38e2014-04-11 11:47:45 +00004153 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4154 // all #included headers are part of modules.
4155 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004156 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004157 CmdArgs.push_back("-fmodules-strict-decluse");
4158 }
4159
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004160 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4161 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4162 options::OPT_fno_implicit_modules)) {
4163 CmdArgs.push_back("-fno-implicit-modules");
4164 }
4165
Daniel Jasperac42b752013-10-21 06:34:34 +00004166 // -fmodule-name specifies the module that is currently being built (or
4167 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004168 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004169
Richard Smith9887d792014-10-17 01:42:53 +00004170 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004171 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004172 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004173
Richard Smithe842a472014-10-22 02:05:46 +00004174 // -fmodule-file can be used to specify files containing precompiled modules.
4175 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4176
4177 // -fmodule-cache-path specifies where our implicitly-built module files
4178 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00004179 SmallString<128> ModuleCachePath;
4180 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
4181 ModuleCachePath = A->getValue();
4182 if (HaveModules) {
4183 if (C.isForDiagnostics()) {
4184 // When generating crash reports, we want to emit the modules along with
4185 // the reproduction sources, so we ignore any provided module path.
4186 ModuleCachePath = Output.getFilename();
4187 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
4188 llvm::sys::path::append(ModuleCachePath, "modules");
4189 } else if (ModuleCachePath.empty()) {
4190 // No module path was provided: use the default.
4191 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
4192 ModuleCachePath);
Ben Langmuir3b7b5402015-02-03 19:28:37 +00004193 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
4194 appendUserToPath(ModuleCachePath);
Justin Bognera88f0122014-06-20 22:59:50 +00004195 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
4196 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004197 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00004198 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
4199 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
4200 }
4201
4202 // When building modules and generating crashdumps, we need to dump a module
4203 // dependency VFS alongside the output.
4204 if (HaveModules && C.isForDiagnostics()) {
4205 SmallString<128> VFSDir(Output.getFilename());
4206 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004207 // Add the cache directory as a temp so the crash diagnostics pick it up.
4208 C.addTempFile(Args.MakeArgString(VFSDir));
4209
Justin Bognera88f0122014-06-20 22:59:50 +00004210 llvm::sys::path::append(VFSDir, "vfs");
4211 CmdArgs.push_back("-module-dependency-dir");
4212 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004213 }
4214
Richard Smith9887d792014-10-17 01:42:53 +00004215 if (HaveModules)
4216 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004217
Douglas Gregor35b04d62013-02-07 19:01:24 +00004218 // Pass through all -fmodules-ignore-macro arguments.
4219 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004220 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4221 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004222
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004223 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4224
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004225 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4226 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4227 D.Diag(diag::err_drv_argument_not_allowed_with)
4228 << A->getAsString(Args) << "-fbuild-session-timestamp";
4229
4230 llvm::sys::fs::file_status Status;
4231 if (llvm::sys::fs::status(A->getValue(), Status))
4232 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004233 CmdArgs.push_back(Args.MakeArgString(
4234 "-fbuild-session-timestamp=" +
4235 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004236 }
4237
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004238 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004239 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4240 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004241 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4242
4243 Args.AddLastArg(CmdArgs,
4244 options::OPT_fmodules_validate_once_per_build_session);
4245 }
4246
Ben Langmuirdcf73862014-03-12 00:06:17 +00004247 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4248
John McCalldfea9982010-04-09 19:12:06 +00004249 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004250 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004251 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004252 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004253
Anders Carlssond470fef2010-11-21 00:09:52 +00004254 // -felide-constructors is the default.
4255 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004256 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004257 CmdArgs.push_back("-fno-elide-constructors");
4258
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004259 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004260
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004261 if (KernelOrKext || (types::isCXX(InputType) &&
4262 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4263 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004264 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004265
Tony Linthicum76329bf2011-12-12 21:14:55 +00004266 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004267 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4268 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004269 CmdArgs.push_back("-fshort-enums");
4270
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004271 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004272 if (Arg *A = Args.getLastArg(
4273 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4274 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4275 if (A->getOption().matches(options::OPT_funsigned_char) ||
4276 A->getOption().matches(options::OPT_fno_signed_char)) {
4277 CmdArgs.push_back("-fno-signed-char");
4278 }
4279 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004280 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004281 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004282
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004283 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004284 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4285 options::OPT_fno_use_cxa_atexit,
4286 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004287 getToolChain().getArch() != llvm::Triple::hexagon &&
4288 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004289 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004290 CmdArgs.push_back("-fno-use-cxa-atexit");
4291
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004292 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004293 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004294 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004295 CmdArgs.push_back("-fms-extensions");
4296
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004297 // -fno-use-line-directives is default.
4298 if (Args.hasFlag(options::OPT_fuse_line_directives,
4299 options::OPT_fno_use_line_directives, false))
4300 CmdArgs.push_back("-fuse-line-directives");
4301
Francois Pichet1b4f1632011-09-17 04:32:15 +00004302 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004303 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004304 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004305 (IsWindowsMSVC &&
4306 Args.hasFlag(options::OPT_fms_extensions,
4307 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004308 CmdArgs.push_back("-fms-compatibility");
4309
David Majnemerc371ff02015-03-22 08:39:22 +00004310 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004311 VersionTuple MSVT = visualstudio::getMSVCVersion(
4312 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4313 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004314 CmdArgs.push_back(
4315 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004316
David Majnemer8db91762015-05-18 04:49:30 +00004317 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4318 if (ImplyVCPPCXXVer) {
4319 if (IsMSVC2015Compatible)
4320 CmdArgs.push_back("-std=c++14");
4321 else
4322 CmdArgs.push_back("-std=c++11");
4323 }
4324
Eric Christopher5ecce122013-02-18 00:38:31 +00004325 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004326 if (Args.hasFlag(options::OPT_fborland_extensions,
4327 options::OPT_fno_borland_extensions, false))
4328 CmdArgs.push_back("-fborland-extensions");
4329
David Majnemerc371ff02015-03-22 08:39:22 +00004330 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4331 // than 19.
4332 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4333 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004334 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004335 CmdArgs.push_back("-fno-threadsafe-statics");
4336
Francois Pichet02744872011-09-01 16:38:08 +00004337 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4338 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004339 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004340 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004341 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004342
Chandler Carruthe03aa552010-04-17 20:17:31 +00004343 // -fgnu-keywords default varies depending on language; only pass if
4344 // specified.
4345 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004346 options::OPT_fno_gnu_keywords))
4347 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004348
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004349 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004350 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004351 CmdArgs.push_back("-fgnu89-inline");
4352
Chad Rosier9c76d242012-03-15 22:31:42 +00004353 if (Args.hasArg(options::OPT_fno_inline))
4354 CmdArgs.push_back("-fno-inline");
4355
Chad Rosier64d6be92012-03-06 21:17:19 +00004356 if (Args.hasArg(options::OPT_fno_inline_functions))
4357 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004358
John McCall5fb5df92012-06-20 06:18:46 +00004359 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004360
John McCall5fb5df92012-06-20 06:18:46 +00004361 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004362 // legacy is the default. Except for deployment taget of 10.5,
4363 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4364 // gets ignored silently.
4365 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004366 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4367 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004368 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004369 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004370 if (getToolChain().UseObjCMixedDispatch())
4371 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4372 else
4373 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4374 }
4375 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004376
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004377 // When ObjectiveC legacy runtime is in effect on MacOSX,
4378 // turn on the option to do Array/Dictionary subscripting
4379 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004380 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004381 getToolChain().getTriple().isMacOSX() &&
4382 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4383 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004384 objcRuntime.isNeXTFamily())
4385 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004386
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004387 // -fencode-extended-block-signature=1 is default.
4388 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4389 CmdArgs.push_back("-fencode-extended-block-signature");
4390 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004391
John McCall24fc0de2011-07-06 00:26:06 +00004392 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4393 // NOTE: This logic is duplicated in ToolChains.cpp.
4394 bool ARC = isObjCAutoRefCount(Args);
4395 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004396 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004397
John McCall24fc0de2011-07-06 00:26:06 +00004398 CmdArgs.push_back("-fobjc-arc");
4399
Chandler Carruth491db322011-11-04 07:34:47 +00004400 // FIXME: It seems like this entire block, and several around it should be
4401 // wrapped in isObjC, but for now we just use it here as this is where it
4402 // was being used previously.
4403 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4404 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4405 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4406 else
4407 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4408 }
4409
John McCall24fc0de2011-07-06 00:26:06 +00004410 // Allow the user to enable full exceptions code emission.
4411 // We define off for Objective-CC, on for Objective-C++.
4412 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4413 options::OPT_fno_objc_arc_exceptions,
4414 /*default*/ types::isCXX(InputType)))
4415 CmdArgs.push_back("-fobjc-arc-exceptions");
4416 }
4417
4418 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4419 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004420 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004421 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004422
John McCall24fc0de2011-07-06 00:26:06 +00004423 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4424 // takes precedence.
4425 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4426 if (!GCArg)
4427 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4428 if (GCArg) {
4429 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004430 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004431 } else if (getToolChain().SupportsObjCGC()) {
4432 GCArg->render(Args, CmdArgs);
4433 } else {
4434 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004435 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004436 }
4437 }
4438
Bob Wilsonb111ec92015-03-02 19:01:14 +00004439 if (Args.hasFlag(options::OPT_fapplication_extension,
4440 options::OPT_fno_application_extension, false))
4441 CmdArgs.push_back("-fapplication-extension");
4442
Reid Klecknerc542d372014-06-27 17:02:02 +00004443 // Handle GCC-style exception args.
4444 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004445 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4446 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004447
4448 if (getToolChain().UseSjLjExceptions())
4449 CmdArgs.push_back("-fsjlj-exceptions");
4450
4451 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004452 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4453 options::OPT_fno_assume_sane_operator_new))
4454 CmdArgs.push_back("-fno-assume-sane-operator-new");
4455
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004456 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4457 // most platforms.
4458 if (Args.hasFlag(options::OPT_fsized_deallocation,
4459 options::OPT_fno_sized_deallocation, false))
4460 CmdArgs.push_back("-fsized-deallocation");
4461
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004462 // -fconstant-cfstrings is default, and may be subject to argument translation
4463 // on Darwin.
4464 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4465 options::OPT_fno_constant_cfstrings) ||
4466 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4467 options::OPT_mno_constant_cfstrings))
4468 CmdArgs.push_back("-fno-constant-cfstrings");
4469
John Thompsoned4e2952009-11-05 20:14:16 +00004470 // -fshort-wchar default varies depending on platform; only
4471 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004472 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4473 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004474 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004475
Hans Wennborg28c96312013-07-31 23:39:13 +00004476 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004477 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004478 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004479 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004480
Daniel Dunbar096ed292011-10-05 21:04:55 +00004481 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4482 // -fno-pack-struct doesn't apply to -fpack-struct=.
4483 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004484 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004485 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004486 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004487 } else if (Args.hasFlag(options::OPT_fpack_struct,
4488 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004489 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004490 }
4491
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004492 // Handle -fmax-type-align=N and -fno-type-align
4493 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4494 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4495 if (!SkipMaxTypeAlign) {
4496 std::string MaxTypeAlignStr = "-fmax-type-align=";
4497 MaxTypeAlignStr += A->getValue();
4498 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4499 }
4500 } else if (getToolChain().getTriple().isOSDarwin()) {
4501 if (!SkipMaxTypeAlign) {
4502 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4503 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4504 }
4505 }
4506
Robert Lytton0e076492013-08-13 09:43:10 +00004507 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004508 if (!Args.hasArg(options::OPT_fcommon))
4509 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004510 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004511 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004512
Daniel Dunbard18049a2009-04-07 21:16:11 +00004513 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004514 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004515 CmdArgs.push_back("-fno-common");
4516
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004517 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004518 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004519 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004520 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004521 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004522 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004523
Daniel Dunbar6358d682010-10-15 22:30:42 +00004524 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004525 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004526 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004527 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004528
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004529 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004530 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4531 StringRef value = inputCharset->getValue();
4532 if (value != "UTF-8")
4533 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4534 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004535 }
4536
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004537 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004538 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4539 StringRef value = execCharset->getValue();
4540 if (value != "UTF-8")
4541 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4542 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004543 }
4544
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004545 // -fcaret-diagnostics is default.
4546 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4547 options::OPT_fno_caret_diagnostics, true))
4548 CmdArgs.push_back("-fno-caret-diagnostics");
4549
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004550 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004551 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004552 options::OPT_fno_diagnostics_fixit_info))
4553 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004554
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004555 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004556 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004557 options::OPT_fno_diagnostics_show_option))
4558 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004559
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004560 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004561 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004562 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004563 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004564 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004565
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004566 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004567 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004568 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004569 }
4570
Chandler Carruthb6766f02011-03-27 01:50:55 +00004571 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004572 options::OPT_fdiagnostics_show_note_include_stack,
4573 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004574 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004575 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004576 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4577 else
4578 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4579 }
4580
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004581 // Color diagnostics are the default, unless the terminal doesn't support
4582 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004583 // Support both clang's -f[no-]color-diagnostics and gcc's
4584 // -f[no-]diagnostics-colors[=never|always|auto].
4585 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004586 for (const auto &Arg : Args) {
4587 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004588 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4589 !O.matches(options::OPT_fdiagnostics_color) &&
4590 !O.matches(options::OPT_fno_color_diagnostics) &&
4591 !O.matches(options::OPT_fno_diagnostics_color) &&
4592 !O.matches(options::OPT_fdiagnostics_color_EQ))
4593 continue;
4594
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004595 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004596 if (O.matches(options::OPT_fcolor_diagnostics) ||
4597 O.matches(options::OPT_fdiagnostics_color)) {
4598 ShowColors = Colors_On;
4599 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4600 O.matches(options::OPT_fno_diagnostics_color)) {
4601 ShowColors = Colors_Off;
4602 } else {
4603 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004604 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004605 if (value == "always")
4606 ShowColors = Colors_On;
4607 else if (value == "never")
4608 ShowColors = Colors_Off;
4609 else if (value == "auto")
4610 ShowColors = Colors_Auto;
4611 else
4612 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004613 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004614 }
4615 }
4616 if (ShowColors == Colors_On ||
4617 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004618 CmdArgs.push_back("-fcolor-diagnostics");
4619
Nico Rieck7857d462013-09-11 00:38:02 +00004620 if (Args.hasArg(options::OPT_fansi_escape_codes))
4621 CmdArgs.push_back("-fansi-escape-codes");
4622
Daniel Dunbardb097022009-06-08 21:13:54 +00004623 if (!Args.hasFlag(options::OPT_fshow_source_location,
4624 options::OPT_fno_show_source_location))
4625 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004626
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004627 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004628 true))
4629 CmdArgs.push_back("-fno-show-column");
4630
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004631 if (!Args.hasFlag(options::OPT_fspell_checking,
4632 options::OPT_fno_spell_checking))
4633 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004634
Chad Rosierc8e56e82012-12-05 21:08:21 +00004635 // -fno-asm-blocks is default.
4636 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4637 false))
4638 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004639
Steven Wucb0d13f2015-01-16 23:05:28 +00004640 // -fgnu-inline-asm is default.
4641 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4642 options::OPT_fno_gnu_inline_asm, true))
4643 CmdArgs.push_back("-fno-gnu-inline-asm");
4644
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004645 // Enable vectorization per default according to the optimization level
4646 // selected. For optimization levels that want vectorization we use the alias
4647 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004648 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004649 OptSpecifier VectorizeAliasOption =
4650 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004651 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004652 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004653 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004654
Chad Rosier136d67d2014-04-28 19:30:57 +00004655 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004656 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004657 OptSpecifier SLPVectAliasOption =
4658 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004659 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004660 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004661 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004662
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004663 // -fno-slp-vectorize-aggressive is default.
4664 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004665 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004666 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004667
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004668 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4669 A->render(Args, CmdArgs);
4670
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004671 // -fdollars-in-identifiers default varies depending on platform and
4672 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004673 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004674 options::OPT_fno_dollars_in_identifiers)) {
4675 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004676 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004677 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004678 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004679 }
4680
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004681 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4682 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004683 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004684 options::OPT_fno_unit_at_a_time)) {
4685 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004686 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004687 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004688
Eli Friedman055c9702011-11-02 01:53:16 +00004689 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4690 options::OPT_fno_apple_pragma_pack, false))
4691 CmdArgs.push_back("-fapple-pragma-pack");
4692
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004693 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004694 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4695 // by default.
4696 if (getToolChain().getArch() == llvm::Triple::le32) {
4697 CmdArgs.push_back("-fno-math-builtin");
4698 }
4699
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004700// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4701//
4702// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004703#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004704 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004705 (getToolChain().getArch() == llvm::Triple::arm ||
4706 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004707 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4708 CmdArgs.push_back("-fno-builtin-strcat");
4709 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4710 CmdArgs.push_back("-fno-builtin-strcpy");
4711 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004712#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004713
Justin Bognera88f0122014-06-20 22:59:50 +00004714 // Enable rewrite includes if the user's asked for it or if we're generating
4715 // diagnostics.
4716 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4717 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004718 if (Args.hasFlag(options::OPT_frewrite_includes,
4719 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004720 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004721 CmdArgs.push_back("-frewrite-includes");
4722
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004723 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004724 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004725 options::OPT_traditional_cpp)) {
4726 if (isa<PreprocessJobAction>(JA))
4727 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004728 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004729 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004730 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004731
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004732 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004733 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004734
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004735 // Handle serialized diagnostics.
4736 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4737 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004738 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004739 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004740
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004741 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4742 CmdArgs.push_back("-fretain-comments-from-system-headers");
4743
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004744 // Forward -fcomment-block-commands to -cc1.
4745 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004746 // Forward -fparse-all-comments to -cc1.
4747 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004748
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004749 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4750 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004751 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004752 bool OptDisabled = false;
Sean Silva14facf32015-06-09 01:57:17 +00004753 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4754 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004755
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004756 // We translate this by hand to the -cc1 argument, since nightly test uses
4757 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004758 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004759 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004760 OptDisabled = true;
4761 } else
Sean Silva14facf32015-06-09 01:57:17 +00004762 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004763 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004764
Bob Wilson23a55f12014-12-21 07:00:00 +00004765 // With -save-temps, we want to save the unoptimized bitcode output from the
4766 // CompileJobAction, so disable optimizations if they are not already
4767 // disabled.
Reid Kleckner68eb60b2015-02-02 22:41:48 +00004768 if (C.getDriver().isSaveTempsEnabled() && !OptDisabled &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004769 isa<CompileJobAction>(JA))
4770 CmdArgs.push_back("-disable-llvm-optzns");
4771
Daniel Dunbard67a3222009-03-30 06:36:42 +00004772 if (Output.getType() == types::TY_Dependencies) {
4773 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004774 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004775 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004776 CmdArgs.push_back(Output.getFilename());
4777 } else {
4778 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004779 }
4780
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004781 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004782 addDashXForInput(Args, II, CmdArgs);
4783
Daniel Dunbarb440f562010-08-02 02:38:21 +00004784 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004785 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004786 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004787 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004788 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004789
Chris Lattnere9d7d782009-11-03 19:50:27 +00004790 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4791
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004792 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004793
4794 // Optionally embed the -cc1 level arguments into the debug info, for build
4795 // analysis.
4796 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004797 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004798 for (const auto &Arg : Args)
4799 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004800
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004801 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004802 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004803 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004804 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004805 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004806 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004807 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004808 }
4809 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004810 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004811 }
4812
Eric Christopherd3804002013-02-22 20:12:52 +00004813 // Add the split debug info name to the command lines here so we
4814 // can propagate it to the backend.
4815 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004816 getToolChain().getTriple().isOSLinux() &&
4817 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4818 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004819 const char *SplitDwarfOut;
4820 if (SplitDwarf) {
4821 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004822 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004823 CmdArgs.push_back(SplitDwarfOut);
4824 }
4825
4826 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004827 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004828 Output.getType() == types::TY_Object &&
4829 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004830 auto CLCommand =
4831 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4832 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4833 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004834 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004835 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004836 }
4837
Eric Christopherf1545832013-02-22 23:50:16 +00004838 // Handle the debug info splitting at object creation time if we're
4839 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004840 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004841 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004842 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004843
Roman Divacky178e01602011-02-10 16:52:03 +00004844 if (Arg *A = Args.getLastArg(options::OPT_pg))
4845 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004846 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
4847 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004848
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004849 // Claim some arguments which clang supports automatically.
4850
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004851 // -fpch-preprocess is used with gcc to add a special marker in the output to
4852 // include the PCH file. Clang's PTH solution is completely transparent, so we
4853 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004854 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004855
Daniel Dunbar17731772009-03-23 19:03:36 +00004856 // Claim some arguments which clang doesn't support, but we don't
4857 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004858 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4859 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004860
Rafael Espindolab0092d72013-09-04 19:37:35 +00004861 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004862 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004863}
4864
John McCall5fb5df92012-06-20 06:18:46 +00004865/// Add options related to the Objective-C runtime/ABI.
4866///
4867/// Returns true if the runtime is non-fragile.
4868ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4869 ArgStringList &cmdArgs,
4870 RewriteKind rewriteKind) const {
4871 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004872 Arg *runtimeArg =
4873 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
4874 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00004875
4876 // Just forward -fobjc-runtime= to the frontend. This supercedes
4877 // options about fragility.
4878 if (runtimeArg &&
4879 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4880 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004881 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004882 if (runtime.tryParse(value)) {
4883 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004885 }
4886
4887 runtimeArg->render(args, cmdArgs);
4888 return runtime;
4889 }
4890
4891 // Otherwise, we'll need the ABI "version". Version numbers are
4892 // slightly confusing for historical reasons:
4893 // 1 - Traditional "fragile" ABI
4894 // 2 - Non-fragile ABI, version 1
4895 // 3 - Non-fragile ABI, version 2
4896 unsigned objcABIVersion = 1;
4897 // If -fobjc-abi-version= is present, use that to set the version.
4898 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004899 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004900 if (value == "1")
4901 objcABIVersion = 1;
4902 else if (value == "2")
4903 objcABIVersion = 2;
4904 else if (value == "3")
4905 objcABIVersion = 3;
4906 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004907 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00004908 } else {
4909 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004910 bool nonFragileABIIsDefault =
4911 (rewriteKind == RK_NonFragile ||
4912 (rewriteKind == RK_None &&
4913 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00004914 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4915 options::OPT_fno_objc_nonfragile_abi,
4916 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004917// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00004918#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4919 unsigned nonFragileABIVersion = 1;
4920#else
4921 unsigned nonFragileABIVersion = 2;
4922#endif
4923
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004924 if (Arg *abiArg =
4925 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004926 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004927 if (value == "1")
4928 nonFragileABIVersion = 1;
4929 else if (value == "2")
4930 nonFragileABIVersion = 2;
4931 else
4932 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004933 << value;
John McCall5fb5df92012-06-20 06:18:46 +00004934 }
4935
4936 objcABIVersion = 1 + nonFragileABIVersion;
4937 } else {
4938 objcABIVersion = 1;
4939 }
4940 }
4941
4942 // We don't actually care about the ABI version other than whether
4943 // it's non-fragile.
4944 bool isNonFragile = objcABIVersion != 1;
4945
4946 // If we have no runtime argument, ask the toolchain for its default runtime.
4947 // However, the rewriter only really supports the Mac runtime, so assume that.
4948 ObjCRuntime runtime;
4949 if (!runtimeArg) {
4950 switch (rewriteKind) {
4951 case RK_None:
4952 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4953 break;
4954 case RK_Fragile:
4955 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4956 break;
4957 case RK_NonFragile:
4958 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4959 break;
4960 }
4961
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004962 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00004963 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4964 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004965 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004966 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4967
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004968 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00004969 } else {
4970 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4971 }
4972
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004973 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00004974 } else {
4975 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004976 // Legacy behaviour is to target the gnustep runtime if we are i
4977 // non-fragile mode or the GCC runtime in fragile mode.
4978 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004979 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00004980 else
4981 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004982 }
4983
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004984 cmdArgs.push_back(
4985 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00004986 return runtime;
4987}
4988
Reid Klecknerc542d372014-06-27 17:02:02 +00004989static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4990 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4991 I += HaveDash;
4992 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004993}
Reid Klecknerc542d372014-06-27 17:02:02 +00004994
4995struct EHFlags {
4996 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4997 bool Synch;
4998 bool Asynch;
4999 bool NoExceptC;
5000};
5001
5002/// /EH controls whether to run destructor cleanups when exceptions are
5003/// thrown. There are three modifiers:
5004/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5005/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5006/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5007/// - c: Assume that extern "C" functions are implicitly noexcept. This
5008/// modifier is an optimization, so we ignore it for now.
5009/// The default is /EHs-c-, meaning cleanups are disabled.
5010static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5011 EHFlags EH;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005012 std::vector<std::string> EHArgs =
5013 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005014 for (auto EHVal : EHArgs) {
5015 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5016 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005017 case 'a':
5018 EH.Asynch = maybeConsumeDash(EHVal, I);
5019 continue;
5020 case 'c':
5021 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5022 continue;
5023 case 's':
5024 EH.Synch = maybeConsumeDash(EHVal, I);
5025 continue;
5026 default:
5027 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005028 }
5029 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5030 break;
5031 }
5032 }
5033 return EH;
5034}
5035
Hans Wennborg75958c42013-08-08 00:17:41 +00005036void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5037 unsigned RTOptionID = options::OPT__SLASH_MT;
5038
Hans Wennborgf1a74252013-09-10 20:18:04 +00005039 if (Args.hasArg(options::OPT__SLASH_LDd))
5040 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5041 // but defining _DEBUG is sticky.
5042 RTOptionID = options::OPT__SLASH_MTd;
5043
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005044 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005045 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005047 switch (RTOptionID) {
5048 case options::OPT__SLASH_MD:
5049 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005050 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005051 CmdArgs.push_back("-D_MT");
5052 CmdArgs.push_back("-D_DLL");
5053 CmdArgs.push_back("--dependent-lib=msvcrt");
5054 break;
5055 case options::OPT__SLASH_MDd:
5056 CmdArgs.push_back("-D_DEBUG");
5057 CmdArgs.push_back("-D_MT");
5058 CmdArgs.push_back("-D_DLL");
5059 CmdArgs.push_back("--dependent-lib=msvcrtd");
5060 break;
5061 case options::OPT__SLASH_MT:
5062 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005063 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005064 CmdArgs.push_back("-D_MT");
5065 CmdArgs.push_back("--dependent-lib=libcmt");
5066 break;
5067 case options::OPT__SLASH_MTd:
5068 CmdArgs.push_back("-D_DEBUG");
5069 CmdArgs.push_back("-D_MT");
5070 CmdArgs.push_back("--dependent-lib=libcmtd");
5071 break;
5072 default:
5073 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005074 }
5075
Reid Kleckner6beca0e2013-08-08 19:33:10 +00005076 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5077 // users want. The /Za flag to cl.exe turns this off, but it's not
5078 // implemented in clang.
5079 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00005080
Hans Wennborg8858a032014-07-21 23:42:07 +00005081 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5082 // would produce interleaved output, so ignore /showIncludes in such cases.
5083 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5084 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5085 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005086
David Majnemerf6072342014-07-01 22:24:56 +00005087 // This controls whether or not we emit RTTI data for polymorphic types.
5088 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5089 /*default=*/false))
5090 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005091
Reid Klecknerc542d372014-06-27 17:02:02 +00005092 const Driver &D = getToolChain().getDriver();
5093 EHFlags EH = parseClangCLEHFlags(D, Args);
5094 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005095 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005096 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005097 CmdArgs.push_back("-fexceptions");
5098 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005099
Hans Wennborge50cec32014-06-13 20:59:54 +00005100 // /EP should expand to -E -P.
5101 if (Args.hasArg(options::OPT__SLASH_EP)) {
5102 CmdArgs.push_back("-E");
5103 CmdArgs.push_back("-P");
5104 }
5105
David Majnemera5b195a2015-02-14 01:35:12 +00005106 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005107 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5108 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005109 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5110 else
5111 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5112
5113 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5114 VolatileOptionID = A->getOption().getID();
5115
5116 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5117 CmdArgs.push_back("-fms-volatile");
5118
David Majnemer86c318f2014-02-11 21:05:00 +00005119 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5120 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5121 if (MostGeneralArg && BestCaseArg)
5122 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5123 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5124
5125 if (MostGeneralArg) {
5126 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5127 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5128 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5129
5130 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5131 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5132 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5133 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5134 << FirstConflict->getAsString(Args)
5135 << SecondConflict->getAsString(Args);
5136
5137 if (SingleArg)
5138 CmdArgs.push_back("-fms-memptr-rep=single");
5139 else if (MultipleArg)
5140 CmdArgs.push_back("-fms-memptr-rep=multiple");
5141 else
5142 CmdArgs.push_back("-fms-memptr-rep=virtual");
5143 }
5144
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005145 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5146 A->render(Args, CmdArgs);
5147
Hans Wennborg81f74482013-09-10 01:07:07 +00005148 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5149 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005150 if (Args.hasArg(options::OPT__SLASH_fallback))
5151 CmdArgs.push_back("msvc-fallback");
5152 else
5153 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005154 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005155}
5156
Douglas Katzman95354292015-06-23 20:42:09 +00005157visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005158 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005159 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005160 return CLFallback.get();
5161}
5162
Daniel Sanders7f933f42015-01-30 17:35:23 +00005163void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5164 ArgStringList &CmdArgs) const {
5165 StringRef CPUName;
5166 StringRef ABIName;
5167 const llvm::Triple &Triple = getToolChain().getTriple();
5168 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5169
5170 CmdArgs.push_back("-target-abi");
5171 CmdArgs.push_back(ABIName.data());
5172}
5173
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005174void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005175 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005176 const ArgList &Args,
5177 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005178 ArgStringList CmdArgs;
5179
5180 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5181 const InputInfo &Input = Inputs[0];
5182
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005183 // Don't warn about "clang -w -c foo.s"
5184 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005185 // and "clang -emit-llvm -c foo.s"
5186 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005187
Rafael Espindola577637a2015-01-03 00:06:04 +00005188 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005189
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005190 // Invoke ourselves in -cc1as mode.
5191 //
5192 // FIXME: Implement custom jobs for internal actions.
5193 CmdArgs.push_back("-cc1as");
5194
5195 // Add the "effective" target triple.
5196 CmdArgs.push_back("-triple");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005197 std::string TripleStr =
5198 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005199 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5200
5201 // Set the output mode, we currently only expect to be used as a real
5202 // assembler.
5203 CmdArgs.push_back("-filetype");
5204 CmdArgs.push_back("obj");
5205
Eric Christopher45f2e712012-12-18 00:31:10 +00005206 // Set the main file name, so that debug info works even with
5207 // -save-temps or preprocessed assembly.
5208 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005209 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005210
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005211 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005212 const llvm::Triple Triple(TripleStr);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005213 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005214 if (!CPU.empty()) {
5215 CmdArgs.push_back("-target-cpu");
5216 CmdArgs.push_back(Args.MakeArgString(CPU));
5217 }
5218
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005219 // Add the target features
5220 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005221 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005222
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005223 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005224 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005225
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005226 // Pass along any -I options so we get proper .include search paths.
5227 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5228
Eric Christopherfc3ee562012-01-10 00:38:01 +00005229 // Determine the original source input.
5230 const Action *SourceAction = &JA;
5231 while (SourceAction->getKind() != Action::InputClass) {
5232 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5233 SourceAction = SourceAction->getInputs()[0];
5234 }
5235
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005236 // Forward -g and handle debug info related flags, assuming we are dealing
5237 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005238 if (SourceAction->getType() == types::TY_Asm ||
5239 SourceAction->getType() == types::TY_PP_Asm) {
5240 Args.ClaimAllArgs(options::OPT_g_Group);
5241 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5242 if (!A->getOption().matches(options::OPT_g0))
5243 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005244
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005245 if (Args.hasArg(options::OPT_gdwarf_2))
5246 CmdArgs.push_back("-gdwarf-2");
5247 if (Args.hasArg(options::OPT_gdwarf_3))
5248 CmdArgs.push_back("-gdwarf-3");
5249 if (Args.hasArg(options::OPT_gdwarf_4))
5250 CmdArgs.push_back("-gdwarf-4");
5251
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005252 // Add the -fdebug-compilation-dir flag if needed.
5253 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005254
5255 // Set the AT_producer to the clang version when using the integrated
5256 // assembler on assembly source files.
5257 CmdArgs.push_back("-dwarf-debug-producer");
5258 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00005259 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005260
5261 // Optionally embed the -cc1as level arguments into the debug info, for build
5262 // analysis.
5263 if (getToolChain().UseDwarfDebugFlags()) {
5264 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005265 for (const auto &Arg : Args)
5266 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005267
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005268 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005269 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5270 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005271 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005272 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005273 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005274 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005275 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005276 }
5277 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005278 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005279 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005280
5281 // FIXME: Add -static support, once we have it.
5282
Daniel Sanders7f933f42015-01-30 17:35:23 +00005283 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005284 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005285 default:
5286 break;
5287
5288 case llvm::Triple::mips:
5289 case llvm::Triple::mipsel:
5290 case llvm::Triple::mips64:
5291 case llvm::Triple::mips64el:
5292 AddMIPSTargetArgs(Args, CmdArgs);
5293 break;
5294 }
5295
David Blaikie372d9502014-01-17 03:17:40 +00005296 // Consume all the warning flags. Usually this would be handled more
5297 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5298 // doesn't handle that so rather than warning about unused flags that are
5299 // actually used, we'll lie by omission instead.
5300 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005301 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5302 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005303
David Blaikie9260ed62013-07-25 21:19:01 +00005304 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5305 getToolChain().getDriver());
5306
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005307 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005308
5309 assert(Output.isFilename() && "Unexpected lipo output.");
5310 CmdArgs.push_back("-o");
5311 CmdArgs.push_back(Output.getFilename());
5312
Daniel Dunbarb440f562010-08-02 02:38:21 +00005313 assert(Input.isFilename() && "Invalid input.");
5314 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005315
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005316 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005317 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005318
5319 // Handle the debug info splitting at object creation time if we're
5320 // creating an object.
5321 // TODO: Currently only works on linux with newer objcopy.
5322 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005323 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005324 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005325 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005326}
5327
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005328void GnuTool::anchor() {}
5329
Daniel Dunbara3246a02009-03-18 08:07:30 +00005330void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005331 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005332 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005333 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005334 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005335 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005336
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005337 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005338 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005339 // Don't forward any -g arguments to assembly steps.
5340 if (isa<AssembleJobAction>(JA) &&
5341 A->getOption().matches(options::OPT_g_Group))
5342 continue;
5343
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005344 // Don't forward any -W arguments to assembly and link steps.
5345 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5346 A->getOption().matches(options::OPT_W_Group))
5347 continue;
5348
Daniel Dunbar2da02722009-03-19 07:55:12 +00005349 // It is unfortunate that we have to claim here, as this means
5350 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005351 // platforms using a generic gcc, even if we are just using gcc
5352 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005353 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005354 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005355 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005356 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005357
Daniel Dunbar4e295052010-01-25 22:35:08 +00005358 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005359
5360 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005361 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005362 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005363 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005364 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005365 }
5366
Daniel Dunbar5716d872009-05-02 21:41:52 +00005367 // Try to force gcc to match the tool chain we want, if we recognize
5368 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005369 //
5370 // FIXME: The triple class should directly provide the information we want
5371 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005372 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005373 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005374 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005375 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5376 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005377 CmdArgs.push_back("-m64");
5378
Daniel Dunbarb440f562010-08-02 02:38:21 +00005379 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005380 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005381 CmdArgs.push_back(Output.getFilename());
5382 } else {
5383 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005384 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005385 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005386
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005387 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005388
5389 // Only pass -x if gcc will understand it; otherwise hope gcc
5390 // understands the suffix correctly. The main use case this would go
5391 // wrong in is for linker inputs if they happened to have an odd
5392 // suffix; really the only way to get this to happen is a command
5393 // like '-x foobar a.c' which will treat a.c like a linker input.
5394 //
5395 // FIXME: For the linker case specifically, can we safely convert
5396 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005397 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005398 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005399 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5400 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005401 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005402 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005403 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005404 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005405 else if (II.getType() == types::TY_ModuleFile)
5406 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005407 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005408
Daniel Dunbara3246a02009-03-18 08:07:30 +00005409 if (types::canTypeBeUserSpecified(II.getType())) {
5410 CmdArgs.push_back("-x");
5411 CmdArgs.push_back(types::getTypeName(II.getType()));
5412 }
5413
Daniel Dunbarb440f562010-08-02 02:38:21 +00005414 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005415 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005416 else {
5417 const Arg &A = II.getInputArg();
5418
5419 // Reverse translate some rewritten options.
5420 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5421 CmdArgs.push_back("-lstdc++");
5422 continue;
5423 }
5424
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005425 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005426 A.render(Args, CmdArgs);
5427 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005428 }
5429
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005430 const std::string customGCCName = D.getCCCGenericGCCName();
5431 const char *GCCName;
5432 if (!customGCCName.empty())
5433 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005434 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005435 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005436 } else
5437 GCCName = "gcc";
5438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005439 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005440 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005441}
5442
Douglas Katzman95354292015-06-23 20:42:09 +00005443void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5444 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005445 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005446}
5447
Douglas Katzman95354292015-06-23 20:42:09 +00005448void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5449 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005450 const Driver &D = getToolChain().getDriver();
5451
Eric Christophercc7ff502015-01-29 00:56:17 +00005452 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005453 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005454 case types::TY_LLVM_IR:
5455 case types::TY_LTO_IR:
5456 case types::TY_LLVM_BC:
5457 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005458 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005459 break;
5460 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005461 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005462 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005463 case types::TY_Nothing:
5464 CmdArgs.push_back("-fsyntax-only");
5465 break;
5466 default:
5467 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005468 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005469}
5470
Douglas Katzman95354292015-06-23 20:42:09 +00005471void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5472 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005473 // The types are (hopefully) good enough.
5474}
5475
Tony Linthicum76329bf2011-12-12 21:14:55 +00005476// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005477void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5478 ArgStringList &CmdArgs) const {}
5479void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5480 const InputInfo &Output,
5481 const InputInfoList &Inputs,
5482 const ArgList &Args,
5483 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005484 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005485
5486 const Driver &D = getToolChain().getDriver();
5487 ArgStringList CmdArgs;
5488
5489 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005490 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005491 CmdArgs.push_back(Args.MakeArgString(MarchString));
5492
5493 RenderExtraToolArgs(JA, CmdArgs);
5494
5495 if (Output.isFilename()) {
5496 CmdArgs.push_back("-o");
5497 CmdArgs.push_back(Output.getFilename());
5498 } else {
5499 assert(Output.isNothing() && "Unexpected output");
5500 CmdArgs.push_back("-fsyntax-only");
5501 }
5502
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005503 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005504 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005505
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005506 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005507
Tony Linthicum76329bf2011-12-12 21:14:55 +00005508 // Only pass -x if gcc will understand it; otherwise hope gcc
5509 // understands the suffix correctly. The main use case this would go
5510 // wrong in is for linker inputs if they happened to have an odd
5511 // suffix; really the only way to get this to happen is a command
5512 // like '-x foobar a.c' which will treat a.c like a linker input.
5513 //
5514 // FIXME: For the linker case specifically, can we safely convert
5515 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005516 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005517 // Don't try to pass LLVM or AST inputs to a generic gcc.
5518 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5519 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5520 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005521 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005522 else if (II.getType() == types::TY_AST)
5523 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005524 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005525 else if (II.getType() == types::TY_ModuleFile)
5526 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005527 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005528
5529 if (II.isFilename())
5530 CmdArgs.push_back(II.getFilename());
5531 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005532 // Don't render as input, we need gcc to do the translations.
5533 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005534 II.getInputArg().render(Args, CmdArgs);
5535 }
5536
5537 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005538 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005539 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005540}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005541
Douglas Katzman95354292015-06-23 20:42:09 +00005542void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5543 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005544 // The types are (hopefully) good enough.
5545}
5546
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005547static void constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005548 const toolchains::Hexagon_TC &ToolChain,
5549 const InputInfo &Output,
5550 const InputInfoList &Inputs,
5551 const ArgList &Args,
5552 ArgStringList &CmdArgs,
5553 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005554
Matthew Curtise689b052012-12-06 15:46:07 +00005555 const Driver &D = ToolChain.getDriver();
5556
Matthew Curtise689b052012-12-06 15:46:07 +00005557 //----------------------------------------------------------------------------
5558 //
5559 //----------------------------------------------------------------------------
5560 bool hasStaticArg = Args.hasArg(options::OPT_static);
5561 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005562 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005563 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5564 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5565 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005566 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005567 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005568
Matthew Curtise689b052012-12-06 15:46:07 +00005569 //----------------------------------------------------------------------------
5570 // Silence warnings for various options
5571 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005572
Matthew Curtise689b052012-12-06 15:46:07 +00005573 Args.ClaimAllArgs(options::OPT_g_Group);
5574 Args.ClaimAllArgs(options::OPT_emit_llvm);
5575 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5576 // handled somewhere else.
5577 Args.ClaimAllArgs(options::OPT_static_libgcc);
5578
5579 //----------------------------------------------------------------------------
5580 //
5581 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005582 for (const auto &Opt : ToolChain.ExtraOpts)
5583 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005584
Matthew Curtisf10a5952012-12-06 14:16:43 +00005585 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5586 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005587
Matthew Curtise689b052012-12-06 15:46:07 +00005588 if (buildingLib) {
5589 CmdArgs.push_back("-shared");
5590 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5591 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005592 }
5593
Matthew Curtise689b052012-12-06 15:46:07 +00005594 if (hasStaticArg)
5595 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005596
Matthew Curtise8f80a12012-12-06 17:49:03 +00005597 if (buildPIE && !buildingLib)
5598 CmdArgs.push_back("-pie");
5599
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005600 if (const char *v = toolchains::Hexagon_TC::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005601 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
5602 useG0 = toolchains::Hexagon_TC::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005603 }
5604
Matthew Curtise689b052012-12-06 15:46:07 +00005605 //----------------------------------------------------------------------------
5606 //
5607 //----------------------------------------------------------------------------
5608 CmdArgs.push_back("-o");
5609 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005610
Matthew Curtise689b052012-12-06 15:46:07 +00005611 const std::string MarchSuffix = "/" + MarchString;
5612 const std::string G0Suffix = "/G0";
5613 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005614 const std::string RootDir =
5615 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005616 const std::string StartFilesDir =
5617 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005618
5619 //----------------------------------------------------------------------------
5620 // moslib
5621 //----------------------------------------------------------------------------
5622 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005623 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005624
Sean Silva14facf32015-06-09 01:57:17 +00005625 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5626 A->claim();
5627 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005628 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005629 }
Matthew Curtise689b052012-12-06 15:46:07 +00005630 if (oslibs.empty()) {
5631 oslibs.push_back("standalone");
5632 hasStandalone = true;
5633 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005634
Matthew Curtise689b052012-12-06 15:46:07 +00005635 //----------------------------------------------------------------------------
5636 // Start Files
5637 //----------------------------------------------------------------------------
5638 if (incStdLib && incStartFiles) {
5639
5640 if (!buildingLib) {
5641 if (hasStandalone) {
5642 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005643 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005644 }
5645 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5646 }
5647 std::string initObj = useShared ? "/initS.o" : "/init.o";
5648 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5649 }
5650
5651 //----------------------------------------------------------------------------
5652 // Library Search Paths
5653 //----------------------------------------------------------------------------
5654 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005655 for (const auto &LibPath : LibPaths)
5656 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005657
5658 //----------------------------------------------------------------------------
5659 //
5660 //----------------------------------------------------------------------------
5661 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5662 Args.AddAllArgs(CmdArgs, options::OPT_e);
5663 Args.AddAllArgs(CmdArgs, options::OPT_s);
5664 Args.AddAllArgs(CmdArgs, options::OPT_t);
5665 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5666
5667 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5668
5669 //----------------------------------------------------------------------------
5670 // Libraries
5671 //----------------------------------------------------------------------------
5672 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005673 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005674 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5675 CmdArgs.push_back("-lm");
5676 }
5677
5678 CmdArgs.push_back("--start-group");
5679
5680 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005681 for (const std::string &Lib : oslibs)
5682 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005683 CmdArgs.push_back("-lc");
5684 }
5685 CmdArgs.push_back("-lgcc");
5686
5687 CmdArgs.push_back("--end-group");
5688 }
5689
5690 //----------------------------------------------------------------------------
5691 // End files
5692 //----------------------------------------------------------------------------
5693 if (incStdLib && incStartFiles) {
5694 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5695 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5696 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005697}
5698
Douglas Katzman95354292015-06-23 20:42:09 +00005699void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5700 const InputInfo &Output,
5701 const InputInfoList &Inputs,
5702 const ArgList &Args,
5703 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005705 const toolchains::Hexagon_TC &ToolChain =
5706 static_cast<const toolchains::Hexagon_TC &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005707
5708 ArgStringList CmdArgs;
5709 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5710 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005711
5712 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005713 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5714 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005715}
5716// Hexagon tools end.
5717
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005718const std::string arm::getARMArch(const ArgList &Args,
5719 const llvm::Triple &Triple) {
5720 std::string MArch;
Bernard Ogden31561762013-12-12 13:27:11 +00005721 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5722 // Otherwise, if we have -march= choose the base CPU for that arch.
5723 MArch = A->getValue();
5724 } else {
5725 // Otherwise, use the Arch from the triple.
5726 MArch = Triple.getArchName();
5727 }
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005728 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005729
5730 // Handle -march=native.
5731 if (MArch == "native") {
5732 std::string CPU = llvm::sys::getHostCPUName();
5733 if (CPU != "generic") {
5734 // Translate the native cpu into the architecture suffix for that CPU.
5735 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5736 // If there is no valid architecture suffix for this CPU we don't know how
5737 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005738 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005739 MArch = "";
5740 else
5741 MArch = std::string("arm") + Suffix;
5742 }
5743 }
5744
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005745 return MArch;
5746}
5747/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5748const char *arm::getARMCPUForMArch(const ArgList &Args,
5749 const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005750 std::string MArch = getARMArch(Args, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005751 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5752 // here means an -march=native that we can't handle, so instead return no CPU.
5753 if (MArch.empty())
5754 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005755
John Brawna95c1a82015-05-08 12:52:18 +00005756 // We need to return an empty string here on invalid MArch values as the
5757 // various places that call this function can't cope with a null result.
5758 const char *result = Triple.getARMCPUForArch(MArch);
5759 if (result)
5760 return result;
5761 else
5762 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005763}
5764
5765/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Gabor Ballabas208826c2015-06-04 17:56:32 +00005766std::string arm::getARMTargetCPU(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005767 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005768 // FIXME: Warn on inconsistent use of -mcpu and -march.
5769 // If we have -mcpu=, use that.
5770 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Gabor Ballabas208826c2015-06-04 17:56:32 +00005771 std::string MCPU = StringRef(A->getValue()).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005772 // Handle -mcpu=native.
5773 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005774 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005775 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005776 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005777 }
5778
5779 return getARMCPUForMArch(Args, Triple);
5780}
5781
5782/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005783/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005784// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005785const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005786 if (CPU == "generic" &&
5787 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5788 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005789
Renato Golin3c007252015-05-28 15:05:53 +00005790 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5791 if (ArchKind == llvm::ARM::AK_INVALID)
5792 return "";
5793 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005794}
5795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005796void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005797 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005798 if (Args.hasArg(options::OPT_r))
5799 return;
5800
John Brawn94fd9632015-05-21 12:19:49 +00005801 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5802 // to generate BE-8 executables.
5803 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5804 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005805}
5806
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005807mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5808 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5809 .Case("mips1", NanLegacy)
5810 .Case("mips2", NanLegacy)
5811 .Case("mips3", NanLegacy)
5812 .Case("mips4", NanLegacy)
5813 .Case("mips5", NanLegacy)
5814 .Case("mips32", NanLegacy)
5815 .Case("mips32r2", NanLegacy)
5816 .Case("mips32r3", NanLegacy | Nan2008)
5817 .Case("mips32r5", NanLegacy | Nan2008)
5818 .Case("mips32r6", Nan2008)
5819 .Case("mips64", NanLegacy)
5820 .Case("mips64r2", NanLegacy)
5821 .Case("mips64r3", NanLegacy | Nan2008)
5822 .Case("mips64r5", NanLegacy | Nan2008)
5823 .Case("mips64r6", Nan2008)
5824 .Default(NanLegacy);
5825}
5826
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005827bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5828 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5829 return A && (A->getValue() == StringRef(Value));
5830}
5831
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005832bool mips::isUCLibc(const ArgList &Args) {
5833 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005834 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005835}
5836
Daniel Sanders2bf13662014-07-10 14:40:57 +00005837bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005838 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5839 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005840 .Case("2008", true)
5841 .Case("legacy", false)
5842 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005843
5844 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005845 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 .Cases("mips32r6", "mips64r6", true)
5847 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005848
5849 return false;
5850}
5851
Daniel Sanders379d44b2014-07-16 11:52:23 +00005852bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00005853 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00005854 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005855 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005856 return false;
5857
5858 if (ABIName != "32")
5859 return false;
5860
Toma Tabacu94ea6862015-06-16 13:54:13 +00005861 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
5862 // present.
5863 if (FloatABI == "soft")
5864 return false;
5865
Daniel Sanders379d44b2014-07-16 11:52:23 +00005866 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005867 .Cases("mips2", "mips3", "mips4", "mips5", true)
5868 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
5869 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
5870 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00005871}
5872
Toma Tabacu94ea6862015-06-16 13:54:13 +00005873bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
5874 StringRef CPUName, StringRef ABIName,
5875 StringRef FloatABI) {
5876 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
5877
5878 // FPXX shouldn't be used if -msingle-float is present.
5879 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
5880 options::OPT_mdouble_float))
5881 if (A->getOption().matches(options::OPT_msingle_float))
5882 UseFPXX = false;
5883
5884 return UseFPXX;
5885}
5886
Tim Northover157d9112014-01-16 08:48:16 +00005887llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005888 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5889 // archs which Darwin doesn't use.
5890
5891 // The matching this routine does is fairly pointless, since it is neither the
5892 // complete architecture list, nor a reasonable subset. The problem is that
5893 // historically the driver driver accepts this and also ties its -march=
5894 // handling to the architecture name, so we need to be careful before removing
5895 // support for it.
5896
5897 // This code must be kept in sync with Clang's Darwin specific argument
5898 // translation.
5899
5900 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005901 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5902 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5903 .Case("ppc64", llvm::Triple::ppc64)
5904 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5905 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5906 llvm::Triple::x86)
5907 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
5908 // This is derived from the driver driver.
5909 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
5910 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
5911 .Cases("armv7s", "xscale", llvm::Triple::arm)
5912 .Case("arm64", llvm::Triple::aarch64)
5913 .Case("r600", llvm::Triple::r600)
5914 .Case("amdgcn", llvm::Triple::amdgcn)
5915 .Case("nvptx", llvm::Triple::nvptx)
5916 .Case("nvptx64", llvm::Triple::nvptx64)
5917 .Case("amdil", llvm::Triple::amdil)
5918 .Case("spir", llvm::Triple::spir)
5919 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005920}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005921
Tim Northover157d9112014-01-16 08:48:16 +00005922void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005923 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00005924 T.setArch(Arch);
5925
5926 if (Str == "x86_64h")
5927 T.setArchName(Str);
5928 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5929 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005930 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005931 }
5932}
5933
Bob Wilsondecc03e2012-11-23 06:14:39 +00005934const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00005935 const InputInfo &Input) {
5936 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005937}
5938
Bob Wilsondecc03e2012-11-23 06:14:39 +00005939const char *Clang::getBaseInputStem(const ArgList &Args,
5940 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00005941 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005942
Chris Lattner906bb902011-01-16 08:14:11 +00005943 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005944 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005945
5946 return Str;
5947}
5948
Bob Wilsondecc03e2012-11-23 06:14:39 +00005949const char *Clang::getDependencyFileName(const ArgList &Args,
5950 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005951 // FIXME: Think about this more.
5952 std::string Res;
5953
5954 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005955 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005956 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005957 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005958 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005959 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005960 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005961}
5962
Douglas Katzman95354292015-06-23 20:42:09 +00005963void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5964 const InputInfo &Output,
5965 const InputInfoList &Inputs,
5966 const ArgList &Args,
5967 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00005968 const ToolChain &ToolChain = getToolChain();
5969 const Driver &D = ToolChain.getDriver();
5970 ArgStringList CmdArgs;
5971
5972 // Silence warning for "clang -g foo.o -o foo"
5973 Args.ClaimAllArgs(options::OPT_g_Group);
5974 // and "clang -emit-llvm foo.o -o foo"
5975 Args.ClaimAllArgs(options::OPT_emit_llvm);
5976 // and for "clang -w foo.o -o foo". Other warning options are already
5977 // handled somewhere else.
5978 Args.ClaimAllArgs(options::OPT_w);
5979
5980 if (!D.SysRoot.empty())
5981 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5982
5983 // CloudABI only supports static linkage.
5984 CmdArgs.push_back("-Bstatic");
5985 CmdArgs.push_back("--eh-frame-hdr");
5986 CmdArgs.push_back("--gc-sections");
5987
5988 if (Output.isFilename()) {
5989 CmdArgs.push_back("-o");
5990 CmdArgs.push_back(Output.getFilename());
5991 } else {
5992 assert(Output.isNothing() && "Invalid output.");
5993 }
5994
5995 if (!Args.hasArg(options::OPT_nostdlib) &&
5996 !Args.hasArg(options::OPT_nostartfiles)) {
5997 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
5998 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
5999 }
6000
6001 Args.AddAllArgs(CmdArgs, options::OPT_L);
6002 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6003 for (const auto &Path : Paths)
6004 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
6005 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6006 Args.AddAllArgs(CmdArgs, options::OPT_e);
6007 Args.AddAllArgs(CmdArgs, options::OPT_s);
6008 Args.AddAllArgs(CmdArgs, options::OPT_t);
6009 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6010 Args.AddAllArgs(CmdArgs, options::OPT_r);
6011
Alexey Samsonov907880e2015-06-19 19:57:46 +00006012 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006013 AddGoldPlugin(ToolChain, Args, CmdArgs);
6014
6015 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6016
6017 if (!Args.hasArg(options::OPT_nostdlib) &&
6018 !Args.hasArg(options::OPT_nodefaultlibs)) {
6019 if (D.CCCIsCXX())
6020 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6021 CmdArgs.push_back("-lc");
6022 CmdArgs.push_back("-lcompiler_rt");
6023 }
6024
6025 if (!Args.hasArg(options::OPT_nostdlib) &&
6026 !Args.hasArg(options::OPT_nostartfiles))
6027 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6028
6029 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
6030 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
6031}
6032
Douglas Katzman95354292015-06-23 20:42:09 +00006033void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6034 const InputInfo &Output,
6035 const InputInfoList &Inputs,
6036 const ArgList &Args,
6037 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006038 ArgStringList CmdArgs;
6039
6040 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6041 const InputInfo &Input = Inputs[0];
6042
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006043 // Determine the original source input.
6044 const Action *SourceAction = &JA;
6045 while (SourceAction->getKind() != Action::InputClass) {
6046 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6047 SourceAction = SourceAction->getInputs()[0];
6048 }
6049
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006050 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006051 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006052 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6053 // FIXME: at run-time detect assembler capabilities or rely on version
6054 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006055 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006056 const llvm::Triple &T(getToolChain().getTriple());
6057 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006058 CmdArgs.push_back("-Q");
6059 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006060
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006061 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006062 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006063 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006064 if (Args.hasArg(options::OPT_gstabs))
6065 CmdArgs.push_back("--gstabs");
6066 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006067 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006068 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006069
Daniel Dunbarbe220842009-03-20 16:06:39 +00006070 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006071 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006072
Daniel Dunbar6d484762010-07-22 01:47:22 +00006073 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006074 if (getToolChain().getArch() == llvm::Triple::x86 ||
6075 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006076 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6077 CmdArgs.push_back("-force_cpusubtype_ALL");
6078
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006079 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006080 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006081 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006082 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006083 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006084 CmdArgs.push_back("-static");
6085
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006086 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006087
6088 assert(Output.isFilename() && "Unexpected lipo output.");
6089 CmdArgs.push_back("-o");
6090 CmdArgs.push_back(Output.getFilename());
6091
Daniel Dunbarb440f562010-08-02 02:38:21 +00006092 assert(Input.isFilename() && "Invalid input.");
6093 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006094
6095 // asm_final spec is empty.
6096
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006097 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006098 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006099}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006100
Tim Northover157d9112014-01-16 08:48:16 +00006101void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006102
Tim Northover157d9112014-01-16 08:48:16 +00006103void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6104 ArgStringList &CmdArgs) const {
6105 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006106
Daniel Dunbarc1964212009-03-26 16:23:12 +00006107 // Derived from darwin_arch spec.
6108 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006109 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006110
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006111 // FIXME: Is this needed anymore?
6112 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006113 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006114}
6115
Douglas Katzman95354292015-06-23 20:42:09 +00006116bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006117 // We only need to generate a temp path for LTO if we aren't compiling object
6118 // files. When compiling source files, we run 'dsymutil' after linking. We
6119 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006120 for (const auto &Input : Inputs)
6121 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006122 return true;
6123
6124 return false;
6125}
6126
Douglas Katzman95354292015-06-23 20:42:09 +00006127void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6128 ArgStringList &CmdArgs,
6129 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006130 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006131 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006132
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006133 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006134 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6135 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006136 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6137 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006138 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006139 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006140 }
6141
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006142 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006143 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006144 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6145 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006146
Bob Wilson3d27dad2013-08-02 22:25:34 +00006147 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6148 CmdArgs.push_back("-export_dynamic");
6149
Bob Wilsonb111ec92015-03-02 19:01:14 +00006150 // If we are using App Extension restrictions, pass a flag to the linker
6151 // telling it that the compiled code has been audited.
6152 if (Args.hasFlag(options::OPT_fapplication_extension,
6153 options::OPT_fno_application_extension, false))
6154 CmdArgs.push_back("-application_extension");
6155
Bill Wendling313b6bf2012-11-16 23:03:00 +00006156 // If we are using LTO, then automatically create a temporary file path for
6157 // the linker to use, so that it's lifetime will extend past a possible
6158 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006159 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006160 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006161 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006162 C.addTempFile(TmpPath);
6163 CmdArgs.push_back("-object_path_lto");
6164 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006165 }
6166
Daniel Dunbarc1964212009-03-26 16:23:12 +00006167 // Derived from the "link" spec.
6168 Args.AddAllArgs(CmdArgs, options::OPT_static);
6169 if (!Args.hasArg(options::OPT_static))
6170 CmdArgs.push_back("-dynamic");
6171 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6172 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6173 // here. How do we wish to handle such things?
6174 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006175
Daniel Dunbarc1964212009-03-26 16:23:12 +00006176 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006177 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006178 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006179 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006180
6181 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6182 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6183 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6184
6185 Arg *A;
6186 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6187 (A = Args.getLastArg(options::OPT_current__version)) ||
6188 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006189 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6190 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006191
6192 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6193 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6194 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6195 } else {
6196 CmdArgs.push_back("-dylib");
6197
6198 Arg *A;
6199 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6200 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6201 (A = Args.getLastArg(options::OPT_client__name)) ||
6202 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6203 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6204 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006205 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6206 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006207
Daniel Dunbarc1964212009-03-26 16:23:12 +00006208 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6209 "-dylib_compatibility_version");
6210 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6211 "-dylib_current_version");
6212
Tim Northover157d9112014-01-16 08:48:16 +00006213 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006214
6215 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6216 "-dylib_install_name");
6217 }
6218
6219 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6220 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6221 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006222 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006223 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006224 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6225 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6226 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6227 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6228 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6229 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006230 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006231 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6232 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6233 Args.AddAllArgs(CmdArgs, options::OPT_init);
6234
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006235 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006236 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006237
Daniel Dunbarc1964212009-03-26 16:23:12 +00006238 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6239 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6240 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6241 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6242 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006244 if (const Arg *A =
6245 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6246 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006247 if (A->getOption().matches(options::OPT_fpie) ||
6248 A->getOption().matches(options::OPT_fPIE))
6249 CmdArgs.push_back("-pie");
6250 else
6251 CmdArgs.push_back("-no_pie");
6252 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006253
6254 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6255 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6256 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6257 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6258 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6259 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6260 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6261 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6262 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6263 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6264 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6265 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6266 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6267 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6268 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6269 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006270
Daniel Dunbar84384642011-05-02 21:03:47 +00006271 // Give --sysroot= preference, over the Apple specific behavior to also use
6272 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006273 StringRef sysroot = C.getSysRoot();
6274 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006275 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006276 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006277 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6278 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006279 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006280 }
6281
Daniel Dunbarc1964212009-03-26 16:23:12 +00006282 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6283 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6284 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6285 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6286 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006287 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006288 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6289 Args.AddAllArgs(CmdArgs, options::OPT_y);
6290 Args.AddLastArg(CmdArgs, options::OPT_w);
6291 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6292 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6293 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6294 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6295 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6296 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6297 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6298 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6299 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6300 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6301 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6302 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6303}
6304
Douglas Katzman95354292015-06-23 20:42:09 +00006305void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6306 const InputInfo &Output,
6307 const InputInfoList &Inputs,
6308 const ArgList &Args,
6309 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006310 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006311
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006312 // If the number of arguments surpasses the system limits, we will encode the
6313 // input files in a separate file, shortening the command line. To this end,
6314 // build a list of input file names that can be passed via a file with the
6315 // -filelist linker option.
6316 llvm::opt::ArgStringList InputFileList;
6317
Daniel Dunbarc1964212009-03-26 16:23:12 +00006318 // The logic here is derived from gcc's behavior; most of which
6319 // comes from specs (starting with link_command). Consult gcc for
6320 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006321 ArgStringList CmdArgs;
6322
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006323 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6324 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6325 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006326 for (const auto &Arg : Args)
6327 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006328 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006329 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006330 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00006331 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006332 return;
6333 }
6334
Daniel Dunbarc1964212009-03-26 16:23:12 +00006335 // I'm not sure why this particular decomposition exists in gcc, but
6336 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006337 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006338
Daniel Dunbarc1964212009-03-26 16:23:12 +00006339 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
6340 Args.AddAllArgs(CmdArgs, options::OPT_s);
6341 Args.AddAllArgs(CmdArgs, options::OPT_t);
6342 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6343 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006344 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006345 Args.AddAllArgs(CmdArgs, options::OPT_r);
6346
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006347 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6348 // members of static archive libraries which implement Objective-C classes or
6349 // categories.
6350 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6351 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006352
Daniel Dunbarc1964212009-03-26 16:23:12 +00006353 CmdArgs.push_back("-o");
6354 CmdArgs.push_back(Output.getFilename());
6355
Chad Rosier06fd3c62012-05-16 23:45:12 +00006356 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006357 !Args.hasArg(options::OPT_nostartfiles))
6358 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006359
Peter Collingbournec4122c12015-06-15 21:08:13 +00006360 // SafeStack requires its own runtime libraries
6361 // These libraries should be linked first, to make sure the
6362 // __safestack_init constructor executes before everything else
6363 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6364 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6365 "libclang_rt.safestack_osx.a",
6366 /*AlwaysLink=*/true);
6367 }
6368
Daniel Dunbarc1964212009-03-26 16:23:12 +00006369 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006370
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006371 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6372 options::OPT_fno_openmp, false)) {
6373 switch (getOpenMPRuntime(getToolChain(), Args)) {
6374 case OMPRT_OMP:
6375 CmdArgs.push_back("-lomp");
6376 break;
6377 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006378 CmdArgs.push_back("-lgomp");
6379 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006380 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006381 CmdArgs.push_back("-liomp5");
6382 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006383 case OMPRT_Unknown:
6384 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006385 break;
6386 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006387 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006388
Douglas Gregor9295df02012-05-15 21:00:27 +00006389 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006390 // Build the input file for -filelist (list of linker input files) in case we
6391 // need it later
6392 for (const auto &II : Inputs) {
6393 if (!II.isFilename()) {
6394 // This is a linker input argument.
6395 // We cannot mix input arguments and file names in a -filelist input, thus
6396 // we prematurely stop our list (remaining files shall be passed as
6397 // arguments).
6398 if (InputFileList.size() > 0)
6399 break;
6400
6401 continue;
6402 }
6403
6404 InputFileList.push_back(II.getFilename());
6405 }
6406
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006407 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006408 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006409 // We use arclite library for both ARC and subscripting support.
6410 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6411
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006412 CmdArgs.push_back("-framework");
6413 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006414 // Link libobj.
6415 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006416 }
John McCall31168b02011-06-15 23:02:42 +00006417
Daniel Dunbarc1964212009-03-26 16:23:12 +00006418 if (LinkingOutput) {
6419 CmdArgs.push_back("-arch_multiple");
6420 CmdArgs.push_back("-final_output");
6421 CmdArgs.push_back(LinkingOutput);
6422 }
6423
Daniel Dunbarc1964212009-03-26 16:23:12 +00006424 if (Args.hasArg(options::OPT_fnested_functions))
6425 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006426
Justin Bognerc7701242015-05-12 05:44:36 +00006427 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6428 // paths are different enough from other toolchains that this needs a fair
6429 // amount of refactoring done first.
6430 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6431
Daniel Dunbarc1964212009-03-26 16:23:12 +00006432 if (!Args.hasArg(options::OPT_nostdlib) &&
6433 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006434 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006435 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006436
Daniel Dunbarc1964212009-03-26 16:23:12 +00006437 // link_ssp spec is empty.
6438
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006439 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006440 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006441 }
6442
Chad Rosier06fd3c62012-05-16 23:45:12 +00006443 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006444 !Args.hasArg(options::OPT_nostartfiles)) {
6445 // endfile_spec is empty.
6446 }
6447
6448 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6449 Args.AddAllArgs(CmdArgs, options::OPT_F);
6450
Steven Wu3ffb61b2015-02-06 18:08:29 +00006451 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006452 for (const Arg *A : Args.filtered(options::OPT_iframework))
6453 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006454
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006455 if (!Args.hasArg(options::OPT_nostdlib) &&
6456 !Args.hasArg(options::OPT_nodefaultlibs)) {
6457 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6458 if (A->getValue() == StringRef("Accelerate")) {
6459 CmdArgs.push_back("-framework");
6460 CmdArgs.push_back("Accelerate");
6461 }
6462 }
6463 }
6464
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006465 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006466 std::unique_ptr<Command> Cmd =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006467 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006468 Cmd->setInputFileList(std::move(InputFileList));
6469 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006470}
6471
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006472void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006473 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006474 const InputInfoList &Inputs,
6475 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006476 const char *LinkingOutput) const {
6477 ArgStringList CmdArgs;
6478
6479 CmdArgs.push_back("-create");
6480 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006481
6482 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006483 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006484
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006485 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006486 assert(II.isFilename() && "Unexpected lipo input.");
6487 CmdArgs.push_back(II.getFilename());
6488 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006489
6490 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006491 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006492}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006493
Daniel Dunbar88299622010-06-04 18:28:36 +00006494void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006495 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006496 const InputInfoList &Inputs,
6497 const ArgList &Args,
6498 const char *LinkingOutput) const {
6499 ArgStringList CmdArgs;
6500
Daniel Dunbareb86b042011-05-09 17:23:16 +00006501 CmdArgs.push_back("-o");
6502 CmdArgs.push_back(Output.getFilename());
6503
Daniel Dunbar88299622010-06-04 18:28:36 +00006504 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6505 const InputInfo &Input = Inputs[0];
6506 assert(Input.isFilename() && "Unexpected dsymutil input.");
6507 CmdArgs.push_back(Input.getFilename());
6508
Daniel Dunbar88299622010-06-04 18:28:36 +00006509 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006510 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006511 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006512}
6513
Eric Christopher551ef452011-08-23 17:56:55 +00006514void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006515 const InputInfo &Output,
6516 const InputInfoList &Inputs,
6517 const ArgList &Args,
6518 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006519 ArgStringList CmdArgs;
6520 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006521 CmdArgs.push_back("--debug-info");
6522 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006523 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006524
6525 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6526 const InputInfo &Input = Inputs[0];
6527 assert(Input.isFilename() && "Unexpected verify input");
6528
6529 // Grabbing the output of the earlier dsymutil run.
6530 CmdArgs.push_back(Input.getFilename());
6531
6532 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006533 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006534 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006535}
6536
Douglas Katzman95354292015-06-23 20:42:09 +00006537void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006538 const InputInfo &Output,
6539 const InputInfoList &Inputs,
6540 const ArgList &Args,
6541 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006542 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006543 ArgStringList CmdArgs;
6544
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006545 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006546
6547 CmdArgs.push_back("-o");
6548 CmdArgs.push_back(Output.getFilename());
6549
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006550 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006551 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006552
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006553 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006554 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006555}
6556
Douglas Katzman95354292015-06-23 20:42:09 +00006557void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6558 const InputInfo &Output,
6559 const InputInfoList &Inputs,
6560 const ArgList &Args,
6561 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006562 // FIXME: Find a real GCC, don't hard-code versions here
6563 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6564 const llvm::Triple &T = getToolChain().getTriple();
6565 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006566 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006567 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006568 case llvm::Triple::x86:
6569 GCCLibPath +=
6570 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6571 break;
6572 case llvm::Triple::x86_64:
6573 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6574 GCCLibPath += "/4.5.2/amd64/";
6575 LibPath += "amd64/";
6576 break;
6577 default:
6578 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006579 }
6580
6581 ArgStringList CmdArgs;
6582
David Chisnall272a0712012-02-29 15:06:12 +00006583 // Demangle C++ names in errors
6584 CmdArgs.push_back("-C");
6585
David Chisnallf571cde2012-02-15 13:39:01 +00006586 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6587 (!Args.hasArg(options::OPT_shared))) {
6588 CmdArgs.push_back("-e");
6589 CmdArgs.push_back("_start");
6590 }
6591
6592 if (Args.hasArg(options::OPT_static)) {
6593 CmdArgs.push_back("-Bstatic");
6594 CmdArgs.push_back("-dn");
6595 } else {
6596 CmdArgs.push_back("-Bdynamic");
6597 if (Args.hasArg(options::OPT_shared)) {
6598 CmdArgs.push_back("-shared");
6599 } else {
6600 CmdArgs.push_back("--dynamic-linker");
6601 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6602 }
6603 }
6604
6605 if (Output.isFilename()) {
6606 CmdArgs.push_back("-o");
6607 CmdArgs.push_back(Output.getFilename());
6608 } else {
6609 assert(Output.isNothing() && "Invalid output.");
6610 }
6611
6612 if (!Args.hasArg(options::OPT_nostdlib) &&
6613 !Args.hasArg(options::OPT_nostartfiles)) {
6614 if (!Args.hasArg(options::OPT_shared)) {
6615 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
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"));
David Chisnallf571cde2012-02-15 13:39:01 +00006618 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6619 } else {
6620 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006621 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6622 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006623 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006624 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006625 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006626 }
6627
6628 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6629
6630 Args.AddAllArgs(CmdArgs, options::OPT_L);
6631 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6632 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006633 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006634
6635 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6636
6637 if (!Args.hasArg(options::OPT_nostdlib) &&
6638 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006639 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006640 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006641 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006642 if (!Args.hasArg(options::OPT_shared)) {
6643 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006644 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006645 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006646 }
David Chisnallf571cde2012-02-15 13:39:01 +00006647 }
6648
6649 if (!Args.hasArg(options::OPT_nostdlib) &&
6650 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006651 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006652 }
David Chisnall96de9932012-02-16 16:00:47 +00006653 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006654
Alexey Samsonov7811d192014-02-20 13:57:37 +00006655 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006656
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006657 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006658 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006659}
6660
Douglas Katzman95354292015-06-23 20:42:09 +00006661void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6662 const InputInfo &Output,
6663 const InputInfoList &Inputs,
6664 const ArgList &Args,
6665 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006666 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006667 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006668 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006669
Rafael Espindolacc126272014-02-28 01:55:21 +00006670 switch (getToolChain().getArch()) {
6671 case llvm::Triple::x86:
6672 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6673 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006674 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006675 break;
6676
6677 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006678 CmdArgs.push_back("-mppc");
6679 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006680 break;
6681
6682 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006683 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006684 CmdArgs.push_back("-32");
6685 NeedsKPIC = true;
6686 break;
6687
6688 case llvm::Triple::sparcv9:
6689 CmdArgs.push_back("-64");
6690 CmdArgs.push_back("-Av9a");
6691 NeedsKPIC = true;
6692 break;
6693
6694 case llvm::Triple::mips64:
6695 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006696 StringRef CPUName;
6697 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006698 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006699
6700 CmdArgs.push_back("-mabi");
6701 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6702
6703 if (getToolChain().getArch() == llvm::Triple::mips64)
6704 CmdArgs.push_back("-EB");
6705 else
6706 CmdArgs.push_back("-EL");
6707
Rafael Espindolacc126272014-02-28 01:55:21 +00006708 NeedsKPIC = true;
6709 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006710 }
6711
Rafael Espindolacc126272014-02-28 01:55:21 +00006712 default:
6713 break;
6714 }
6715
6716 if (NeedsKPIC)
6717 addAssemblerKPIC(Args, CmdArgs);
6718
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006719 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006720
6721 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006722 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006723
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006724 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006725 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006727 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006728 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006729}
6730
Douglas Katzman95354292015-06-23 20:42:09 +00006731void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6732 const InputInfo &Output,
6733 const InputInfoList &Inputs,
6734 const ArgList &Args,
6735 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006736 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006737 ArgStringList CmdArgs;
6738
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006739 // Silence warning for "clang -g foo.o -o foo"
6740 Args.ClaimAllArgs(options::OPT_g_Group);
6741 // and "clang -emit-llvm foo.o -o foo"
6742 Args.ClaimAllArgs(options::OPT_emit_llvm);
6743 // and for "clang -w foo.o -o foo". Other warning options are already
6744 // handled somewhere else.
6745 Args.ClaimAllArgs(options::OPT_w);
6746
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006747 if (getToolChain().getArch() == llvm::Triple::mips64)
6748 CmdArgs.push_back("-EB");
6749 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6750 CmdArgs.push_back("-EL");
6751
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006752 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006753 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006754 CmdArgs.push_back("-e");
6755 CmdArgs.push_back("__start");
6756 }
6757
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006758 if (Args.hasArg(options::OPT_static)) {
6759 CmdArgs.push_back("-Bstatic");
6760 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006761 if (Args.hasArg(options::OPT_rdynamic))
6762 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006763 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006764 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006765 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006766 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006767 } else {
6768 CmdArgs.push_back("-dynamic-linker");
6769 CmdArgs.push_back("/usr/libexec/ld.so");
6770 }
6771 }
6772
Rafael Espindola044f7832013-06-05 04:28:55 +00006773 if (Args.hasArg(options::OPT_nopie))
6774 CmdArgs.push_back("-nopie");
6775
Daniel Dunbarb440f562010-08-02 02:38:21 +00006776 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006777 CmdArgs.push_back("-o");
6778 CmdArgs.push_back(Output.getFilename());
6779 } else {
6780 assert(Output.isNothing() && "Invalid output.");
6781 }
6782
6783 if (!Args.hasArg(options::OPT_nostdlib) &&
6784 !Args.hasArg(options::OPT_nostartfiles)) {
6785 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006786 if (Args.hasArg(options::OPT_pg))
6787 CmdArgs.push_back(
6788 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00006789 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006790 CmdArgs.push_back(
6791 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6792 CmdArgs.push_back(
6793 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006794 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006795 CmdArgs.push_back(
6796 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006797 }
6798 }
6799
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006800 std::string Triple = getToolChain().getTripleString();
6801 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006802 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006803 CmdArgs.push_back(
6804 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006805
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006806 Args.AddAllArgs(CmdArgs, options::OPT_L);
6807 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6808 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006809 Args.AddAllArgs(CmdArgs, options::OPT_s);
6810 Args.AddAllArgs(CmdArgs, options::OPT_t);
6811 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6812 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006813
Daniel Dunbar54423b22010-09-17 00:24:54 +00006814 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006815
6816 if (!Args.hasArg(options::OPT_nostdlib) &&
6817 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006818 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006819 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006820 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006821 CmdArgs.push_back("-lm_p");
6822 else
6823 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006824 }
6825
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006826 // FIXME: For some reason GCC passes -lgcc before adding
6827 // the default system libraries. Just mimic this for now.
6828 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006829
Eric Christopher17674ec2012-09-13 06:32:34 +00006830 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006831 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
6832 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00006833 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006834 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00006835 }
6836
Chandler Carruth45661652011-12-17 22:32:42 +00006837 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006838 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006839 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00006840 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006841 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006842 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006843
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006844 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006845 }
6846
6847 if (!Args.hasArg(options::OPT_nostdlib) &&
6848 !Args.hasArg(options::OPT_nostartfiles)) {
6849 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006850 CmdArgs.push_back(
6851 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006852 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006853 CmdArgs.push_back(
6854 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006855 }
6856
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006857 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006858 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006859}
Ed Schoutene33194b2009-04-02 19:13:12 +00006860
Douglas Katzman95354292015-06-23 20:42:09 +00006861void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6862 const InputInfo &Output,
6863 const InputInfoList &Inputs,
6864 const ArgList &Args,
6865 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006866 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006867 ArgStringList CmdArgs;
6868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006869 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00006870
6871 CmdArgs.push_back("-o");
6872 CmdArgs.push_back(Output.getFilename());
6873
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006874 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006875 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006876
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006877 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006878 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006879}
6880
Douglas Katzman95354292015-06-23 20:42:09 +00006881void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6882 const InputInfo &Output,
6883 const InputInfoList &Inputs,
6884 const ArgList &Args,
6885 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00006886 const Driver &D = getToolChain().getDriver();
6887 ArgStringList CmdArgs;
6888
6889 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6890 (!Args.hasArg(options::OPT_shared))) {
6891 CmdArgs.push_back("-e");
6892 CmdArgs.push_back("__start");
6893 }
6894
6895 if (Args.hasArg(options::OPT_static)) {
6896 CmdArgs.push_back("-Bstatic");
6897 } else {
6898 if (Args.hasArg(options::OPT_rdynamic))
6899 CmdArgs.push_back("-export-dynamic");
6900 CmdArgs.push_back("--eh-frame-hdr");
6901 CmdArgs.push_back("-Bdynamic");
6902 if (Args.hasArg(options::OPT_shared)) {
6903 CmdArgs.push_back("-shared");
6904 } else {
6905 CmdArgs.push_back("-dynamic-linker");
6906 CmdArgs.push_back("/usr/libexec/ld.so");
6907 }
6908 }
6909
6910 if (Output.isFilename()) {
6911 CmdArgs.push_back("-o");
6912 CmdArgs.push_back(Output.getFilename());
6913 } else {
6914 assert(Output.isNothing() && "Invalid output.");
6915 }
6916
6917 if (!Args.hasArg(options::OPT_nostdlib) &&
6918 !Args.hasArg(options::OPT_nostartfiles)) {
6919 if (!Args.hasArg(options::OPT_shared)) {
6920 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006921 CmdArgs.push_back(
6922 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006923 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006924 CmdArgs.push_back(
6925 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6926 CmdArgs.push_back(
6927 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006928 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006929 CmdArgs.push_back(
6930 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006931 }
6932 }
6933
6934 Args.AddAllArgs(CmdArgs, options::OPT_L);
6935 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6936 Args.AddAllArgs(CmdArgs, options::OPT_e);
6937
6938 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6939
6940 if (!Args.hasArg(options::OPT_nostdlib) &&
6941 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006942 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006943 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6944 if (Args.hasArg(options::OPT_pg))
6945 CmdArgs.push_back("-lm_p");
6946 else
6947 CmdArgs.push_back("-lm");
6948 }
6949
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006950 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006951 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006952 CmdArgs.push_back("-lpthread_p");
6953 else
6954 CmdArgs.push_back("-lpthread");
6955 }
6956
Eli Friedman9fa28852012-08-08 23:57:20 +00006957 if (!Args.hasArg(options::OPT_shared)) {
6958 if (Args.hasArg(options::OPT_pg))
6959 CmdArgs.push_back("-lc_p");
6960 else
6961 CmdArgs.push_back("-lc");
6962 }
6963
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006964 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006965 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006966 case llvm::Triple::arm:
6967 MyArch = "arm";
6968 break;
6969 case llvm::Triple::x86:
6970 MyArch = "i386";
6971 break;
6972 case llvm::Triple::x86_64:
6973 MyArch = "amd64";
6974 break;
6975 default:
6976 llvm_unreachable("Unsupported architecture");
6977 }
6978 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006979 }
6980
6981 if (!Args.hasArg(options::OPT_nostdlib) &&
6982 !Args.hasArg(options::OPT_nostartfiles)) {
6983 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006984 CmdArgs.push_back(
6985 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006986 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006987 CmdArgs.push_back(
6988 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00006989 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006990
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006991 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006992 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006993}
6994
Douglas Katzman95354292015-06-23 20:42:09 +00006995void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6996 const InputInfo &Output,
6997 const InputInfoList &Inputs,
6998 const ArgList &Args,
6999 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007000 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007001 ArgStringList CmdArgs;
7002
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007003 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7004 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007005 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007006 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007007 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007008 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007009 else if (getToolChain().getArch() == llvm::Triple::mips ||
7010 getToolChain().getArch() == llvm::Triple::mipsel ||
7011 getToolChain().getArch() == llvm::Triple::mips64 ||
7012 getToolChain().getArch() == llvm::Triple::mips64el) {
7013 StringRef CPUName;
7014 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007015 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007016
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007017 CmdArgs.push_back("-march");
7018 CmdArgs.push_back(CPUName.data());
7019
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007020 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007021 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007022
7023 if (getToolChain().getArch() == llvm::Triple::mips ||
7024 getToolChain().getArch() == llvm::Triple::mips64)
7025 CmdArgs.push_back("-EB");
7026 else
7027 CmdArgs.push_back("-EL");
7028
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007029 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007030 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007031 getToolChain().getArch() == llvm::Triple::armeb ||
7032 getToolChain().getArch() == llvm::Triple::thumb ||
7033 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007034 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007035 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007036 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7037
7038 if (FloatABI == "hard") {
7039 CmdArgs.push_back("-mfpu=vfp");
7040 } else {
7041 CmdArgs.push_back("-mfpu=softvfp");
7042 }
7043
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007044 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007045 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007046 case llvm::Triple::GNUEABI:
7047 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007048 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007049 break;
7050
7051 default:
7052 CmdArgs.push_back("-matpcs");
7053 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007054 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007055 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007056 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007057 if (getToolChain().getArch() == llvm::Triple::sparc)
7058 CmdArgs.push_back("-Av8plusa");
7059 else
7060 CmdArgs.push_back("-Av9a");
7061
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007062 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007063 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007064
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007065 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007066
7067 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007068 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007069
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007070 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007071 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007072
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007073 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007074 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007075}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007076
Douglas Katzman95354292015-06-23 20:42:09 +00007077void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7078 const InputInfo &Output,
7079 const InputInfoList &Inputs,
7080 const ArgList &Args,
7081 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007082 const toolchains::FreeBSD &ToolChain =
7083 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007084 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007085 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007086 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007087 !Args.hasArg(options::OPT_shared) &&
7088 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007089 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007090
7091 // Silence warning for "clang -g foo.o -o foo"
7092 Args.ClaimAllArgs(options::OPT_g_Group);
7093 // and "clang -emit-llvm foo.o -o foo"
7094 Args.ClaimAllArgs(options::OPT_emit_llvm);
7095 // and for "clang -w foo.o -o foo". Other warning options are already
7096 // handled somewhere else.
7097 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007098
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007099 if (!D.SysRoot.empty())
7100 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7101
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007102 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007103 CmdArgs.push_back("-pie");
7104
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007105 if (Args.hasArg(options::OPT_static)) {
7106 CmdArgs.push_back("-Bstatic");
7107 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007108 if (Args.hasArg(options::OPT_rdynamic))
7109 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007110 CmdArgs.push_back("--eh-frame-hdr");
7111 if (Args.hasArg(options::OPT_shared)) {
7112 CmdArgs.push_back("-Bshareable");
7113 } else {
7114 CmdArgs.push_back("-dynamic-linker");
7115 CmdArgs.push_back("/libexec/ld-elf.so.1");
7116 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007117 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007118 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7119 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7120 CmdArgs.push_back("--hash-style=both");
7121 }
7122 }
7123 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007124 }
7125
7126 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7127 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007128 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007129 CmdArgs.push_back("-m");
7130 CmdArgs.push_back("elf_i386_fbsd");
7131 }
7132
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007133 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007134 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007135 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007136 }
7137
Daniel Dunbarb440f562010-08-02 02:38:21 +00007138 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007139 CmdArgs.push_back("-o");
7140 CmdArgs.push_back(Output.getFilename());
7141 } else {
7142 assert(Output.isNothing() && "Invalid output.");
7143 }
7144
7145 if (!Args.hasArg(options::OPT_nostdlib) &&
7146 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007147 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007148 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007149 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007150 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007151 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007152 crt1 = "Scrt1.o";
7153 else
7154 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007155 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007156 if (crt1)
7157 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7158
7159 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7160
Craig Topper92fc2df2014-05-17 16:56:41 +00007161 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007162 if (Args.hasArg(options::OPT_static))
7163 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007164 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007165 crtbegin = "crtbeginS.o";
7166 else
7167 crtbegin = "crtbegin.o";
7168
7169 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007170 }
7171
7172 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007173 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007174 for (const auto &Path : Paths)
7175 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007176 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7177 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007178 Args.AddAllArgs(CmdArgs, options::OPT_s);
7179 Args.AddAllArgs(CmdArgs, options::OPT_t);
7180 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7181 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007182
Alexey Samsonov907880e2015-06-19 19:57:46 +00007183 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007184 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007185
Alexey Samsonov52550342014-09-15 19:58:40 +00007186 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007187 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007188
7189 if (!Args.hasArg(options::OPT_nostdlib) &&
7190 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007191 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007192 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007193 if (Args.hasArg(options::OPT_pg))
7194 CmdArgs.push_back("-lm_p");
7195 else
7196 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007197 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007198 if (NeedsSanitizerDeps)
7199 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007200 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7201 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007202 if (Args.hasArg(options::OPT_pg))
7203 CmdArgs.push_back("-lgcc_p");
7204 else
7205 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007206 if (Args.hasArg(options::OPT_static)) {
7207 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007208 } else if (Args.hasArg(options::OPT_pg)) {
7209 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007210 } else {
7211 CmdArgs.push_back("--as-needed");
7212 CmdArgs.push_back("-lgcc_s");
7213 CmdArgs.push_back("--no-as-needed");
7214 }
7215
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007216 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007217 if (Args.hasArg(options::OPT_pg))
7218 CmdArgs.push_back("-lpthread_p");
7219 else
7220 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007221 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007222
Roman Divacky66f22762011-02-10 16:59:40 +00007223 if (Args.hasArg(options::OPT_pg)) {
7224 if (Args.hasArg(options::OPT_shared))
7225 CmdArgs.push_back("-lc");
7226 else
7227 CmdArgs.push_back("-lc_p");
7228 CmdArgs.push_back("-lgcc_p");
7229 } else {
7230 CmdArgs.push_back("-lc");
7231 CmdArgs.push_back("-lgcc");
7232 }
7233
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007234 if (Args.hasArg(options::OPT_static)) {
7235 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007236 } else if (Args.hasArg(options::OPT_pg)) {
7237 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007238 } else {
7239 CmdArgs.push_back("--as-needed");
7240 CmdArgs.push_back("-lgcc_s");
7241 CmdArgs.push_back("--no-as-needed");
7242 }
7243 }
7244
7245 if (!Args.hasArg(options::OPT_nostdlib) &&
7246 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007247 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007248 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007249 else
7250 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007251 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007252 }
7253
Alexey Samsonov7811d192014-02-20 13:57:37 +00007254 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007255
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007256 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007257 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007258}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007259
Douglas Katzman95354292015-06-23 20:42:09 +00007260void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007261 const InputInfo &Output,
7262 const InputInfoList &Inputs,
7263 const ArgList &Args,
7264 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007265 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007266 ArgStringList CmdArgs;
7267
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007268 // GNU as needs different flags for creating the correct output format
7269 // on architectures with different ABIs or optional feature sets.
7270 switch (getToolChain().getArch()) {
7271 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007272 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007273 break;
7274 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007275 case llvm::Triple::armeb:
7276 case llvm::Triple::thumb:
7277 case llvm::Triple::thumbeb: {
Gabor Ballabas208826c2015-06-04 17:56:32 +00007278 std::string MArch = arm::getARMTargetCPU(Args, getToolChain().getTriple());
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007279 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007280 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007281 }
7282
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007283 case llvm::Triple::mips:
7284 case llvm::Triple::mipsel:
7285 case llvm::Triple::mips64:
7286 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007287 StringRef CPUName;
7288 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007289 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007290
7291 CmdArgs.push_back("-march");
7292 CmdArgs.push_back(CPUName.data());
7293
7294 CmdArgs.push_back("-mabi");
7295 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7296
7297 if (getToolChain().getArch() == llvm::Triple::mips ||
7298 getToolChain().getArch() == llvm::Triple::mips64)
7299 CmdArgs.push_back("-EB");
7300 else
7301 CmdArgs.push_back("-EL");
7302
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007303 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007304 break;
7305 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007306
7307 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007308 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007309 CmdArgs.push_back("-32");
7310 addAssemblerKPIC(Args, CmdArgs);
7311 break;
7312
7313 case llvm::Triple::sparcv9:
7314 CmdArgs.push_back("-64");
7315 CmdArgs.push_back("-Av9");
7316 addAssemblerKPIC(Args, CmdArgs);
7317 break;
7318
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007319 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007320 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007321 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007322
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007323 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007324
7325 CmdArgs.push_back("-o");
7326 CmdArgs.push_back(Output.getFilename());
7327
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007328 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007329 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007330
David Chisnallddbd68f2011-09-27 22:03:18 +00007331 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00007332 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007333}
7334
Douglas Katzman95354292015-06-23 20:42:09 +00007335void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7336 const InputInfo &Output,
7337 const InputInfoList &Inputs,
7338 const ArgList &Args,
7339 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007340 const Driver &D = getToolChain().getDriver();
7341 ArgStringList CmdArgs;
7342
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007343 if (!D.SysRoot.empty())
7344 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7345
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007346 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007347 if (Args.hasArg(options::OPT_static)) {
7348 CmdArgs.push_back("-Bstatic");
7349 } else {
7350 if (Args.hasArg(options::OPT_rdynamic))
7351 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007352 if (Args.hasArg(options::OPT_shared)) {
7353 CmdArgs.push_back("-Bshareable");
7354 } else {
7355 CmdArgs.push_back("-dynamic-linker");
7356 CmdArgs.push_back("/libexec/ld.elf_so");
7357 }
7358 }
7359
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007360 // Many NetBSD architectures support more than one ABI.
7361 // Determine the correct emulation for ld.
7362 switch (getToolChain().getArch()) {
7363 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007364 CmdArgs.push_back("-m");
7365 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007366 break;
7367 case llvm::Triple::arm:
7368 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007369 CmdArgs.push_back("-m");
7370 switch (getToolChain().getTriple().getEnvironment()) {
7371 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007372 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007373 CmdArgs.push_back("armelf_nbsd_eabi");
7374 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007375 case llvm::Triple::EABIHF:
7376 case llvm::Triple::GNUEABIHF:
7377 CmdArgs.push_back("armelf_nbsd_eabihf");
7378 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007379 default:
7380 CmdArgs.push_back("armelf_nbsd");
7381 break;
7382 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007383 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007384 case llvm::Triple::armeb:
7385 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007386 arm::appendEBLinkFlags(
7387 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007388 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007389 CmdArgs.push_back("-m");
7390 switch (getToolChain().getTriple().getEnvironment()) {
7391 case llvm::Triple::EABI:
7392 case llvm::Triple::GNUEABI:
7393 CmdArgs.push_back("armelfb_nbsd_eabi");
7394 break;
7395 case llvm::Triple::EABIHF:
7396 case llvm::Triple::GNUEABIHF:
7397 CmdArgs.push_back("armelfb_nbsd_eabihf");
7398 break;
7399 default:
7400 CmdArgs.push_back("armelfb_nbsd");
7401 break;
7402 }
7403 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007404 case llvm::Triple::mips64:
7405 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007406 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007407 CmdArgs.push_back("-m");
7408 if (getToolChain().getArch() == llvm::Triple::mips64)
7409 CmdArgs.push_back("elf32btsmip");
7410 else
7411 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007412 } else if (mips::hasMipsAbiArg(Args, "64")) {
7413 CmdArgs.push_back("-m");
7414 if (getToolChain().getArch() == llvm::Triple::mips64)
7415 CmdArgs.push_back("elf64btsmip");
7416 else
7417 CmdArgs.push_back("elf64ltsmip");
7418 }
7419 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007420 case llvm::Triple::ppc:
7421 CmdArgs.push_back("-m");
7422 CmdArgs.push_back("elf32ppc_nbsd");
7423 break;
7424
7425 case llvm::Triple::ppc64:
7426 case llvm::Triple::ppc64le:
7427 CmdArgs.push_back("-m");
7428 CmdArgs.push_back("elf64ppc");
7429 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007430
7431 case llvm::Triple::sparc:
7432 CmdArgs.push_back("-m");
7433 CmdArgs.push_back("elf32_sparc");
7434 break;
7435
7436 case llvm::Triple::sparcv9:
7437 CmdArgs.push_back("-m");
7438 CmdArgs.push_back("elf64_sparc");
7439 break;
7440
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007441 default:
7442 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007443 }
7444
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007445 if (Output.isFilename()) {
7446 CmdArgs.push_back("-o");
7447 CmdArgs.push_back(Output.getFilename());
7448 } else {
7449 assert(Output.isNothing() && "Invalid output.");
7450 }
7451
7452 if (!Args.hasArg(options::OPT_nostdlib) &&
7453 !Args.hasArg(options::OPT_nostartfiles)) {
7454 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007455 CmdArgs.push_back(
7456 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7457 CmdArgs.push_back(
7458 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7459 CmdArgs.push_back(
7460 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007461 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007462 CmdArgs.push_back(
7463 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7464 CmdArgs.push_back(
7465 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007466 }
7467 }
7468
7469 Args.AddAllArgs(CmdArgs, options::OPT_L);
7470 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7471 Args.AddAllArgs(CmdArgs, options::OPT_e);
7472 Args.AddAllArgs(CmdArgs, options::OPT_s);
7473 Args.AddAllArgs(CmdArgs, options::OPT_t);
7474 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7475 Args.AddAllArgs(CmdArgs, options::OPT_r);
7476
7477 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7478
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007479 unsigned Major, Minor, Micro;
7480 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7481 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007482 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007483 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007484 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007485 case llvm::Triple::arm:
7486 case llvm::Triple::armeb:
7487 case llvm::Triple::thumb:
7488 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007489 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007490 case llvm::Triple::ppc64:
7491 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007492 case llvm::Triple::x86:
7493 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007494 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007495 break;
7496 default:
7497 break;
7498 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007499 }
7500
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007501 if (!Args.hasArg(options::OPT_nostdlib) &&
7502 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007503 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007504 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7505 CmdArgs.push_back("-lm");
7506 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007507 if (Args.hasArg(options::OPT_pthread))
7508 CmdArgs.push_back("-lpthread");
7509 CmdArgs.push_back("-lc");
7510
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007511 if (useLibgcc) {
7512 if (Args.hasArg(options::OPT_static)) {
7513 // libgcc_eh depends on libc, so resolve as much as possible,
7514 // pull in any new requirements from libc and then get the rest
7515 // of libgcc.
7516 CmdArgs.push_back("-lgcc_eh");
7517 CmdArgs.push_back("-lc");
7518 CmdArgs.push_back("-lgcc");
7519 } else {
7520 CmdArgs.push_back("-lgcc");
7521 CmdArgs.push_back("--as-needed");
7522 CmdArgs.push_back("-lgcc_s");
7523 CmdArgs.push_back("--no-as-needed");
7524 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007525 }
7526 }
7527
7528 if (!Args.hasArg(options::OPT_nostdlib) &&
7529 !Args.hasArg(options::OPT_nostartfiles)) {
7530 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007531 CmdArgs.push_back(
7532 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007533 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007534 CmdArgs.push_back(
7535 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007537 }
7538
Alexey Samsonov7811d192014-02-20 13:57:37 +00007539 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007540
Logan Chieneb9162f2014-06-26 14:23:45 +00007541 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007542 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007543}
7544
Douglas Katzman95354292015-06-23 20:42:09 +00007545void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7546 const InputInfo &Output,
7547 const InputInfoList &Inputs,
7548 const ArgList &Args,
7549 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007550 claimNoWarnArgs(Args);
7551
Rafael Espindola92b00932010-08-10 00:25:48 +00007552 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007553 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007554
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007555 switch (getToolChain().getArch()) {
7556 default:
7557 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007558 // Add --32/--64 to make sure we get the format we want.
7559 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007560 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007561 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007562 break;
7563 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007564 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7565 CmdArgs.push_back("--x32");
7566 else
7567 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007568 break;
7569 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007570 CmdArgs.push_back("-a32");
7571 CmdArgs.push_back("-mppc");
7572 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007573 break;
7574 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007575 CmdArgs.push_back("-a64");
7576 CmdArgs.push_back("-mppc64");
7577 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007578 break;
7579 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007580 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007581 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007582 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007583 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007584 break;
7585 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007586 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007587 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007588 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007589 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007590 break;
7591 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007592 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007593 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007594 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007595 break;
7596 case llvm::Triple::arm:
7597 case llvm::Triple::armeb:
7598 case llvm::Triple::thumb:
7599 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007600 const llvm::Triple &Triple = getToolChain().getTriple();
7601 switch (Triple.getSubArch()) {
7602 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007603 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007604 break;
7605 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007606 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007607 break;
7608 default:
7609 break;
7610 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007611
Tim Northover9c7e0352013-12-12 11:55:52 +00007612 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007613 getToolChain().getDriver(), Args,
7614 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007615 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007616
7617 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007618
7619 // FIXME: remove krait check when GNU tools support krait cpu
7620 // for now replace it with -march=armv7-a to avoid a lower
7621 // march from being picked in the absence of a cpu flag.
7622 Arg *A;
7623 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007624 StringRef(A->getValue()).lower() == "krait")
7625 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007626 else
7627 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007628 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007629 break;
7630 }
7631 case llvm::Triple::mips:
7632 case llvm::Triple::mipsel:
7633 case llvm::Triple::mips64:
7634 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007635 StringRef CPUName;
7636 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007637 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007638 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007639
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007640 CmdArgs.push_back("-march");
7641 CmdArgs.push_back(CPUName.data());
7642
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007643 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007644 CmdArgs.push_back(ABIName.data());
7645
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007646 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7647 // or -mshared (not implemented) is in effect.
7648 bool IsPicOrPie = false;
7649 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7650 options::OPT_fpic, options::OPT_fno_pic,
7651 options::OPT_fPIE, options::OPT_fno_PIE,
7652 options::OPT_fpie, options::OPT_fno_pie)) {
7653 if (A->getOption().matches(options::OPT_fPIC) ||
7654 A->getOption().matches(options::OPT_fpic) ||
7655 A->getOption().matches(options::OPT_fPIE) ||
7656 A->getOption().matches(options::OPT_fpie))
7657 IsPicOrPie = true;
7658 }
7659 if (!IsPicOrPie)
7660 CmdArgs.push_back("-mno-shared");
7661
Daniel Sanders379d44b2014-07-16 11:52:23 +00007662 // LLVM doesn't support -mplt yet and acts as if it is always given.
7663 // However, -mplt has no effect with the N64 ABI.
7664 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007665
7666 if (getToolChain().getArch() == llvm::Triple::mips ||
7667 getToolChain().getArch() == llvm::Triple::mips64)
7668 CmdArgs.push_back("-EB");
7669 else
7670 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007671
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007672 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7673 if (StringRef(A->getValue()) == "2008")
7674 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7675 }
7676
Daniel Sanders379d44b2014-07-16 11:52:23 +00007677 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007678 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007679 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7680 options::OPT_mfp64)) {
7681 A->claim();
7682 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007683 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7684 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007685 CmdArgs.push_back("-mfpxx");
7686
7687 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7688 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007689 if (Arg *A =
7690 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007691 if (A->getOption().matches(options::OPT_mips16)) {
7692 A->claim();
7693 A->render(Args, CmdArgs);
7694 } else {
7695 A->claim();
7696 CmdArgs.push_back("-no-mips16");
7697 }
7698 }
7699
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007700 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7701 options::OPT_mno_micromips);
7702 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7703 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7704
Simon Atanasyanbd986632013-11-26 11:58:04 +00007705 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7706 // Do not use AddLastArg because not all versions of MIPS assembler
7707 // support -mmsa / -mno-msa options.
7708 if (A->getOption().matches(options::OPT_mmsa))
7709 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7710 }
7711
Daniel Sanders379d44b2014-07-16 11:52:23 +00007712 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7713 options::OPT_msoft_float);
7714
Toma Tabacub36d6102015-06-11 12:13:18 +00007715 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7716 options::OPT_msingle_float);
7717
Daniel Sanders379d44b2014-07-16 11:52:23 +00007718 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7719 options::OPT_mno_odd_spreg);
7720
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007721 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007722 break;
7723 }
7724 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007725 // Always pass an -march option, since our default of z10 is later
7726 // than the GNU assembler's default.
7727 StringRef CPUName = getSystemZTargetCPU(Args);
7728 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007729 break;
7730 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007731 }
7732
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007733 if (NeedsKPIC)
7734 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007735
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007736 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007737
7738 CmdArgs.push_back("-o");
7739 CmdArgs.push_back(Output.getFilename());
7740
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007741 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007742 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007743
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007744 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007745 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007746
7747 // Handle the debug info splitting at object creation time if we're
7748 // creating an object.
7749 // TODO: Currently only works on linux with newer objcopy.
7750 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007751 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007752 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007753 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007754}
7755
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007756static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007757 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007758 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007759 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7760 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007761 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007762 CmdArgs.push_back("-lgcc");
7763
Logan Chien3d3373c2012-11-19 12:04:11 +00007764 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007765 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007766 CmdArgs.push_back("-lgcc");
7767 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007768 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007769 CmdArgs.push_back("--as-needed");
7770 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007771 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007772 CmdArgs.push_back("--no-as-needed");
7773 }
7774
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007775 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007776 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007777 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007778 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007779
7780 // According to Android ABI, we have to link with libdl if we are
7781 // linking with non-static libgcc.
7782 //
7783 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7784 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7785 if (isAndroid && !StaticLibgcc)
7786 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007787}
7788
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007789static std::string getLinuxDynamicLinker(const ArgList &Args,
7790 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007791 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7792
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007793 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7794 if (ToolChain.getTriple().isArch64Bit())
7795 return "/system/bin/linker64";
7796 else
7797 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007798 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7799 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007800 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007801 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007802 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007803 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007804 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007805 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007806 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7807 return "/lib/ld-linux-armhf.so.3";
7808 else
7809 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007810 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7811 // TODO: check which dynamic linker name.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007812 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007813 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007814 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007815 return "/lib/ld-linux.so.3";
7816 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7817 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007818 StringRef CPUName;
7819 StringRef ABIName;
7820 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7821 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7822
7823 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7824 .Case("o32", "/lib")
7825 .Case("n32", "/lib32")
7826 .Case("n64", "/lib64")
7827 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007828 StringRef LibName;
7829 if (mips::isUCLibc(Args))
7830 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7831 else
7832 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007833
7834 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007835 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007836 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007837 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007838 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7839 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007840 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007841 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00007842 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7843 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007844 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007845 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00007846 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007847 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007848 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007849 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00007850 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7851 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007852 else
7853 return "/lib64/ld-linux-x86-64.so.2";
7854}
7855
Renato Golinc4b49242014-02-13 10:01:16 +00007856static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007857 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007858 // Make use of compiler-rt if --rtlib option is used
7859 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7860
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007861 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007862 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007863 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007864 default:
7865 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007866 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007867 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007868 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007869 break;
7870 }
Renato Golinc4b49242014-02-13 10:01:16 +00007871 break;
7872 case ToolChain::RLT_Libgcc:
7873 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7874 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007875 }
7876}
7877
Rafael Espindola1e085772014-08-15 17:14:35 +00007878static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7879 switch (T.getArch()) {
7880 case llvm::Triple::x86:
7881 return "elf_i386";
7882 case llvm::Triple::aarch64:
7883 return "aarch64linux";
7884 case llvm::Triple::aarch64_be:
7885 return "aarch64_be_linux";
7886 case llvm::Triple::arm:
7887 case llvm::Triple::thumb:
7888 return "armelf_linux_eabi";
7889 case llvm::Triple::armeb:
7890 case llvm::Triple::thumbeb:
7891 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7892 case llvm::Triple::ppc:
7893 return "elf32ppclinux";
7894 case llvm::Triple::ppc64:
7895 return "elf64ppc";
7896 case llvm::Triple::ppc64le:
7897 return "elf64lppc";
7898 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007899 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00007900 return "elf32_sparc";
7901 case llvm::Triple::sparcv9:
7902 return "elf64_sparc";
7903 case llvm::Triple::mips:
7904 return "elf32btsmip";
7905 case llvm::Triple::mipsel:
7906 return "elf32ltsmip";
7907 case llvm::Triple::mips64:
7908 if (mips::hasMipsAbiArg(Args, "n32"))
7909 return "elf32btsmipn32";
7910 return "elf64btsmip";
7911 case llvm::Triple::mips64el:
7912 if (mips::hasMipsAbiArg(Args, "n32"))
7913 return "elf32ltsmipn32";
7914 return "elf64ltsmip";
7915 case llvm::Triple::systemz:
7916 return "elf64_s390";
7917 case llvm::Triple::x86_64:
7918 if (T.getEnvironment() == llvm::Triple::GNUX32)
7919 return "elf32_x86_64";
7920 return "elf_x86_64";
7921 default:
7922 llvm_unreachable("Unexpected arch");
7923 }
7924}
7925
Douglas Katzman95354292015-06-23 20:42:09 +00007926void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7927 const InputInfo &Output,
7928 const InputInfoList &Inputs,
7929 const ArgList &Args,
7930 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007931 const toolchains::Linux &ToolChain =
7932 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007933 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007934 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007935 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007936 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007937 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007938 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
7939 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007940
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007941 ArgStringList CmdArgs;
7942
Rafael Espindolad1002f62010-11-15 18:28:16 +00007943 // Silence warning for "clang -g foo.o -o foo"
7944 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007945 // and "clang -emit-llvm foo.o -o foo"
7946 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007947 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007948 // handled somewhere else.
7949 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007950
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007951 if (!D.SysRoot.empty())
7952 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007953
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007954 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007955 CmdArgs.push_back("-pie");
7956
Rafael Espindola1c76c592010-11-07 22:57:16 +00007957 if (Args.hasArg(options::OPT_rdynamic))
7958 CmdArgs.push_back("-export-dynamic");
7959
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007960 if (Args.hasArg(options::OPT_s))
7961 CmdArgs.push_back("-s");
7962
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007963 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
7964 arm::appendEBLinkFlags(
7965 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007966 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007967
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007968 for (const auto &Opt : ToolChain.ExtraOpts)
7969 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007970
7971 if (!Args.hasArg(options::OPT_static)) {
7972 CmdArgs.push_back("--eh-frame-hdr");
7973 }
7974
7975 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007976 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007977
7978 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007979 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7980 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007981 CmdArgs.push_back("-Bstatic");
7982 else
7983 CmdArgs.push_back("-static");
7984 } else if (Args.hasArg(options::OPT_shared)) {
7985 CmdArgs.push_back("-shared");
7986 }
7987
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007988 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
7989 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007990 (!Args.hasArg(options::OPT_static) &&
7991 !Args.hasArg(options::OPT_shared))) {
7992 CmdArgs.push_back("-dynamic-linker");
7993 CmdArgs.push_back(Args.MakeArgString(
7994 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7995 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007996
7997 CmdArgs.push_back("-o");
7998 CmdArgs.push_back(Output.getFilename());
7999
Rafael Espindola81937ec2010-12-01 01:52:43 +00008000 if (!Args.hasArg(options::OPT_nostdlib) &&
8001 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008002 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008003 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008004 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008005 if (Args.hasArg(options::OPT_pg))
8006 crt1 = "gcrt1.o";
8007 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008008 crt1 = "Scrt1.o";
8009 else
8010 crt1 = "crt1.o";
8011 }
8012 if (crt1)
8013 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008014
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008015 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8016 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008017
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008018 const char *crtbegin;
8019 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008020 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008021 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008022 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008023 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008024 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008025 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008026 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008027 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008028
8029 // Add crtfastmath.o if available and fast math is enabled.
8030 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008031 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008032
8033 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008034 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008035
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008036 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008037
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008038 for (const auto &Path : Paths)
8039 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008040
Alexey Samsonov907880e2015-06-19 19:57:46 +00008041 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008042 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008043
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008044 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8045 CmdArgs.push_back("--no-demangle");
8046
Alexey Samsonov52550342014-09-15 19:58:40 +00008047 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008048 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008049 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008050 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008051
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008052 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008053 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008054 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008055 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008056 if (OnlyLibstdcxxStatic)
8057 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008058 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008059 if (OnlyLibstdcxxStatic)
8060 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008061 CmdArgs.push_back("-lm");
8062 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008063 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8064 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008065
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008066 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008067 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8068 if (Args.hasArg(options::OPT_static))
8069 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008070
Alexey Samsonov52550342014-09-15 19:58:40 +00008071 if (NeedsSanitizerDeps)
8072 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8073
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008074 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8075 Args.hasArg(options::OPT_pthreads);
8076
8077 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8078 options::OPT_fno_openmp, false)) {
8079 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8080 // FIXME: Does this really make sense for all GNU toolchains?
8081 WantPthread = true;
8082
8083 // Also link the particular OpenMP runtimes.
8084 switch (getOpenMPRuntime(ToolChain, Args)) {
8085 case OMPRT_OMP:
8086 CmdArgs.push_back("-lomp");
8087 break;
8088 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008089 CmdArgs.push_back("-lgomp");
8090
8091 // FIXME: Exclude this for platforms with libgomp that don't require
8092 // librt. Most modern Linux platforms require it, but some may not.
8093 CmdArgs.push_back("-lrt");
8094 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008095 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008096 CmdArgs.push_back("-liomp5");
8097 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008098 case OMPRT_Unknown:
8099 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008100 break;
8101 }
Chandler Carruth01538002013-01-17 13:19:29 +00008102 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008103
Renato Golinc4b49242014-02-13 10:01:16 +00008104 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008105
Richard Smith31d1de22015-05-20 22:48:44 +00008106 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008107 CmdArgs.push_back("-lpthread");
8108
8109 CmdArgs.push_back("-lc");
8110
8111 if (Args.hasArg(options::OPT_static))
8112 CmdArgs.push_back("--end-group");
8113 else
Renato Golinc4b49242014-02-13 10:01:16 +00008114 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008115 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008116
Rafael Espindola81937ec2010-12-01 01:52:43 +00008117 if (!Args.hasArg(options::OPT_nostartfiles)) {
8118 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008119 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008120 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008121 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008122 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008123 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008124 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008125
Rafael Espindola81937ec2010-12-01 01:52:43 +00008126 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008127 if (!isAndroid)
8128 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008129 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008130 }
8131
David Blaikiec11bf802014-09-04 16:04:28 +00008132 C.addCommand(
8133 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008134}
8135
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008136// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8137// for the various SFI requirements like register masking. The assembly tool
8138// inserts the file containing the macros as an input into all the assembly
8139// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008140void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8141 const InputInfo &Output,
8142 const InputInfoList &Inputs,
8143 const ArgList &Args,
8144 const char *LinkingOutput) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008145 const toolchains::NaCl_TC &ToolChain =
8146 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008147 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8148 "nacl-arm-macros.s");
8149 InputInfoList NewInputs;
8150 NewInputs.push_back(NaClMacros);
8151 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008152 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8153 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008154}
8155
Douglas Katzman750cfc52015-06-29 18:42:16 +00008156// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008157// we use static by default, do not yet support sanitizers or LTO, and a few
8158// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008159// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008160void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8161 const InputInfo &Output,
8162 const InputInfoList &Inputs,
8163 const ArgList &Args,
8164 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008165
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008166 const toolchains::NaCl_TC &ToolChain =
8167 static_cast<const toolchains::NaCl_TC &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008168 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008169 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008170 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008171 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008172
8173 ArgStringList CmdArgs;
8174
8175 // Silence warning for "clang -g foo.o -o foo"
8176 Args.ClaimAllArgs(options::OPT_g_Group);
8177 // and "clang -emit-llvm foo.o -o foo"
8178 Args.ClaimAllArgs(options::OPT_emit_llvm);
8179 // and for "clang -w foo.o -o foo". Other warning options are already
8180 // handled somewhere else.
8181 Args.ClaimAllArgs(options::OPT_w);
8182
8183 if (!D.SysRoot.empty())
8184 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8185
8186 if (Args.hasArg(options::OPT_rdynamic))
8187 CmdArgs.push_back("-export-dynamic");
8188
8189 if (Args.hasArg(options::OPT_s))
8190 CmdArgs.push_back("-s");
8191
8192 // NaCl_TC doesn't have ExtraOpts like Linux; the only relevant flag from
8193 // there is --build-id, which we do want.
8194 CmdArgs.push_back("--build-id");
8195
8196 if (!IsStatic)
8197 CmdArgs.push_back("--eh-frame-hdr");
8198
8199 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008200 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008201 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008202 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008203 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008204 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008205 CmdArgs.push_back("elf_x86_64_nacl");
8206 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008207 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8208 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008209
8210 if (IsStatic)
8211 CmdArgs.push_back("-static");
8212 else if (Args.hasArg(options::OPT_shared))
8213 CmdArgs.push_back("-shared");
8214
8215 CmdArgs.push_back("-o");
8216 CmdArgs.push_back(Output.getFilename());
8217 if (!Args.hasArg(options::OPT_nostdlib) &&
8218 !Args.hasArg(options::OPT_nostartfiles)) {
8219 if (!Args.hasArg(options::OPT_shared))
8220 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8222
8223 const char *crtbegin;
8224 if (IsStatic)
8225 crtbegin = "crtbeginT.o";
8226 else if (Args.hasArg(options::OPT_shared))
8227 crtbegin = "crtbeginS.o";
8228 else
8229 crtbegin = "crtbegin.o";
8230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8231 }
8232
8233 Args.AddAllArgs(CmdArgs, options::OPT_L);
8234 Args.AddAllArgs(CmdArgs, options::OPT_u);
8235
8236 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8237
8238 for (const auto &Path : Paths)
8239 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8240
8241 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8242 CmdArgs.push_back("--no-demangle");
8243
8244 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8245
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008246 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008247 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008248 bool OnlyLibstdcxxStatic =
8249 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008250 if (OnlyLibstdcxxStatic)
8251 CmdArgs.push_back("-Bstatic");
8252 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8253 if (OnlyLibstdcxxStatic)
8254 CmdArgs.push_back("-Bdynamic");
8255 CmdArgs.push_back("-lm");
8256 }
8257
8258 if (!Args.hasArg(options::OPT_nostdlib)) {
8259 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8260 // Always use groups, since it has no effect on dynamic libraries.
8261 CmdArgs.push_back("--start-group");
8262 CmdArgs.push_back("-lc");
8263 // NaCl's libc++ currently requires libpthread, so just always include it
8264 // in the group for C++.
8265 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008266 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008267 CmdArgs.push_back("-lpthread");
8268 }
8269
8270 CmdArgs.push_back("-lgcc");
8271 CmdArgs.push_back("--as-needed");
8272 if (IsStatic)
8273 CmdArgs.push_back("-lgcc_eh");
8274 else
8275 CmdArgs.push_back("-lgcc_s");
8276 CmdArgs.push_back("--no-as-needed");
8277 CmdArgs.push_back("--end-group");
8278 }
8279
8280 if (!Args.hasArg(options::OPT_nostartfiles)) {
8281 const char *crtend;
8282 if (Args.hasArg(options::OPT_shared))
8283 crtend = "crtendS.o";
8284 else
8285 crtend = "crtend.o";
8286
8287 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8288 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8289 }
8290 }
8291
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008292 C.addCommand(
8293 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008294}
8295
Douglas Katzman95354292015-06-23 20:42:09 +00008296void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8297 const InputInfo &Output,
8298 const InputInfoList &Inputs,
8299 const ArgList &Args,
8300 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008301 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008302 ArgStringList CmdArgs;
8303
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008304 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008305
8306 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008307 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008308
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008309 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008310 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008311
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008312 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008313 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008314}
8315
Douglas Katzman95354292015-06-23 20:42:09 +00008316void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8317 const InputInfo &Output,
8318 const InputInfoList &Inputs,
8319 const ArgList &Args,
8320 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008321 const Driver &D = getToolChain().getDriver();
8322 ArgStringList CmdArgs;
8323
Daniel Dunbarb440f562010-08-02 02:38:21 +00008324 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008325 CmdArgs.push_back("-o");
8326 CmdArgs.push_back(Output.getFilename());
8327 } else {
8328 assert(Output.isNothing() && "Invalid output.");
8329 }
8330
8331 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008332 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008333 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8334 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8335 CmdArgs.push_back(
8336 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8337 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008338 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008339
8340 Args.AddAllArgs(CmdArgs, options::OPT_L);
8341 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8342 Args.AddAllArgs(CmdArgs, options::OPT_e);
8343
Daniel Dunbar54423b22010-09-17 00:24:54 +00008344 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008345
Alexey Samsonov7811d192014-02-20 13:57:37 +00008346 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008347
Chris Lattner3e2ee142010-07-07 16:01:42 +00008348 if (!Args.hasArg(options::OPT_nostdlib) &&
8349 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008350 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008351 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008352 CmdArgs.push_back("-lm");
8353 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008354 }
8355
8356 if (!Args.hasArg(options::OPT_nostdlib) &&
8357 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008358 if (Args.hasArg(options::OPT_pthread))
8359 CmdArgs.push_back("-lpthread");
8360 CmdArgs.push_back("-lc");
8361 CmdArgs.push_back("-lCompilerRT-Generic");
8362 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8363 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008364 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008365 }
8366
Logan Chieneb9162f2014-06-26 14:23:45 +00008367 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008368 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008369}
8370
Daniel Dunbarcc912342009-05-02 18:28:39 +00008371/// DragonFly Tools
8372
8373// For now, DragonFly Assemble does just about the same as for
8374// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008375void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8376 const InputInfo &Output,
8377 const InputInfoList &Inputs,
8378 const ArgList &Args,
8379 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008380 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008381 ArgStringList CmdArgs;
8382
8383 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8384 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008385 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008386 CmdArgs.push_back("--32");
8387
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008388 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008389
8390 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008391 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008392
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008393 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008394 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008395
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008396 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00008397 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008398}
8399
Douglas Katzman95354292015-06-23 20:42:09 +00008400void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8401 const InputInfo &Output,
8402 const InputInfoList &Inputs,
8403 const ArgList &Args,
8404 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008405 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008406 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008407 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008408
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008409 if (!D.SysRoot.empty())
8410 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8411
John McCall65b8da02013-04-11 22:55:55 +00008412 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008413 if (Args.hasArg(options::OPT_static)) {
8414 CmdArgs.push_back("-Bstatic");
8415 } else {
John McCall65b8da02013-04-11 22:55:55 +00008416 if (Args.hasArg(options::OPT_rdynamic))
8417 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008418 if (Args.hasArg(options::OPT_shared))
8419 CmdArgs.push_back("-Bshareable");
8420 else {
8421 CmdArgs.push_back("-dynamic-linker");
8422 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8423 }
John McCall65b8da02013-04-11 22:55:55 +00008424 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008425 }
8426
8427 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8428 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008429 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008430 CmdArgs.push_back("-m");
8431 CmdArgs.push_back("elf_i386");
8432 }
8433
Daniel Dunbarb440f562010-08-02 02:38:21 +00008434 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008435 CmdArgs.push_back("-o");
8436 CmdArgs.push_back(Output.getFilename());
8437 } else {
8438 assert(Output.isNothing() && "Invalid output.");
8439 }
8440
8441 if (!Args.hasArg(options::OPT_nostdlib) &&
8442 !Args.hasArg(options::OPT_nostartfiles)) {
8443 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008444 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008445 CmdArgs.push_back(
8446 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008447 else {
8448 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008449 CmdArgs.push_back(
8450 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008451 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008452 CmdArgs.push_back(
8453 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008454 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008455 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008456 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008457 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008458 CmdArgs.push_back(
8459 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008460 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008461 CmdArgs.push_back(
8462 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008463 }
8464
8465 Args.AddAllArgs(CmdArgs, options::OPT_L);
8466 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8467 Args.AddAllArgs(CmdArgs, options::OPT_e);
8468
Daniel Dunbar54423b22010-09-17 00:24:54 +00008469 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008470
8471 if (!Args.hasArg(options::OPT_nostdlib) &&
8472 !Args.hasArg(options::OPT_nodefaultlibs)) {
8473 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8474 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008475 if (UseGCC47)
8476 CmdArgs.push_back("-L/usr/lib/gcc47");
8477 else
8478 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008479
8480 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008481 if (UseGCC47) {
8482 CmdArgs.push_back("-rpath");
8483 CmdArgs.push_back("/usr/lib/gcc47");
8484 } else {
8485 CmdArgs.push_back("-rpath");
8486 CmdArgs.push_back("/usr/lib/gcc44");
8487 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008488 }
8489
Hans Wennborg70850d82013-07-18 20:29:38 +00008490 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008491 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008492 CmdArgs.push_back("-lm");
8493 }
8494
Daniel Dunbarcc912342009-05-02 18:28:39 +00008495 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008496 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008497
8498 if (!Args.hasArg(options::OPT_nolibc)) {
8499 CmdArgs.push_back("-lc");
8500 }
8501
John McCall65b8da02013-04-11 22:55:55 +00008502 if (UseGCC47) {
8503 if (Args.hasArg(options::OPT_static) ||
8504 Args.hasArg(options::OPT_static_libgcc)) {
8505 CmdArgs.push_back("-lgcc");
8506 CmdArgs.push_back("-lgcc_eh");
8507 } else {
8508 if (Args.hasArg(options::OPT_shared_libgcc)) {
8509 CmdArgs.push_back("-lgcc_pic");
8510 if (!Args.hasArg(options::OPT_shared))
8511 CmdArgs.push_back("-lgcc");
8512 } else {
8513 CmdArgs.push_back("-lgcc");
8514 CmdArgs.push_back("--as-needed");
8515 CmdArgs.push_back("-lgcc_pic");
8516 CmdArgs.push_back("--no-as-needed");
8517 }
8518 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008519 } else {
John McCall65b8da02013-04-11 22:55:55 +00008520 if (Args.hasArg(options::OPT_shared)) {
8521 CmdArgs.push_back("-lgcc_pic");
8522 } else {
8523 CmdArgs.push_back("-lgcc");
8524 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008525 }
8526 }
8527
8528 if (!Args.hasArg(options::OPT_nostdlib) &&
8529 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008530 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008531 CmdArgs.push_back(
8532 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008533 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008534 CmdArgs.push_back(
8535 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008537 }
8538
Alexey Samsonov7811d192014-02-20 13:57:37 +00008539 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008540
Logan Chieneb9162f2014-06-26 14:23:45 +00008541 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008542 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008543}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008544
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008545// Try to find Exe from a Visual Studio distribution. This first tries to find
8546// an installed copy of Visual Studio and, failing that, looks in the PATH,
8547// making sure that whatever executable that's found is not a same-named exe
8548// from clang itself to prevent clang from falling back to itself.
8549static std::string FindVisualStudioExecutable(const ToolChain &TC,
8550 const char *Exe,
8551 const char *ClangProgramPath) {
8552 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8553 std::string visualStudioBinDir;
8554 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8555 visualStudioBinDir)) {
8556 SmallString<128> FilePath(visualStudioBinDir);
8557 llvm::sys::path::append(FilePath, Exe);
8558 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8559 return FilePath.str();
8560 }
8561
8562 return Exe;
8563}
8564
Douglas Katzman95354292015-06-23 20:42:09 +00008565void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8566 const InputInfo &Output,
8567 const InputInfoList &Inputs,
8568 const ArgList &Args,
8569 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008570 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008571 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008572
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008573 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8574 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008575 CmdArgs.push_back(
8576 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008577
8578 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008579 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008580 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008581
Zachary Turner10d75b22014-10-22 20:40:43 +00008582 if (!llvm::sys::Process::GetEnv("LIB")) {
8583 // If the VC environment hasn't been configured (perhaps because the user
8584 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008585 // the environment variable is set however, assume the user knows what
8586 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008587 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008588 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008589 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8590 SmallString<128> LibDir(VisualStudioDir);
8591 llvm::sys::path::append(LibDir, "VC", "lib");
8592 switch (MSVC.getArch()) {
8593 case llvm::Triple::x86:
8594 // x86 just puts the libraries directly in lib
8595 break;
8596 case llvm::Triple::x86_64:
8597 llvm::sys::path::append(LibDir, "amd64");
8598 break;
8599 case llvm::Triple::arm:
8600 llvm::sys::path::append(LibDir, "arm");
8601 break;
8602 default:
8603 break;
8604 }
8605 CmdArgs.push_back(
8606 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8607 }
8608
8609 std::string WindowsSdkLibPath;
8610 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8611 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8612 WindowsSdkLibPath.c_str()));
8613 }
8614
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008615 CmdArgs.push_back("-nologo");
8616
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008617 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008618 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008619
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008620 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008621 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008622 if (DLL) {
8623 CmdArgs.push_back(Args.MakeArgString("-dll"));
8624
8625 SmallString<128> ImplibName(Output.getFilename());
8626 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008627 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008628 }
8629
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008630 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008631 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008632 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008633 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008634 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008635 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008636 };
8637 for (const auto &Component : CompilerRTComponents)
8638 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008639 // Make sure the dynamic runtime thunk is not optimized out at link time
8640 // to ensure proper SEH handling.
8641 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008642 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008643 CmdArgs.push_back(
8644 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008645 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008646 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008647 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008648 };
8649 for (const auto &Component : CompilerRTComponents)
8650 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008651 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008652 }
8653
Hans Wennborg2e274592013-08-13 23:38:57 +00008654 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008655
Reid Kleckner337188f2014-09-16 19:22:00 +00008656 // Add filenames, libraries, and other linker inputs.
8657 for (const auto &Input : Inputs) {
8658 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008659 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008660 continue;
8661 }
8662
8663 const Arg &A = Input.getInputArg();
8664
8665 // Render -l options differently for the MSVC linker.
8666 if (A.getOption().matches(options::OPT_l)) {
8667 StringRef Lib = A.getValue();
8668 const char *LinkLibArg;
8669 if (Lib.endswith(".lib"))
8670 LinkLibArg = Args.MakeArgString(Lib);
8671 else
8672 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8673 CmdArgs.push_back(LinkLibArg);
8674 continue;
8675 }
8676
8677 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8678 // or -L. Render it, even if MSVC doesn't understand it.
8679 A.renderAsInput(Args, CmdArgs);
8680 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008681
Zachary Turner719f58c2014-12-01 23:06:47 +00008682 // We need to special case some linker paths. In the case of lld, we need to
8683 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8684 // linker, we need to use a special search algorithm.
8685 llvm::SmallString<128> linkPath;
8686 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8687 if (Linker.equals_lower("lld"))
8688 Linker = "lld-link";
8689
8690 if (Linker.equals_lower("link")) {
8691 // If we're using the MSVC linker, it's not sufficient to just use link
8692 // from the program PATH, because other environments like GnuWin32 install
8693 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008694 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008695 C.getDriver().getClangProgramPath());
8696 } else {
8697 linkPath = Linker;
8698 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008699 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008700 }
8701
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008702 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008703 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008704}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008705
Douglas Katzman95354292015-06-23 20:42:09 +00008706void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8707 const InputInfo &Output,
8708 const InputInfoList &Inputs,
8709 const ArgList &Args,
8710 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008711 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8712}
8713
Douglas Katzman95354292015-06-23 20:42:09 +00008714std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008715 Compilation &C, const JobAction &JA, const InputInfo &Output,
8716 const InputInfoList &Inputs, const ArgList &Args,
8717 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008718 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008719 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008720 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008721 CmdArgs.push_back("/W0"); // No warnings.
8722
8723 // The goal is to be able to invoke this tool correctly based on
8724 // any flag accepted by clang-cl.
8725
8726 // These are spelled the same way in clang and cl.exe,.
8727 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8728 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008729
8730 // Optimization level.
8731 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8732 if (A->getOption().getID() == options::OPT_O0) {
8733 CmdArgs.push_back("/Od");
8734 } else {
8735 StringRef OptLevel = A->getValue();
8736 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8737 A->render(Args, CmdArgs);
8738 else if (OptLevel == "3")
8739 CmdArgs.push_back("/Ox");
8740 }
8741 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008742
Nico Weber3f8dafb2015-03-12 19:37:10 +00008743 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008744 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8745
David Majnemerf6072342014-07-01 22:24:56 +00008746 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8747 /*default=*/false))
8748 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008749 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8750 options::OPT_fno_function_sections))
8751 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8752 ? "/Gy"
8753 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008754 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8755 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008756 CmdArgs.push_back(
8757 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008758 if (Args.hasArg(options::OPT_fsyntax_only))
8759 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008760 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8761 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008762
Nico Weber3f8dafb2015-03-12 19:37:10 +00008763 std::vector<std::string> Includes =
8764 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008765 for (const auto &Include : Includes)
8766 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008767
Hans Wennborg87cfa712013-09-19 20:32:16 +00008768 // Flags that can simply be passed through.
8769 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8770 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008771 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008772
8773 // The order of these flags is relevant, so pick the last one.
8774 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8775 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8776 A->render(Args, CmdArgs);
8777
Hans Wennborg87cfa712013-09-19 20:32:16 +00008778 // Input filename.
8779 assert(Inputs.size() == 1);
8780 const InputInfo &II = Inputs[0];
8781 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8782 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8783 if (II.isFilename())
8784 CmdArgs.push_back(II.getFilename());
8785 else
8786 II.getInputArg().renderAsInput(Args, CmdArgs);
8787
8788 // Output filename.
8789 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008790 const char *Fo =
8791 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00008792 CmdArgs.push_back(Fo);
8793
Hans Wennborg188382e2013-09-20 18:16:35 +00008794 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008795 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8796 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008797 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8798 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008799}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008800
Yaron Keren1c0070c2015-07-02 04:45:27 +00008801/// MinGW Tools
8802void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8803 const InputInfo &Output,
8804 const InputInfoList &Inputs,
8805 const ArgList &Args,
8806 const char *LinkingOutput) const {
8807 claimNoWarnArgs(Args);
8808 ArgStringList CmdArgs;
8809
8810 if (getToolChain().getArch() == llvm::Triple::x86) {
8811 CmdArgs.push_back("--32");
8812 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
8813 CmdArgs.push_back("--64");
8814 }
8815
8816 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8817
8818 CmdArgs.push_back("-o");
8819 CmdArgs.push_back(Output.getFilename());
8820
8821 for (const auto &II : Inputs)
8822 CmdArgs.push_back(II.getFilename());
8823
8824 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
8825 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8826
8827 if (Args.hasArg(options::OPT_gsplit_dwarf))
8828 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
8829 SplitDebugName(Args, Inputs[0]));
8830}
8831
8832void MinGW::Linker::AddLibGCC(const ArgList &Args,
8833 ArgStringList &CmdArgs) const {
8834 if (Args.hasArg(options::OPT_mthreads))
8835 CmdArgs.push_back("-lmingwthrd");
8836 CmdArgs.push_back("-lmingw32");
8837 if (Args.hasArg(options::OPT_shared) ||
8838 Args.hasArg(options::OPT_shared_libgcc) ||
8839 !Args.hasArg(options::OPT_static_libgcc)) {
8840 CmdArgs.push_back("-lgcc_s");
8841 CmdArgs.push_back("-lgcc");
8842 } else {
8843 CmdArgs.push_back("-lgcc");
8844 CmdArgs.push_back("-lgcc_eh");
8845 }
8846 CmdArgs.push_back("-lmoldname");
8847 CmdArgs.push_back("-lmingwex");
8848 CmdArgs.push_back("-lmsvcrt");
8849}
8850
8851void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8852 const InputInfo &Output,
8853 const InputInfoList &Inputs,
8854 const ArgList &Args,
8855 const char *LinkingOutput) const {
8856 const ToolChain &TC = getToolChain();
8857 const Driver &D = TC.getDriver();
8858 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
8859
8860 ArgStringList CmdArgs;
8861
8862 // Silence warning for "clang -g foo.o -o foo"
8863 Args.ClaimAllArgs(options::OPT_g_Group);
8864 // and "clang -emit-llvm foo.o -o foo"
8865 Args.ClaimAllArgs(options::OPT_emit_llvm);
8866 // and for "clang -w foo.o -o foo". Other warning options are already
8867 // handled somewhere else.
8868 Args.ClaimAllArgs(options::OPT_w);
8869
8870 if (!D.SysRoot.empty())
8871 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8872
8873 if (Args.hasArg(options::OPT_s))
8874 CmdArgs.push_back("-s");
8875
8876 CmdArgs.push_back("-m");
8877 if (TC.getArch() == llvm::Triple::x86)
8878 CmdArgs.push_back("i386pe");
8879 if (TC.getArch() == llvm::Triple::x86_64)
8880 CmdArgs.push_back("i386pep");
8881
8882 if (Args.hasArg(options::OPT_mwindows)) {
8883 CmdArgs.push_back("--subsystem");
8884 CmdArgs.push_back("windows");
8885 } else if (Args.hasArg(options::OPT_mconsole)) {
8886 CmdArgs.push_back("--subsystem");
8887 CmdArgs.push_back("console");
8888 }
8889
8890 if (Args.hasArg(options::OPT_static))
8891 CmdArgs.push_back("-Bstatic");
8892 else {
8893 if (Args.hasArg(options::OPT_mdll))
8894 CmdArgs.push_back("--dll");
8895 else if (Args.hasArg(options::OPT_shared))
8896 CmdArgs.push_back("--shared");
8897 CmdArgs.push_back("-Bdynamic");
8898 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
8899 CmdArgs.push_back("-e");
8900 if (TC.getArch() == llvm::Triple::x86)
8901 CmdArgs.push_back("_DllMainCRTStartup@12");
8902 else
8903 CmdArgs.push_back("DllMainCRTStartup");
8904 CmdArgs.push_back("--enable-auto-image-base");
8905 }
8906 }
8907
8908 CmdArgs.push_back("-o");
8909 CmdArgs.push_back(Output.getFilename());
8910
8911 Args.AddAllArgs(CmdArgs, options::OPT_e);
8912 // FIXME: add -N, -n flags
8913 Args.AddLastArg(CmdArgs, options::OPT_r);
8914 Args.AddLastArg(CmdArgs, options::OPT_s);
8915 Args.AddLastArg(CmdArgs, options::OPT_t);
8916 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
8917 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
8918
8919 if (!Args.hasArg(options::OPT_nostdlib) &&
8920 !Args.hasArg(options::OPT_nostartfiles)) {
8921 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
8922 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
8923 } else {
8924 if (Args.hasArg(options::OPT_municode))
8925 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
8926 else
8927 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
8928 }
8929 if (Args.hasArg(options::OPT_pg))
8930 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
8931 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
8932 }
8933
8934 Args.AddAllArgs(CmdArgs, options::OPT_L);
8935 const ToolChain::path_list Paths = TC.getFilePaths();
8936 for (const auto &Path : Paths)
8937 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8938
8939 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8940
8941 // TODO: Add ASan stuff here
8942
8943 // TODO: Add profile stuff here
8944
8945 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8946 !Args.hasArg(options::OPT_nodefaultlibs)) {
8947 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
8948 !Args.hasArg(options::OPT_static);
8949 if (OnlyLibstdcxxStatic)
8950 CmdArgs.push_back("-Bstatic");
8951 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8952 if (OnlyLibstdcxxStatic)
8953 CmdArgs.push_back("-Bdynamic");
8954 }
8955
8956 if (!Args.hasArg(options::OPT_nostdlib)) {
8957 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8958 if (Args.hasArg(options::OPT_static))
8959 CmdArgs.push_back("--start-group");
8960
8961 if (Args.hasArg(options::OPT_fstack_protector) ||
8962 Args.hasArg(options::OPT_fstack_protector_strong) ||
8963 Args.hasArg(options::OPT_fstack_protector_all)) {
8964 CmdArgs.push_back("-lssp_nonshared");
8965 CmdArgs.push_back("-lssp");
8966 }
8967 if (Args.hasArg(options::OPT_fopenmp))
8968 CmdArgs.push_back("-lgomp");
8969
8970 AddLibGCC(Args, CmdArgs);
8971
8972 if (Args.hasArg(options::OPT_pg))
8973 CmdArgs.push_back("-lgmon");
8974
8975 // FIXME: what to do about pthreads library?
8976 // Currently required for OpenMP and posix-threading libgcc,
8977 // does not exists in mingw.org.
8978 //CmdArgs.push_back("-lpthread");
8979
8980 // add system libraries
8981 if (Args.hasArg(options::OPT_mwindows)) {
8982 CmdArgs.push_back("-lgdi32");
8983 CmdArgs.push_back("-lcomdlg32");
8984 }
8985 CmdArgs.push_back("-ladvapi32");
8986 CmdArgs.push_back("-lshell32");
8987 CmdArgs.push_back("-luser32");
8988 CmdArgs.push_back("-lkernel32");
8989
8990 if (Args.hasArg(options::OPT_static))
8991 CmdArgs.push_back("--end-group");
8992 else
8993 AddLibGCC(Args, CmdArgs);
8994 }
8995
8996 if (!Args.hasArg(options::OPT_nostartfiles)) {
8997 // Add crtfastmath.o if available and fast math is enabled.
8998 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
8999
9000 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9001 }
9002 }
9003 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ld"));
9004 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9005}
9006
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009007/// XCore Tools
9008// We pass assemble and link construction to the xcc tool.
9009
Douglas Katzman95354292015-06-23 20:42:09 +00009010void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9011 const InputInfo &Output,
9012 const InputInfoList &Inputs,
9013 const ArgList &Args,
9014 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009015 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009016 ArgStringList CmdArgs;
9017
9018 CmdArgs.push_back("-o");
9019 CmdArgs.push_back(Output.getFilename());
9020
9021 CmdArgs.push_back("-c");
9022
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009023 if (Args.hasArg(options::OPT_v))
9024 CmdArgs.push_back("-v");
9025
Robert Lytton894d25c2014-05-02 09:33:25 +00009026 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9027 if (!A->getOption().matches(options::OPT_g0))
9028 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009029
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009030 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9031 false))
9032 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009034 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009035
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009036 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009037 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009038
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009039 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00009040 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009041}
9042
Douglas Katzman95354292015-06-23 20:42:09 +00009043void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9044 const InputInfo &Output,
9045 const InputInfoList &Inputs,
9046 const ArgList &Args,
9047 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009048 ArgStringList CmdArgs;
9049
9050 if (Output.isFilename()) {
9051 CmdArgs.push_back("-o");
9052 CmdArgs.push_back(Output.getFilename());
9053 } else {
9054 assert(Output.isNothing() && "Invalid output.");
9055 }
9056
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009057 if (Args.hasArg(options::OPT_v))
9058 CmdArgs.push_back("-v");
9059
David Majnemer8de68642014-12-05 08:11:58 +00009060 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009061 CmdArgs.push_back("-fexceptions");
9062
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009063 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9064
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009065 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00009066 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009067}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009068
Douglas Katzman95354292015-06-23 20:42:09 +00009069void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9070 const InputInfo &Output,
9071 const InputInfoList &Inputs,
9072 const ArgList &Args,
9073 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009074 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009075 const auto &TC =
9076 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9077 ArgStringList CmdArgs;
9078 const char *Exec;
9079
9080 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009081 default:
9082 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009083 case llvm::Triple::arm:
9084 case llvm::Triple::thumb:
9085 break;
9086 case llvm::Triple::x86:
9087 CmdArgs.push_back("--32");
9088 break;
9089 case llvm::Triple::x86_64:
9090 CmdArgs.push_back("--64");
9091 break;
9092 }
9093
9094 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9095
9096 CmdArgs.push_back("-o");
9097 CmdArgs.push_back(Output.getFilename());
9098
9099 for (const auto &Input : Inputs)
9100 CmdArgs.push_back(Input.getFilename());
9101
9102 const std::string Assembler = TC.GetProgramPath("as");
9103 Exec = Args.MakeArgString(Assembler);
9104
9105 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9106}
9107
Douglas Katzman95354292015-06-23 20:42:09 +00009108void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9109 const InputInfo &Output,
9110 const InputInfoList &Inputs,
9111 const ArgList &Args,
9112 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009113 const auto &TC =
9114 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9115 const llvm::Triple &T = TC.getTriple();
9116 const Driver &D = TC.getDriver();
9117 SmallString<128> EntryPoint;
9118 ArgStringList CmdArgs;
9119 const char *Exec;
9120
9121 // Silence warning for "clang -g foo.o -o foo"
9122 Args.ClaimAllArgs(options::OPT_g_Group);
9123 // and "clang -emit-llvm foo.o -o foo"
9124 Args.ClaimAllArgs(options::OPT_emit_llvm);
9125 // and for "clang -w foo.o -o foo"
9126 Args.ClaimAllArgs(options::OPT_w);
9127 // Other warning options are already handled somewhere else.
9128
9129 if (!D.SysRoot.empty())
9130 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9131
9132 if (Args.hasArg(options::OPT_pie))
9133 CmdArgs.push_back("-pie");
9134 if (Args.hasArg(options::OPT_rdynamic))
9135 CmdArgs.push_back("-export-dynamic");
9136 if (Args.hasArg(options::OPT_s))
9137 CmdArgs.push_back("--strip-all");
9138
9139 CmdArgs.push_back("-m");
9140 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009141 default:
9142 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009143 case llvm::Triple::arm:
9144 case llvm::Triple::thumb:
9145 // FIXME: this is incorrect for WinCE
9146 CmdArgs.push_back("thumb2pe");
9147 break;
9148 case llvm::Triple::x86:
9149 CmdArgs.push_back("i386pe");
9150 EntryPoint.append("_");
9151 break;
9152 case llvm::Triple::x86_64:
9153 CmdArgs.push_back("i386pep");
9154 break;
9155 }
9156
9157 if (Args.hasArg(options::OPT_shared)) {
9158 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009159 default:
9160 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009161 case llvm::Triple::arm:
9162 case llvm::Triple::thumb:
9163 case llvm::Triple::x86_64:
9164 EntryPoint.append("_DllMainCRTStartup");
9165 break;
9166 case llvm::Triple::x86:
9167 EntryPoint.append("_DllMainCRTStartup@12");
9168 break;
9169 }
9170
9171 CmdArgs.push_back("-shared");
9172 CmdArgs.push_back("-Bdynamic");
9173
9174 CmdArgs.push_back("--enable-auto-image-base");
9175
9176 CmdArgs.push_back("--entry");
9177 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9178 } else {
9179 EntryPoint.append("mainCRTStartup");
9180
9181 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9182 : "-Bdynamic");
9183
9184 if (!Args.hasArg(options::OPT_nostdlib) &&
9185 !Args.hasArg(options::OPT_nostartfiles)) {
9186 CmdArgs.push_back("--entry");
9187 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9188 }
9189
9190 // FIXME: handle subsystem
9191 }
9192
9193 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009194 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009195
9196 CmdArgs.push_back("-o");
9197 CmdArgs.push_back(Output.getFilename());
9198
9199 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9200 SmallString<261> ImpLib(Output.getFilename());
9201 llvm::sys::path::replace_extension(ImpLib, ".lib");
9202
9203 CmdArgs.push_back("--out-implib");
9204 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9205 }
9206
9207 if (!Args.hasArg(options::OPT_nostdlib) &&
9208 !Args.hasArg(options::OPT_nostartfiles)) {
9209 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9210 const char *CRTBegin;
9211
9212 CRTBegin =
9213 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9214 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9215 }
9216
9217 Args.AddAllArgs(CmdArgs, options::OPT_L);
9218
9219 const auto &Paths = TC.getFilePaths();
9220 for (const auto &Path : Paths)
9221 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9222
9223 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9224
9225 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9226 !Args.hasArg(options::OPT_nodefaultlibs)) {
9227 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9228 !Args.hasArg(options::OPT_static);
9229 if (StaticCXX)
9230 CmdArgs.push_back("-Bstatic");
9231 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9232 if (StaticCXX)
9233 CmdArgs.push_back("-Bdynamic");
9234 }
9235
9236 if (!Args.hasArg(options::OPT_nostdlib)) {
9237 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9238 // TODO handle /MT[d] /MD[d]
9239 CmdArgs.push_back("-lmsvcrt");
9240 AddRunTimeLibs(TC, D, CmdArgs, Args);
9241 }
9242 }
9243
9244 const std::string Linker = TC.GetProgramPath("ld");
9245 Exec = Args.MakeArgString(Linker);
9246
9247 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
9248}
Douglas Katzman84a75642015-06-19 14:55:19 +00009249
Douglas Katzman95354292015-06-23 20:42:09 +00009250void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9251 const InputInfo &Output,
9252 const InputInfoList &Inputs,
9253 const ArgList &Args,
9254 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009255
9256 ArgStringList CmdArgs;
9257
9258 assert(Inputs.size() == 1);
9259 const InputInfo &II = Inputs[0];
9260 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9261 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9262
9263 // Append all -I, -iquote, -isystem paths.
9264 Args.AddAllArgs(CmdArgs, options::OPT_clang_i_Group);
9265 // These are spelled the same way in clang and moviCompile.
9266 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
9267
9268 CmdArgs.push_back("-DMYRIAD2");
9269 CmdArgs.push_back("-mcpu=myriad2");
9270 CmdArgs.push_back("-S");
9271
9272 // Any -O option passes through without translation. What about -Ofast ?
9273 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9274 A->render(Args, CmdArgs);
9275
9276 if (Args.hasFlag(options::OPT_ffunction_sections,
9277 options::OPT_fno_function_sections)) {
9278 CmdArgs.push_back("-ffunction-sections");
9279 }
9280 if (Args.hasArg(options::OPT_fno_inline_functions))
9281 CmdArgs.push_back("-fno-inline-functions");
9282
9283 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9284
9285 CmdArgs.push_back(II.getFilename());
9286 CmdArgs.push_back("-o");
9287 CmdArgs.push_back(Output.getFilename());
9288
9289 std::string Exec =
9290 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
9291 C.addCommand(
9292 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9293}
9294
Douglas Katzman95354292015-06-23 20:42:09 +00009295void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9296 const InputInfo &Output,
9297 const InputInfoList &Inputs,
9298 const ArgList &Args,
9299 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009300 ArgStringList CmdArgs;
9301
9302 assert(Inputs.size() == 1);
9303 const InputInfo &II = Inputs[0];
9304 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9305 assert(Output.getType() == types::TY_Object);
9306
9307 CmdArgs.push_back("-no6thSlotCompression");
9308 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9309 CmdArgs.push_back("-noSPrefixing");
9310 CmdArgs.push_back("-a"); // Mystery option.
9311 for (auto Arg : Args.filtered(options::OPT_I)) {
9312 Arg->claim();
9313 CmdArgs.push_back(
9314 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9315 }
9316 CmdArgs.push_back("-elf"); // Output format.
9317 CmdArgs.push_back(II.getFilename());
9318 CmdArgs.push_back(
9319 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9320
9321 std::string Exec =
9322 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
9323 C.addCommand(
9324 llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), CmdArgs));
9325}