blob: 4dbc5419348739154c9288fb3cfc750ab8c3ac6f [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
Renato Golin0600e1e2015-05-08 21:04:50 +000035#include "llvm/Support/TargetParser.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000044
Ben Langmuir3b7b5402015-02-03 19:28:37 +000045#ifdef LLVM_ON_UNIX
46#include <unistd.h> // For getuid().
47#endif
48
Daniel Dunbar1a093d22009-03-18 06:00:36 +000049using namespace clang::driver;
50using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000051using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000052using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000053
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000054static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
55 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56 options::OPT_fpic, options::OPT_fno_pic,
57 options::OPT_fPIE, options::OPT_fno_PIE,
58 options::OPT_fpie, options::OPT_fno_pie);
59 if (!LastPICArg)
60 return;
61 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
62 LastPICArg->getOption().matches(options::OPT_fpic) ||
63 LastPICArg->getOption().matches(options::OPT_fPIE) ||
64 LastPICArg->getOption().matches(options::OPT_fpie)) {
65 CmdArgs.push_back("-KPIC");
66 }
67}
68
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069/// CheckPreprocessingOptions - Perform some validation of preprocessing
70/// arguments that is shared with gcc.
71static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000072 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
73 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
74 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000075 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000076 << A->getBaseArg().getAsString(Args)
77 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
78 }
79 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000080}
81
Daniel Dunbar4eadb602009-09-10 01:21:12 +000082/// CheckCodeGenerationOptions - Perform some validation of code generation
83/// arguments that is shared with gcc.
84static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
85 // In gcc, only ARM checks this, but it seems reasonable to check universally.
86 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000087 if (const Arg *A =
88 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
89 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
90 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000091}
92
Bob Wilsond5aad2a2014-11-04 22:28:48 +000093// Add backslashes to escape spaces and other backslashes.
94// This is used for the space-separated argument list specified with
95// the -dwarf-debug-flags option.
96static void EscapeSpacesAndBackslashes(const char *Arg,
97 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000098 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000099 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000100 default:
101 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000102 case ' ':
103 case '\\':
104 Res.push_back('\\');
105 break;
106 }
107 Res.push_back(*Arg);
108 }
109}
110
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000111// Quote target names for inclusion in GNU Make dependency files.
112// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000113static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000114 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
115 switch (Target[i]) {
116 case ' ':
117 case '\t':
118 // Escape the preceding backslashes
119 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
120 Res.push_back('\\');
121
122 // Escape the space/tab
123 Res.push_back('\\');
124 break;
125 case '$':
126 Res.push_back('$');
127 break;
128 case '#':
129 Res.push_back('\\');
130 break;
131 default:
132 break;
133 }
134
135 Res.push_back(Target[i]);
136 }
137}
138
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000139static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
140 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000141 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000142 bool CombinedArg = false;
143
Bill Wendling281ca292012-03-12 21:22:35 +0000144 if (!DirList)
145 return; // Nothing to do.
146
Chad Rosier616e8a52012-10-30 21:42:09 +0000147 StringRef Name(ArgName);
148 if (Name.equals("-I") || Name.equals("-L"))
149 CombinedArg = true;
150
Bill Wendling281ca292012-03-12 21:22:35 +0000151 StringRef Dirs(DirList);
152 if (Dirs.empty()) // Empty string should not add '.'.
153 return;
154
155 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000156 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000157 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 if (CombinedArg) {
159 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
160 } else {
161 CmdArgs.push_back(ArgName);
162 CmdArgs.push_back(".");
163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000165 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000166 CmdArgs.push_back(
167 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000168 } else {
169 CmdArgs.push_back(ArgName);
170 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
171 }
Bill Wendling281ca292012-03-12 21:22:35 +0000172 }
Nico Weber89355782012-03-19 15:00:03 +0000173 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000174 }
175
176 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000177 if (CombinedArg) {
178 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
179 } else {
180 CmdArgs.push_back(ArgName);
181 CmdArgs.push_back(".");
182 }
Bill Wendling281ca292012-03-12 21:22:35 +0000183 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 if (CombinedArg) {
185 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
186 } else {
187 CmdArgs.push_back(ArgName);
188 CmdArgs.push_back(Args.MakeArgString(Dirs));
189 }
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191}
192
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000193static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
194 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000195 const Driver &D = TC.getDriver();
196
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000197 // Add extra linker input arguments which are not treated as inputs
198 // (constructed via -Xarch_).
199 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
200
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000201 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000202 if (!TC.HasNativeLLVMSupport()) {
203 // Don't try to pass LLVM inputs unless we have native support.
204 if (II.getType() == types::TY_LLVM_IR ||
205 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000206 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
207 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000208 }
209
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000210 // Add filenames immediately.
211 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000212 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000213 continue;
214 }
215
216 // Otherwise, this is a linker input argument.
217 const Arg &A = II.getInputArg();
218
219 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000220 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000221 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000222 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000223 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000224 else if (A.getOption().matches(options::OPT_z)) {
225 // Pass -z prefix for gcc linker compatibility.
226 A.claim();
227 A.render(Args, CmdArgs);
228 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000229 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000230 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000231 }
Bill Wendling281ca292012-03-12 21:22:35 +0000232
233 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000234 // and only supported on native toolchains.
235 if (!TC.isCrossCompiling())
236 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237}
238
John McCall31168b02011-06-15 23:02:42 +0000239/// \brief Determine whether Objective-C automated reference counting is
240/// enabled.
241static bool isObjCAutoRefCount(const ArgList &Args) {
242 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
243}
244
Ted Kremeneke65b0862012-03-06 20:05:56 +0000245/// \brief Determine whether we are linking the ObjC runtime.
246static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000247 if (isObjCAutoRefCount(Args)) {
248 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000249 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000250 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000251 return Args.hasArg(options::OPT_fobjc_link_runtime);
252}
253
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000254static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000255 // Don't forward inputs from the original command line. They are added from
256 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000257 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000258 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000259}
260
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000261void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
262 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 ArgStringList &CmdArgs,
264 const InputInfo &Output,
265 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000266 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000267
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000268 CheckPreprocessingOptions(D, Args);
269
270 Args.AddLastArg(CmdArgs, options::OPT_C);
271 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000272
273 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000274 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 (A = Args.getLastArg(options::OPT_MD)) ||
276 (A = Args.getLastArg(options::OPT_MMD))) {
277 // Determine the output location.
278 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000279 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000280 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000281 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000282 } else if (Output.getType() == types::TY_Dependencies) {
283 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000284 } else if (A->getOption().matches(options::OPT_M) ||
285 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000286 DepFile = "-";
287 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000288 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000289 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000290 }
291 CmdArgs.push_back("-dependency-file");
292 CmdArgs.push_back(DepFile);
293
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000294 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000295 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
296 const char *DepTarget;
297
298 // If user provided -o, that is the dependency target, except
299 // when we are only generating a dependency file.
300 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
301 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000302 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 } else {
304 // Otherwise derive from the base input.
305 //
306 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000307 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000308 llvm::sys::path::replace_extension(P, "o");
309 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 }
311
312 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000314 QuoteTarget(DepTarget, Quoted);
315 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000318 if (A->getOption().matches(options::OPT_M) ||
319 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000321 if ((isa<PrecompileJobAction>(JA) &&
322 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
323 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000324 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000325 }
326
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000327 if (Args.hasArg(options::OPT_MG)) {
328 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000329 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000330 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000331 CmdArgs.push_back("-MG");
332 }
333
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000335 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336
337 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000338 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000339 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000340
Daniel Dunbara442fd52010-06-11 22:00:13 +0000341 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000342 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000343 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000344 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 CmdArgs.push_back(Args.MakeArgString(Quoted));
346
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000347 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000348 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000349 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000350 }
351 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000352
Douglas Gregor111af7d2009-04-18 00:34:01 +0000353 // Add -i* options, and automatically translate to
354 // -include-pch/-include-pth for transparent PCH support. It's
355 // wonky, but we include looking for .gch so we can support seamless
356 // replacement into a build system already set up to be generating
357 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000358 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000359 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000360 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000361 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
362 RenderedImplicitInclude = true;
363
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000364 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000365 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000366
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000367 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000369 SmallString<128> P(A->getValue());
370 // We want the files to have a name like foo.h.pch. Add a dummy extension
371 // so that replace_extension does the right thing.
372 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000373 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000374 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000375 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000377 }
378
Douglas Gregor111af7d2009-04-18 00:34:01 +0000379 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000380 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000381 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000382 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000383 }
384
Douglas Gregor111af7d2009-04-18 00:34:01 +0000385 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000386 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000387 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000388 FoundPCH = UsePCH;
389 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000390 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000391 }
392
393 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000394 if (IsFirstImplicitInclude) {
395 A->claim();
396 if (UsePCH)
397 CmdArgs.push_back("-include-pch");
398 else
399 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000401 continue;
402 } else {
403 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000404 D.Diag(diag::warn_drv_pch_not_first_include) << P
405 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000406 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000407 }
408 }
409
410 // Not translated, render as usual.
411 A->claim();
412 A->render(Args, CmdArgs);
413 }
414
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000415 Args.AddAllArgs(CmdArgs,
416 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
417 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000418
419 // Add -Wp, and -Xassembler if using the preprocessor.
420
421 // FIXME: There is a very unfortunate problem here, some troubled
422 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
423 // really support that we would have to parse and then translate
424 // those options. :(
425 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
426 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000427
428 // -I- is a deprecated GCC feature, reject it.
429 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000430 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000431
432 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
433 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000434 StringRef sysroot = C.getSysRoot();
435 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000436 if (!Args.hasArg(options::OPT_isysroot)) {
437 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000438 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000439 }
440 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000441
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000442 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000443 // FIXME: We should probably sink the logic for handling these from the
444 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000445 // CPATH - included following the user specified includes (but prior to
446 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000447 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000448 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000449 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000450 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000451 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000452 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000453 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000454 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000455 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000456
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000457 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000458 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000459 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000460
461 // Add system include arguments.
462 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463}
464
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000465// FIXME: Move to target hook.
466static bool isSignedCharDefault(const llvm::Triple &Triple) {
467 switch (Triple.getArch()) {
468 default:
469 return true;
470
Tim Northover9bb857a2013-01-31 12:13:10 +0000471 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000472 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000473 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000474 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000475 case llvm::Triple::thumb:
476 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000477 if (Triple.isOSDarwin() || Triple.isOSWindows())
478 return true;
479 return false;
480
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000481 case llvm::Triple::ppc:
482 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000483 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000484 return true;
485 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000486
David Majnemerdcecd932015-05-23 19:23:55 +0000487 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000488 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000489 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000490 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000491 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492 }
493}
494
Robert Lytton0e076492013-08-13 09:43:10 +0000495static bool isNoCommonDefault(const llvm::Triple &Triple) {
496 switch (Triple.getArch()) {
497 default:
498 return false;
499
500 case llvm::Triple::xcore:
501 return true;
502 }
503}
504
Renato Goline17c5802015-07-27 23:44:42 +0000505// ARM tools start.
506
507// Get SubArch (vN).
508static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
509 llvm::StringRef Arch = Triple.getArchName();
510 return llvm::ARMTargetParser::parseArchVersion(Arch);
511}
512
513// True if M-profile.
514static bool isARMMProfile(const llvm::Triple &Triple) {
515 llvm::StringRef Arch = Triple.getArchName();
516 unsigned Profile = llvm::ARMTargetParser::parseArchProfile(Arch);
517 return Profile == llvm::ARM::PK_M;
518}
519
520// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000521static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
522 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000523 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
524 CPU = A->getValue();
525 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
526 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000527 if (!FromAs)
528 return;
529
530 for (const Arg *A :
531 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
532 StringRef Value = A->getValue();
533 if (Value.startswith("-mcpu="))
534 CPU = Value.substr(6);
535 if (Value.startswith("-march="))
536 Arch = Value.substr(7);
537 }
Renato Goline17c5802015-07-27 23:44:42 +0000538}
539
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000540// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000541// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000542static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000543 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000544 std::vector<const char *> &Features) {
Alexandros Lamprinease5b47642015-07-28 09:08:03 +0000545 unsigned HWDivID = llvm::ARMTargetParser::parseHWDiv(HWDiv);
546 if (!llvm::ARMTargetParser::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000547 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
548}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000549
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000550// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000551static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000552 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000553 std::vector<const char *> &Features) {
John Brawn5a589ad2015-06-05 13:34:11 +0000554 unsigned FPUID = llvm::ARMTargetParser::parseFPU(FPU);
555 if (!llvm::ARMTargetParser::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000556 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
557}
558
Renato Golin7c542b42015-07-27 23:44:45 +0000559// Check if -march is valid by checking if it can be canonicalised and parsed.
560// getARMArch is used here instead of just checking the -march value in order
561// to handle -march=native correctly.
562static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000563 llvm::StringRef ArchName,
564 const llvm::Triple &Triple) {
565 std::string MArch = arm::getARMArch(ArchName, Triple);
566 if (llvm::ARMTargetParser::parseArch(MArch) == llvm::ARM::AK_INVALID)
567 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000568}
569
Renato Golin7c542b42015-07-27 23:44:45 +0000570// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
571static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
572 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000573 const llvm::Triple &Triple) {
574 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
575 std::string Arch = arm::getARMArch(ArchName, Triple);
576 if (strcmp(arm::getLLVMArchSuffixForARM(CPU, Arch), "") == 0)
577 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000578}
579
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000580// Select the float ABI as determined by -msoft-float, -mhard-float, and
581// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000582StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000583 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000584 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000585 if (Arg *A =
586 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
587 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000588 if (A->getOption().matches(options::OPT_msoft_float))
589 FloatABI = "soft";
590 else if (A->getOption().matches(options::OPT_mhard_float))
591 FloatABI = "hard";
592 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000593 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000594 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000595 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000596 FloatABI = "soft";
597 }
598 }
599 }
600
601 // If unspecified, choose the default based on the platform.
602 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000603 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000604 case llvm::Triple::Darwin:
605 case llvm::Triple::MacOSX:
606 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 // Darwin defaults to "softfp" for v6 and v7.
608 //
John Brawn94fd9632015-05-21 12:19:49 +0000609 if (getARMSubArchVersionNumber(Triple) == 6 ||
610 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000611 FloatABI = "softfp";
612 else
613 FloatABI = "soft";
614 break;
615 }
616
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000617 // FIXME: this is invalid for WindowsCE
618 case llvm::Triple::Win32:
619 FloatABI = "hard";
620 break;
621
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000622 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000623 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000624 case llvm::Triple::GNUEABIHF:
625 FloatABI = "hard";
626 break;
627 default:
628 // FreeBSD defaults to soft float
629 FloatABI = "soft";
630 break;
631 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000632 break;
633
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000635 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000642 case llvm::Triple::EABIHF:
643 FloatABI = "hard";
644 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000645 case llvm::Triple::EABI:
646 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
647 FloatABI = "softfp";
648 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000649 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000650 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000656 default:
657 // Assume "soft", but warn the user we are guessing.
658 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000659 if (Triple.getOS() != llvm::Triple::UnknownOS ||
660 !Triple.isOSBinFormatMachO())
661 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000662 break;
663 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 }
665 }
666
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000667 return FloatABI;
668}
669
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000670static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
671 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000672 std::vector<const char *> &Features,
673 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000674 bool KernelOrKext =
675 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000676 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000677 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
678 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
679
Nico Weber6e0ebae2015-04-29 21:16:40 +0000680 if (!ForAS) {
681 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
682 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
683 // stripped out by the ARM target. We should probably pass this a new
684 // -target-option, which is handled by the -cc1/-cc1as invocation.
685 //
686 // FIXME2: For consistency, it would be ideal if we set up the target
687 // machine state the same when using the frontend or the assembler. We don't
688 // currently do that for the assembler, we pass the options directly to the
689 // backend and never even instantiate the frontend TargetInfo. If we did,
690 // and used its handleTargetFeatures hook, then we could ensure the
691 // assembler and the frontend behave the same.
692
693 // Use software floating point operations?
694 if (FloatABI == "soft")
695 Features.push_back("+soft-float");
696
697 // Use software floating point argument passing?
698 if (FloatABI != "hard")
699 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000700 } else {
701 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
702 // to the assembler correctly.
703 for (const Arg *A :
704 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
705 StringRef Value = A->getValue();
706 if (Value.startswith("-mfpu=")) {
707 WaFPU = A;
708 } else if (Value.startswith("-mcpu=")) {
709 WaCPU = A;
710 } else if (Value.startswith("-mhwdiv=")) {
711 WaHDiv = A;
712 } else if (Value.startswith("-march=")) {
713 WaArch = A;
714 }
715 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000716 }
717
Renato Golin7c542b42015-07-27 23:44:45 +0000718 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
719 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
720 if (WaFPU) {
721 if (FPUArg)
722 D.Diag(clang::diag::warn_drv_unused_argument)
723 << FPUArg->getAsString(Args);
724 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
725 Features);
726 } else if (FPUArg) {
727 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
728 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000729
Renato Golin7c542b42015-07-27 23:44:45 +0000730 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
731 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
732 if (WaHDiv) {
733 if (HDivArg)
734 D.Diag(clang::diag::warn_drv_unused_argument)
735 << HDivArg->getAsString(Args);
736 getARMHWDivFeatures(D, WaHDiv, Args,
737 StringRef(WaHDiv->getValue()).substr(8), Features);
738 } else if (HDivArg)
739 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
740
741 // Check -march. ClangAs gives preference to -Wa,-march=.
742 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000743 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000744 if (WaArch) {
745 if (ArchArg)
746 D.Diag(clang::diag::warn_drv_unused_argument)
747 << ArchArg->getAsString(Args);
748 ArchName = StringRef(WaArch->getValue()).substr(7);
749 checkARMArchName(D, WaArch, Args, ArchName, Triple);
750 // FIXME: Set Arch.
751 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
752 } else if (ArchArg) {
753 ArchName = ArchArg->getValue();
754 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000755 }
756
Renato Golin7c542b42015-07-27 23:44:45 +0000757 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
758 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000759 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000760 if (WaCPU) {
761 if (CPUArg)
762 D.Diag(clang::diag::warn_drv_unused_argument)
763 << CPUArg->getAsString(Args);
764 CPUName = StringRef(WaCPU->getValue()).substr(6);
765 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
766 } else if (CPUArg) {
767 CPUName = CPUArg->getValue();
768 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000769 }
John Brawna95c1a82015-05-08 12:52:18 +0000770
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000771 // Setting -msoft-float effectively disables NEON because of the GCC
772 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000773 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000774 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000775 // Also need to explicitly disable features which imply NEON.
776 Features.push_back("-crypto");
777 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000778
Eric Christopher269c2a22015-04-04 03:34:43 +0000779 // En/disable crc code generation.
780 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000781 if (A->getOption().matches(options::OPT_mcrc))
782 Features.push_back("+crc");
783 else
784 Features.push_back("-crc");
785 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000786
787 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
788 Features.insert(Features.begin(), "+v8.1a");
789 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000790
Akira Hatanakac2694822015-07-07 08:28:42 +0000791 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
792 // neither options are specified, see if we are compiling for kernel/kext and
793 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000794 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
795 options::OPT_mno_long_calls)) {
796 if (A->getOption().matches(options::OPT_mlong_calls))
797 Features.push_back("+long-calls");
798 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
799 Features.push_back("+long-calls");
800 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000801
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000802 // Kernel code has more strict alignment requirements.
803 if (KernelOrKext)
804 Features.push_back("+strict-align");
805 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
806 options::OPT_munaligned_access)) {
807 if (A->getOption().matches(options::OPT_munaligned_access)) {
808 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
809 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
810 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
811 } else
812 Features.push_back("+strict-align");
813 } else {
814 // Assume pre-ARMv6 doesn't support unaligned accesses.
815 //
816 // ARMv6 may or may not support unaligned accesses depending on the
817 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
818 // Darwin and NetBSD targets support unaligned accesses, and others don't.
819 //
820 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
821 // which raises an alignment fault on unaligned accesses. Linux
822 // defaults this bit to 0 and handles it as a system-wide (not
823 // per-process) setting. It is therefore safe to assume that ARMv7+
824 // Linux targets support unaligned accesses. The same goes for NaCl.
825 //
826 // The above behavior is consistent with GCC.
827 int VersionNum = getARMSubArchVersionNumber(Triple);
828 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
829 if (VersionNum < 6)
830 Features.push_back("+strict-align");
831 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
832 if (VersionNum < 7)
833 Features.push_back("+strict-align");
834 } else
835 Features.push_back("+strict-align");
836 }
837
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000838 // llvm does not support reserving registers in general. There is support
839 // for reserving r9 on ARM though (defined as a platform-specific register
840 // in ARM EABI).
841 if (Args.hasArg(options::OPT_ffixed_r9))
842 Features.push_back("+reserve-r9");
843
Akira Hatanaka580efb22015-07-16 00:43:00 +0000844 // The kext linker doesn't know how to deal with movw/movt.
845 if (KernelOrKext)
846 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000847}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000848
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000849void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000850 bool KernelOrKext) const {
851 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000852 // Get the effective triple, which takes into account the deployment target.
853 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
854 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000855
856 // Select the ABI to use.
857 //
858 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000859 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000860 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000861 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000862 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000863 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000864 // The backend is hardwired to assume AAPCS for M-class processors, ensure
865 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000866 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000867 Triple.getOS() == llvm::Triple::UnknownOS || isARMMProfile(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000868 ABIName = "aapcs";
869 } else {
870 ABIName = "apcs-gnu";
871 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000872 } else if (Triple.isOSWindows()) {
873 // FIXME: this is invalid for WindowsCE
874 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000875 } else {
876 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000877 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000878 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000879 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000880 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000881 ABIName = "aapcs-linux";
882 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000883 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000884 case llvm::Triple::EABI:
885 ABIName = "aapcs";
886 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000887 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000888 if (Triple.getOS() == llvm::Triple::NetBSD)
889 ABIName = "apcs-gnu";
890 else
891 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000892 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000893 }
894 }
895 CmdArgs.push_back("-target-abi");
896 CmdArgs.push_back(ABIName);
897
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000898 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000899 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000900 if (FloatABI == "soft") {
901 // Floating point operations and argument passing are soft.
902 //
903 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000904 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000905 CmdArgs.push_back("-mfloat-abi");
906 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000907 } else if (FloatABI == "softfp") {
908 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000909 CmdArgs.push_back("-mfloat-abi");
910 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000911 } else {
912 // Floating point operations and argument passing are hard.
913 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000914 CmdArgs.push_back("-mfloat-abi");
915 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000916 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000917
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000918 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000919 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
920 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000921 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000922 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000923 CmdArgs.push_back("-arm-global-merge=false");
924 else
925 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000926 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000927
Bob Wilson9c8af452013-04-11 18:53:25 +0000928 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000929 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000930 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000931}
Renato Goline17c5802015-07-27 23:44:42 +0000932// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000933
Tim Northover573cbee2014-05-24 12:52:07 +0000934/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
935/// targeting.
936static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000937 Arg *A;
938 std::string CPU;
939 // If we have -mtune or -mcpu, use that.
940 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000941 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000942 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000943 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000944 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000945 }
946
Kevin Qin110db6f2014-07-18 07:03:22 +0000947 // Handle CPU name is 'native'.
948 if (CPU == "native")
949 return llvm::sys::getHostCPUName();
950 else if (CPU.size())
951 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000952
James Molloy9b1586b2014-04-17 12:51:17 +0000953 // Make sure we pick "cyclone" if -arch is used.
954 // FIXME: Should this be picked by checking the target triple instead?
955 if (Args.getLastArg(options::OPT_arch))
956 return "cyclone";
957
958 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000959}
960
Tim Northover573cbee2014-05-24 12:52:07 +0000961void Clang::AddAArch64TargetArgs(const ArgList &Args,
962 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000963 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
964 llvm::Triple Triple(TripleStr);
965
966 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
967 Args.hasArg(options::OPT_mkernel) ||
968 Args.hasArg(options::OPT_fapple_kext))
969 CmdArgs.push_back("-disable-red-zone");
970
971 if (!Args.hasFlag(options::OPT_mimplicit_float,
972 options::OPT_mno_implicit_float, true))
973 CmdArgs.push_back("-no-implicit-float");
974
Craig Topper92fc2df2014-05-17 16:56:41 +0000975 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000976 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
977 ABIName = A->getValue();
978 else if (Triple.isOSDarwin())
979 ABIName = "darwinpcs";
980 else
981 ABIName = "aapcs";
982
983 CmdArgs.push_back("-target-abi");
984 CmdArgs.push_back(ABIName);
985
Bradley Smith9ff64332014-10-13 10:16:06 +0000986 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
987 options::OPT_mno_fix_cortex_a53_835769)) {
988 CmdArgs.push_back("-backend-option");
989 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
990 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
991 else
992 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000993 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
994 // Enabled A53 errata (835769) workaround by default on android
995 CmdArgs.push_back("-backend-option");
996 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000997 }
998
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000999 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001000 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1001 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001002 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001003 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001004 CmdArgs.push_back("-aarch64-global-merge=false");
1005 else
1006 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001007 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001008}
1009
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001010// Get CPU and ABI names. They are not independent
1011// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001012void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1013 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001014 const char *DefMips32CPU = "mips32r2";
1015 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001016
Daniel Sanders2bf13662014-07-10 14:40:57 +00001017 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1018 // default for mips64(el)?-img-linux-gnu.
1019 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1020 Triple.getEnvironment() == llvm::Triple::GNU) {
1021 DefMips32CPU = "mips32r6";
1022 DefMips64CPU = "mips64r6";
1023 }
Renato Golin7c542b42015-07-27 23:44:45 +00001024
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001025 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1026 if (Triple.getEnvironment() == llvm::Triple::Android)
1027 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001028
Brad Smithba26f582015-01-06 02:53:17 +00001029 // MIPS3 is the default for mips64*-unknown-openbsd.
1030 if (Triple.getOS() == llvm::Triple::OpenBSD)
1031 DefMips64CPU = "mips3";
1032
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001033 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001034 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001035
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001036 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001037 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001038 // Convert a GNU style Mips ABI name to the name
1039 // accepted by LLVM Mips backend.
1040 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001041 .Case("32", "o32")
1042 .Case("64", "n64")
1043 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001044 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001045
1046 // Setup default CPU and ABI names.
1047 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001048 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001049 default:
1050 llvm_unreachable("Unexpected triple arch name");
1051 case llvm::Triple::mips:
1052 case llvm::Triple::mipsel:
1053 CPUName = DefMips32CPU;
1054 break;
1055 case llvm::Triple::mips64:
1056 case llvm::Triple::mips64el:
1057 CPUName = DefMips64CPU;
1058 break;
1059 }
1060 }
1061
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001062 if (ABIName.empty()) {
1063 // Deduce ABI name from the target triple.
1064 if (Triple.getArch() == llvm::Triple::mips ||
1065 Triple.getArch() == llvm::Triple::mipsel)
1066 ABIName = "o32";
1067 else
1068 ABIName = "n64";
1069 }
1070
1071 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001072 // Deduce CPU name from ABI name.
1073 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001074 .Cases("o32", "eabi", DefMips32CPU)
1075 .Cases("n32", "n64", DefMips64CPU)
1076 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001077 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001078
1079 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001080}
1081
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001082// Convert ABI name to the GNU tools acceptable variant.
1083static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1084 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001085 .Case("o32", "32")
1086 .Case("n64", "64")
1087 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001088}
1089
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001090// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1091// and -mfloat-abi=.
1092static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001093 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001094 if (Arg *A =
1095 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1096 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001097 if (A->getOption().matches(options::OPT_msoft_float))
1098 FloatABI = "soft";
1099 else if (A->getOption().matches(options::OPT_mhard_float))
1100 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001101 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001102 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001103 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001104 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001105 FloatABI = "hard";
1106 }
1107 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001108 }
1109
1110 // If unspecified, choose the default based on the platform.
1111 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001112 // Assume "hard", because it's a default value used by gcc.
1113 // When we start to recognize specific target MIPS processors,
1114 // we will be able to select the default more correctly.
1115 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001116 }
1117
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001118 return FloatABI;
1119}
1120
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001121static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001122 std::vector<const char *> &Features,
1123 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001124 StringRef FeatureName) {
1125 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001126 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001127 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001128 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001129 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130 }
1131}
1132
Daniel Sanders379d44b2014-07-16 11:52:23 +00001133static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1134 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001135 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001136 StringRef CPUName;
1137 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001138 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001139 ABIName = getGnuCompatibleMipsABIName(ABIName);
1140
Daniel Sandersfeb61302014-08-08 15:47:17 +00001141 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1142 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001143
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001144 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001145 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001146 // FIXME: Note, this is a hack. We need to pass the selected float
1147 // mode to the MipsTargetInfoBase to define appropriate macros there.
1148 // Now it is the only method.
1149 Features.push_back("+soft-float");
1150 }
1151
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001152 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001153 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001154 if (Val == "2008") {
1155 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1156 Features.push_back("+nan2008");
1157 else {
1158 Features.push_back("-nan2008");
1159 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1160 }
1161 } else if (Val == "legacy") {
1162 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1163 Features.push_back("-nan2008");
1164 else {
1165 Features.push_back("+nan2008");
1166 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1167 }
1168 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001169 D.Diag(diag::err_drv_unsupported_option_argument)
1170 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001171 }
1172
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001173 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1174 options::OPT_mdouble_float, "single-float");
1175 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1176 "mips16");
1177 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1178 options::OPT_mno_micromips, "micromips");
1179 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1180 "dsp");
1181 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1182 "dspr2");
1183 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1184 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001185
1186 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1187 // pass -mfpxx
1188 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1189 options::OPT_mfp64)) {
1190 if (A->getOption().matches(options::OPT_mfp32))
1191 Features.push_back(Args.MakeArgString("-fp64"));
1192 else if (A->getOption().matches(options::OPT_mfpxx)) {
1193 Features.push_back(Args.MakeArgString("+fpxx"));
1194 Features.push_back(Args.MakeArgString("+nooddspreg"));
1195 } else
1196 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001197 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001198 Features.push_back(Args.MakeArgString("+fpxx"));
1199 Features.push_back(Args.MakeArgString("+nooddspreg"));
1200 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001201
Daniel Sanders28e5d392014-07-10 10:39:51 +00001202 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1203 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001204}
1205
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001207 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208 const Driver &D = getToolChain().getDriver();
1209 StringRef CPUName;
1210 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001211 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001212 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001213
1214 CmdArgs.push_back("-target-abi");
1215 CmdArgs.push_back(ABIName.data());
1216
1217 StringRef FloatABI = getMipsFloatABI(D, Args);
1218
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001219 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001220 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001221 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001222 CmdArgs.push_back("-mfloat-abi");
1223 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001224 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001225 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001226 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001227 CmdArgs.push_back("-mfloat-abi");
1228 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001229 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001230
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001231 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1232 if (A->getOption().matches(options::OPT_mxgot)) {
1233 CmdArgs.push_back("-mllvm");
1234 CmdArgs.push_back("-mxgot");
1235 }
1236 }
1237
Simon Atanasyanc580b322013-05-11 06:33:44 +00001238 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1239 options::OPT_mno_ldc1_sdc1)) {
1240 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1241 CmdArgs.push_back("-mllvm");
1242 CmdArgs.push_back("-mno-ldc1-sdc1");
1243 }
1244 }
1245
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001246 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1247 options::OPT_mno_check_zero_division)) {
1248 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1249 CmdArgs.push_back("-mllvm");
1250 CmdArgs.push_back("-mno-check-zero-division");
1251 }
1252 }
1253
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001254 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001255 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001256 CmdArgs.push_back("-mllvm");
1257 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1258 A->claim();
1259 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001260}
1261
Hal Finkel8eb59282012-06-11 22:35:19 +00001262/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1263static std::string getPPCTargetCPU(const ArgList &Args) {
1264 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001265 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001266
1267 if (CPUName == "native") {
1268 std::string CPU = llvm::sys::getHostCPUName();
1269 if (!CPU.empty() && CPU != "generic")
1270 return CPU;
1271 else
1272 return "";
1273 }
1274
1275 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001276 .Case("common", "generic")
1277 .Case("440", "440")
1278 .Case("440fp", "440")
1279 .Case("450", "450")
1280 .Case("601", "601")
1281 .Case("602", "602")
1282 .Case("603", "603")
1283 .Case("603e", "603e")
1284 .Case("603ev", "603ev")
1285 .Case("604", "604")
1286 .Case("604e", "604e")
1287 .Case("620", "620")
1288 .Case("630", "pwr3")
1289 .Case("G3", "g3")
1290 .Case("7400", "7400")
1291 .Case("G4", "g4")
1292 .Case("7450", "7450")
1293 .Case("G4+", "g4+")
1294 .Case("750", "750")
1295 .Case("970", "970")
1296 .Case("G5", "g5")
1297 .Case("a2", "a2")
1298 .Case("a2q", "a2q")
1299 .Case("e500mc", "e500mc")
1300 .Case("e5500", "e5500")
1301 .Case("power3", "pwr3")
1302 .Case("power4", "pwr4")
1303 .Case("power5", "pwr5")
1304 .Case("power5x", "pwr5x")
1305 .Case("power6", "pwr6")
1306 .Case("power6x", "pwr6x")
1307 .Case("power7", "pwr7")
1308 .Case("power8", "pwr8")
1309 .Case("pwr3", "pwr3")
1310 .Case("pwr4", "pwr4")
1311 .Case("pwr5", "pwr5")
1312 .Case("pwr5x", "pwr5x")
1313 .Case("pwr6", "pwr6")
1314 .Case("pwr6x", "pwr6x")
1315 .Case("pwr7", "pwr7")
1316 .Case("pwr8", "pwr8")
1317 .Case("powerpc", "ppc")
1318 .Case("powerpc64", "ppc64")
1319 .Case("powerpc64le", "ppc64le")
1320 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001321 }
1322
1323 return "";
1324}
1325
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001326static void getPPCTargetFeatures(const ArgList &Args,
1327 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001328 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1329 StringRef Name = A->getOption().getName();
1330 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001331
1332 // Skip over "-m".
1333 assert(Name.startswith("m") && "Invalid feature name.");
1334 Name = Name.substr(1);
1335
1336 bool IsNegative = Name.startswith("no-");
1337 if (IsNegative)
1338 Name = Name.substr(3);
1339
1340 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1341 // pass the correct option to the backend while calling the frontend
1342 // option the same.
1343 // TODO: Change the LLVM backend option maybe?
1344 if (Name == "mfcrf")
1345 Name = "mfocrf";
1346
1347 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1348 }
1349
1350 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001351 AddTargetFeature(Args, Features, options::OPT_faltivec,
1352 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001353}
1354
Ulrich Weigand8afad612014-07-28 13:17:52 +00001355void Clang::AddPPCTargetArgs(const ArgList &Args,
1356 ArgStringList &CmdArgs) const {
1357 // Select the ABI to use.
1358 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001359 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001360 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001361 case llvm::Triple::ppc64: {
1362 // When targeting a processor that supports QPX, or if QPX is
1363 // specifically enabled, default to using the ABI that supports QPX (so
1364 // long as it is not specifically disabled).
1365 bool HasQPX = false;
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1367 HasQPX = A->getValue() == StringRef("a2q");
1368 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1369 if (HasQPX) {
1370 ABIName = "elfv1-qpx";
1371 break;
1372 }
1373
Ulrich Weigand8afad612014-07-28 13:17:52 +00001374 ABIName = "elfv1";
1375 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001376 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001377 case llvm::Triple::ppc64le:
1378 ABIName = "elfv2";
1379 break;
1380 default:
1381 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001382 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001383
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001384 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1385 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1386 // the option if given as we don't have backend support for any targets
1387 // that don't use the altivec abi.
1388 if (StringRef(A->getValue()) != "altivec")
1389 ABIName = A->getValue();
1390
Ulrich Weigand8afad612014-07-28 13:17:52 +00001391 if (ABIName) {
1392 CmdArgs.push_back("-target-abi");
1393 CmdArgs.push_back(ABIName);
1394 }
1395}
1396
1397bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1398 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1399 return A && (A->getValue() == StringRef(Value));
1400}
1401
Tom Stellard6674c702013-04-01 20:56:53 +00001402/// Get the (LLVM) name of the R600 gpu we are targeting.
1403static std::string getR600TargetGPU(const ArgList &Args) {
1404 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001405 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001406 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001407 .Cases("rv630", "rv635", "r600")
1408 .Cases("rv610", "rv620", "rs780", "rs880")
1409 .Case("rv740", "rv770")
1410 .Case("palm", "cedar")
1411 .Cases("sumo", "sumo2", "sumo")
1412 .Case("hemlock", "cypress")
1413 .Case("aruba", "cayman")
1414 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001415 }
1416 return "";
1417}
1418
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001419void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001420 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001421 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001422 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001423
James Y Knightb2406522015-06-15 20:51:24 +00001424 bool SoftFloatABI = false;
1425 if (Arg *A =
1426 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001427 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001428 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429 }
1430
James Y Knightb2406522015-06-15 20:51:24 +00001431 // Only the hard-float ABI on Sparc is standardized, and it is the
1432 // default. GCC also supports a nonstandard soft-float ABI mode, and
1433 // perhaps LLVM should implement that, too. However, since llvm
1434 // currently does not support Sparc soft-float, at all, display an
1435 // error if it's requested.
1436 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001437 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1438 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001439 }
1440}
1441
Richard Sandiford4652d892013-07-19 16:51:51 +00001442static const char *getSystemZTargetCPU(const ArgList &Args) {
1443 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1444 return A->getValue();
1445 return "z10";
1446}
1447
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001448static void getSystemZTargetFeatures(const ArgList &Args,
1449 std::vector<const char *> &Features) {
1450 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001451 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001452 if (A->getOption().matches(options::OPT_mhtm))
1453 Features.push_back("+transactional-execution");
1454 else
1455 Features.push_back("-transactional-execution");
1456 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001457 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001458 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001459 if (A->getOption().matches(options::OPT_mvx))
1460 Features.push_back("+vector");
1461 else
1462 Features.push_back("-vector");
1463 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001464}
1465
Chandler Carruth953fb082013-01-13 11:46:33 +00001466static const char *getX86TargetCPU(const ArgList &Args,
1467 const llvm::Triple &Triple) {
1468 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001469 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001470 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001471 return "core-avx2";
1472
Chandler Carruth953fb082013-01-13 11:46:33 +00001473 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001474 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001475
1476 // FIXME: Reject attempts to use -march=native unless the target matches
1477 // the host.
1478 //
1479 // FIXME: We should also incorporate the detected target features for use
1480 // with -native.
1481 std::string CPU = llvm::sys::getHostCPUName();
1482 if (!CPU.empty() && CPU != "generic")
1483 return Args.MakeArgString(CPU);
1484 }
1485
Reid Kleckner3123eff2015-06-30 16:32:04 +00001486 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1487 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1488 StringRef Arch = A->getValue();
1489 const char *CPU;
1490 if (Triple.getArch() == llvm::Triple::x86) {
1491 CPU = llvm::StringSwitch<const char *>(Arch)
1492 .Case("IA32", "i386")
1493 .Case("SSE", "pentium3")
1494 .Case("SSE2", "pentium4")
1495 .Case("AVX", "sandybridge")
1496 .Case("AVX2", "haswell")
1497 .Default(nullptr);
1498 } else {
1499 CPU = llvm::StringSwitch<const char *>(Arch)
1500 .Case("AVX", "sandybridge")
1501 .Case("AVX2", "haswell")
1502 .Default(nullptr);
1503 }
1504 if (CPU)
1505 return CPU;
1506 }
1507
Chandler Carruth953fb082013-01-13 11:46:33 +00001508 // Select the default CPU if none was given (or detection failed).
1509
1510 if (Triple.getArch() != llvm::Triple::x86_64 &&
1511 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001512 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001513
1514 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1515
1516 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001517 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001518 if (Triple.getArchName() == "x86_64h")
1519 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001520 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001521 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001522
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001523 // Set up default CPU name for PS4 compilers.
1524 if (Triple.isPS4CPU())
1525 return "btver2";
1526
Alexey Bataev286d1b92014-01-31 04:07:13 +00001527 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001528 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001529 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001530
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001531 // Everything else goes to x86-64 in 64-bit mode.
1532 if (Is64Bit)
1533 return "x86-64";
1534
1535 switch (Triple.getOS()) {
1536 case llvm::Triple::FreeBSD:
1537 case llvm::Triple::NetBSD:
1538 case llvm::Triple::OpenBSD:
1539 return "i486";
1540 case llvm::Triple::Haiku:
1541 return "i586";
1542 case llvm::Triple::Bitrig:
1543 return "i686";
1544 default:
1545 // Fallback to p4.
1546 return "pentium4";
1547 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001548}
1549
Renato Golin7c542b42015-07-27 23:44:45 +00001550static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1551 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001552 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001553 default:
1554 return "";
1555
Amara Emerson703da2e2013-10-31 09:32:33 +00001556 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001557 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001558 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001559
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001560 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001561 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001562 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001563 case llvm::Triple::thumbeb: {
1564 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001565 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001566 return arm::getARMTargetCPU(MCPU, MArch, T);
1567 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001568 case llvm::Triple::mips:
1569 case llvm::Triple::mipsel:
1570 case llvm::Triple::mips64:
1571 case llvm::Triple::mips64el: {
1572 StringRef CPUName;
1573 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001574 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001575 return CPUName;
1576 }
1577
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001578 case llvm::Triple::nvptx:
1579 case llvm::Triple::nvptx64:
1580 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1581 return A->getValue();
1582 return "";
1583
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001584 case llvm::Triple::ppc:
1585 case llvm::Triple::ppc64:
1586 case llvm::Triple::ppc64le: {
1587 std::string TargetCPUName = getPPCTargetCPU(Args);
1588 // LLVM may default to generating code for the native CPU,
1589 // but, like gcc, we default to a more generic option for
1590 // each architecture. (except on Darwin)
1591 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1592 if (T.getArch() == llvm::Triple::ppc64)
1593 TargetCPUName = "ppc64";
1594 else if (T.getArch() == llvm::Triple::ppc64le)
1595 TargetCPUName = "ppc64le";
1596 else
1597 TargetCPUName = "ppc";
1598 }
1599 return TargetCPUName;
1600 }
1601
1602 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001603 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001604 case llvm::Triple::sparcv9:
1605 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001606 return A->getValue();
1607 return "";
1608
1609 case llvm::Triple::x86:
1610 case llvm::Triple::x86_64:
1611 return getX86TargetCPU(Args, T);
1612
1613 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001614 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001615
1616 case llvm::Triple::systemz:
1617 return getSystemZTargetCPU(Args);
1618
1619 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001620 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001621 return getR600TargetGPU(Args);
1622 }
1623}
1624
Alp Tokerce365ca2013-12-02 12:43:03 +00001625static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1626 ArgStringList &CmdArgs) {
1627 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1628 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1629 // forward.
1630 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001631 std::string Plugin =
1632 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001633 CmdArgs.push_back(Args.MakeArgString(Plugin));
1634
1635 // Try to pass driver level flags relevant to LTO code generation down to
1636 // the plugin.
1637
1638 // Handle flags for selecting CPU variants.
1639 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1640 if (!CPU.empty())
1641 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1642}
1643
Sanjay Patel2987c292015-06-11 14:53:41 +00001644/// This is a helper function for validating the optional refinement step
1645/// parameter in reciprocal argument strings. Return false if there is an error
1646/// parsing the refinement step. Otherwise, return true and set the Position
1647/// of the refinement step in the input string.
1648static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001649 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001650 const char RefinementStepToken = ':';
1651 Position = In.find(RefinementStepToken);
1652 if (Position != StringRef::npos) {
1653 StringRef Option = A.getOption().getName();
1654 StringRef RefStep = In.substr(Position + 1);
1655 // Allow exactly one numeric character for the additional refinement
1656 // step parameter. This is reasonable for all currently-supported
1657 // operations and architectures because we would expect that a larger value
1658 // of refinement steps would cause the estimate "optimization" to
1659 // under-perform the native operation. Also, if the estimate does not
1660 // converge quickly, it probably will not ever converge, so further
1661 // refinement steps will not produce a better answer.
1662 if (RefStep.size() != 1) {
1663 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1664 return false;
1665 }
1666 char RefStepChar = RefStep[0];
1667 if (RefStepChar < '0' || RefStepChar > '9') {
1668 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1669 return false;
1670 }
1671 }
1672 return true;
1673}
1674
1675/// The -mrecip flag requires processing of many optional parameters.
1676static void ParseMRecip(const Driver &D, const ArgList &Args,
1677 ArgStringList &OutStrings) {
1678 StringRef DisabledPrefixIn = "!";
1679 StringRef DisabledPrefixOut = "!";
1680 StringRef EnabledPrefixOut = "";
1681 StringRef Out = "-mrecip=";
1682
1683 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1684 if (!A)
1685 return;
1686
1687 unsigned NumOptions = A->getNumValues();
1688 if (NumOptions == 0) {
1689 // No option is the same as "all".
1690 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1691 return;
1692 }
1693
1694 // Pass through "all", "none", or "default" with an optional refinement step.
1695 if (NumOptions == 1) {
1696 StringRef Val = A->getValue(0);
1697 size_t RefStepLoc;
1698 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1699 return;
1700 StringRef ValBase = Val.slice(0, RefStepLoc);
1701 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1702 OutStrings.push_back(Args.MakeArgString(Out + Val));
1703 return;
1704 }
1705 }
1706
1707 // Each reciprocal type may be enabled or disabled individually.
1708 // Check each input value for validity, concatenate them all back together,
1709 // and pass through.
1710
1711 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001712 OptionStrings.insert(std::make_pair("divd", false));
1713 OptionStrings.insert(std::make_pair("divf", false));
1714 OptionStrings.insert(std::make_pair("vec-divd", false));
1715 OptionStrings.insert(std::make_pair("vec-divf", false));
1716 OptionStrings.insert(std::make_pair("sqrtd", false));
1717 OptionStrings.insert(std::make_pair("sqrtf", false));
1718 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1719 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001720
1721 for (unsigned i = 0; i != NumOptions; ++i) {
1722 StringRef Val = A->getValue(i);
1723
1724 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1725 // Ignore the disablement token for string matching.
1726 if (IsDisabled)
1727 Val = Val.substr(1);
1728
1729 size_t RefStep;
1730 if (!getRefinementStep(Val, D, *A, RefStep))
1731 return;
1732
1733 StringRef ValBase = Val.slice(0, RefStep);
1734 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1735 if (OptionIter == OptionStrings.end()) {
1736 // Try again specifying float suffix.
1737 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1738 if (OptionIter == OptionStrings.end()) {
1739 // The input name did not match any known option string.
1740 D.Diag(diag::err_drv_unknown_argument) << Val;
1741 return;
1742 }
1743 // The option was specified without a float or double suffix.
1744 // Make sure that the double entry was not already specified.
1745 // The float entry will be checked below.
1746 if (OptionStrings[ValBase.str() + 'd']) {
1747 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1748 return;
1749 }
1750 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001751
Sanjay Patel2987c292015-06-11 14:53:41 +00001752 if (OptionIter->second == true) {
1753 // Duplicate option specified.
1754 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1755 return;
1756 }
1757
1758 // Mark the matched option as found. Do not allow duplicate specifiers.
1759 OptionIter->second = true;
1760
1761 // If the precision was not specified, also mark the double entry as found.
1762 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1763 OptionStrings[ValBase.str() + 'd'] = true;
1764
1765 // Build the output string.
1766 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1767 Out = Args.MakeArgString(Out + Prefix + Val);
1768 if (i != NumOptions - 1)
1769 Out = Args.MakeArgString(Out + ",");
1770 }
1771
1772 OutStrings.push_back(Args.MakeArgString(Out));
1773}
1774
Eric Christopherc54920a2015-03-23 19:26:05 +00001775static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001776 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001777 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001778 // If -march=native, autodetect the feature list.
1779 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1780 if (StringRef(A->getValue()) == "native") {
1781 llvm::StringMap<bool> HostFeatures;
1782 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1783 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001784 Features.push_back(
1785 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001786 }
1787 }
1788
Jim Grosbach82eee262013-11-16 00:53:35 +00001789 if (Triple.getArchName() == "x86_64h") {
1790 // x86_64h implies quite a few of the more modern subtarget features
1791 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1792 Features.push_back("-rdrnd");
1793 Features.push_back("-aes");
1794 Features.push_back("-pclmul");
1795 Features.push_back("-rtm");
1796 Features.push_back("-hle");
1797 Features.push_back("-fsgsbase");
1798 }
1799
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001800 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001801 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001802 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001803 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001804 Features.push_back("+sse4.2");
1805 Features.push_back("+popcnt");
1806 } else
1807 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001808 }
1809
Eric Christopherc54920a2015-03-23 19:26:05 +00001810 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001811 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1812 StringRef Arch = A->getValue();
1813 bool ArchUsed = false;
1814 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001815 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001816 if (Arch == "AVX" || Arch == "AVX2") {
1817 ArchUsed = true;
1818 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1819 }
1820 }
1821 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001822 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001823 if (Arch == "IA32") {
1824 ArchUsed = true;
1825 } else if (Arch == "SSE" || Arch == "SSE2") {
1826 ArchUsed = true;
1827 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1828 }
1829 }
1830 if (!ArchUsed)
1831 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1832 }
1833
Jim Grosbach82eee262013-11-16 00:53:35 +00001834 // Now add any that the user explicitly requested on the command line,
1835 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001836 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1837 StringRef Name = A->getOption().getName();
1838 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001839
1840 // Skip over "-m".
1841 assert(Name.startswith("m") && "Invalid feature name.");
1842 Name = Name.substr(1);
1843
1844 bool IsNegative = Name.startswith("no-");
1845 if (IsNegative)
1846 Name = Name.substr(3);
1847
1848 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1849 }
1850}
1851
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001852void Clang::AddX86TargetArgs(const ArgList &Args,
1853 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001854 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001855 Args.hasArg(options::OPT_mkernel) ||
1856 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001857 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001858
Bob Wilson2616e2e2013-02-10 16:01:41 +00001859 // Default to avoid implicit floating-point for kernel/kext code, but allow
1860 // that to be overridden with -mno-soft-float.
1861 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1862 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001863 if (Arg *A = Args.getLastArg(
1864 options::OPT_msoft_float, options::OPT_mno_soft_float,
1865 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001866 const Option &O = A->getOption();
1867 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1868 O.matches(options::OPT_msoft_float));
1869 }
1870 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001871 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001872
1873 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1874 StringRef Value = A->getValue();
1875 if (Value == "intel" || Value == "att") {
1876 CmdArgs.push_back("-mllvm");
1877 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1878 } else {
1879 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1880 << A->getOption().getName() << Value;
1881 }
1882 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001883}
1884
Tony Linthicum76329bf2011-12-12 21:14:55 +00001885void Clang::AddHexagonTargetArgs(const ArgList &Args,
1886 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001887 CmdArgs.push_back("-mqdsp6-compat");
1888 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001889
Douglas Katzman54366072015-07-27 16:53:08 +00001890 if (const char *v =
1891 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001892 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001893 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001895 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001896 }
1897
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001898 if (!Args.hasArg(options::OPT_fno_short_enums))
1899 CmdArgs.push_back("-fshort-enums");
1900 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 CmdArgs.push_back("-mllvm");
1902 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001903 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001904 CmdArgs.push_back("-mllvm");
1905 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001906}
1907
Kevin Qin110db6f2014-07-18 07:03:22 +00001908// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001909static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001910 std::vector<const char *> &Features) {
1911 SmallVector<StringRef, 8> Split;
1912 text.split(Split, StringRef("+"), -1, false);
1913
Douglas Katzman2675d012015-06-29 19:12:56 +00001914 for (const StringRef Feature : Split) {
1915 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001916 .Case("fp", "+fp-armv8")
1917 .Case("simd", "+neon")
1918 .Case("crc", "+crc")
1919 .Case("crypto", "+crypto")
1920 .Case("nofp", "-fp-armv8")
1921 .Case("nosimd", "-neon")
1922 .Case("nocrc", "-crc")
1923 .Case("nocrypto", "-crypto")
1924 .Default(nullptr);
1925 if (result)
1926 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001927 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001928 D.Diag(diag::err_drv_no_neon_modifier);
1929 else
1930 return false;
1931 }
1932 return true;
1933}
1934
1935// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1936// decode CPU and feature.
1937static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1938 std::vector<const char *> &Features) {
1939 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1940 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001941 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1942 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001943 Features.push_back("+neon");
1944 Features.push_back("+crc");
1945 Features.push_back("+crypto");
1946 } else if (CPU == "generic") {
1947 Features.push_back("+neon");
1948 } else {
1949 return false;
1950 }
1951
1952 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1953 return false;
1954
1955 return true;
1956}
1957
1958static bool
1959getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1960 const ArgList &Args,
1961 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001962 std::string MarchLowerCase = March.lower();
1963 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001964
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001965 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001966 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001967 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001968 Features.push_back("+v8.1a");
1969 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001970 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001971 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001972
1973 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1974 return false;
1975
1976 return true;
1977}
1978
1979static bool
1980getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1981 const ArgList &Args,
1982 std::vector<const char *> &Features) {
1983 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001984 std::string McpuLowerCase = Mcpu.lower();
1985 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00001986 return false;
1987
1988 return true;
1989}
1990
1991static bool
1992getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1993 const ArgList &Args,
1994 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001995 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001996 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001997 if (MtuneLowerCase == "native")
1998 MtuneLowerCase = llvm::sys::getHostCPUName();
1999 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002000 Features.push_back("+zcm");
2001 Features.push_back("+zcz");
2002 }
2003 return true;
2004}
2005
2006static bool
2007getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2008 const ArgList &Args,
2009 std::vector<const char *> &Features) {
2010 StringRef CPU;
2011 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002012 std::string McpuLowerCase = Mcpu.lower();
2013 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002014 return false;
2015
2016 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2017}
2018
Akira Hatanaka92500472015-07-27 19:29:04 +00002019static void getAArch64TargetFeatures(const Driver &D,
2020 const llvm::Triple &Triple,
2021 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002022 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002023 Arg *A;
2024 bool success = true;
2025 // Enable NEON by default.
2026 Features.push_back("+neon");
2027 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2028 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2029 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2030 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002031 else if (Args.hasArg(options::OPT_arch))
2032 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2033 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002034
2035 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2036 success =
2037 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2038 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2039 success =
2040 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002041 else if (Args.hasArg(options::OPT_arch))
2042 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2043 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002044
2045 if (!success)
2046 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002047
2048 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2049 Features.push_back("-fp-armv8");
2050 Features.push_back("-crypto");
2051 Features.push_back("-neon");
2052 }
Bradley Smith418c5932014-05-02 15:17:51 +00002053
2054 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002055 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002056 if (A->getOption().matches(options::OPT_mcrc))
2057 Features.push_back("+crc");
2058 else
2059 Features.push_back("-crc");
2060 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002061
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002062 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2063 options::OPT_munaligned_access))
2064 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2065 Features.push_back("+strict-align");
2066
Akira Hatanaka92500472015-07-27 19:29:04 +00002067 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002068 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002069}
2070
2071static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002072 const ArgList &Args, ArgStringList &CmdArgs,
2073 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002074 std::vector<const char *> Features;
2075 switch (Triple.getArch()) {
2076 default:
2077 break;
2078 case llvm::Triple::mips:
2079 case llvm::Triple::mipsel:
2080 case llvm::Triple::mips64:
2081 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002082 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002083 break;
2084
2085 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002086 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002087 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002088 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002089 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002090 break;
2091
2092 case llvm::Triple::ppc:
2093 case llvm::Triple::ppc64:
2094 case llvm::Triple::ppc64le:
2095 getPPCTargetFeatures(Args, Features);
2096 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002097 case llvm::Triple::systemz:
2098 getSystemZTargetFeatures(Args, Features);
2099 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002100 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002101 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002102 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002103 break;
2104 case llvm::Triple::x86:
2105 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002106 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002107 break;
2108 }
Rafael Espindola43964802013-08-21 17:34:32 +00002109
2110 // Find the last of each feature.
2111 llvm::StringMap<unsigned> LastOpt;
2112 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2113 const char *Name = Features[I];
2114 assert(Name[0] == '-' || Name[0] == '+');
2115 LastOpt[Name + 1] = I;
2116 }
2117
2118 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2119 // If this feature was overridden, ignore it.
2120 const char *Name = Features[I];
2121 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2122 assert(LastI != LastOpt.end());
2123 unsigned Last = LastI->second;
2124 if (Last != I)
2125 continue;
2126
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002127 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002128 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002129 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002130}
2131
David Majnemerae394812014-12-09 00:12:30 +00002132static bool
2133shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2134 const llvm::Triple &Triple) {
2135 // We use the zero-cost exception tables for Objective-C if the non-fragile
2136 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2137 // later.
2138 if (runtime.isNonFragile())
2139 return true;
2140
2141 if (!Triple.isMacOSX())
2142 return false;
2143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002144 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002145 (Triple.getArch() == llvm::Triple::x86_64 ||
2146 Triple.getArch() == llvm::Triple::arm));
2147}
2148
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002149/// Adds exception related arguments to the driver command arguments. There's a
2150/// master flag, -fexceptions and also language specific flags to enable/disable
2151/// C++ and Objective-C exceptions. This makes it possible to for example
2152/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002153static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002154 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002155 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002156 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002157 const Driver &D = TC.getDriver();
2158 const llvm::Triple &Triple = TC.getTriple();
2159
Chad Rosier4fab82c2012-03-26 22:04:46 +00002160 if (KernelOrKext) {
2161 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2162 // arguments now to avoid warnings about unused arguments.
2163 Args.ClaimAllArgs(options::OPT_fexceptions);
2164 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2165 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2166 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2167 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2168 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002169 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002170 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002171
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002172 // See if the user explicitly enabled exceptions.
2173 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2174 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002175
David Majnemerae394812014-12-09 00:12:30 +00002176 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2177 // is not necessarily sensible, but follows GCC.
2178 if (types::isObjC(InputType) &&
2179 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002180 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002181 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002182
David Majnemerae394812014-12-09 00:12:30 +00002183 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002184 }
2185
2186 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002187 // Disable C++ EH by default on XCore, PS4, and MSVC.
2188 // FIXME: Remove MSVC from this list once things work.
2189 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2190 !Triple.isPS4CPU() &&
2191 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002192 Arg *ExceptionArg = Args.getLastArg(
2193 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2194 options::OPT_fexceptions, options::OPT_fno_exceptions);
2195 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002196 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002197 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2198 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002199
2200 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002201 if (Triple.isPS4CPU()) {
2202 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2203 assert(ExceptionArg &&
2204 "On the PS4 exceptions should only be enabled if passing "
2205 "an argument");
2206 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2207 const Arg *RTTIArg = TC.getRTTIArg();
2208 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2209 D.Diag(diag::err_drv_argument_not_allowed_with)
2210 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2211 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2212 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2213 } else
2214 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2215
Anders Carlssone96ab552011-02-28 02:27:16 +00002216 CmdArgs.push_back("-fcxx-exceptions");
2217
David Majnemer8de68642014-12-05 08:11:58 +00002218 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002219 }
2220 }
2221
David Majnemer8de68642014-12-05 08:11:58 +00002222 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002223 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002224}
2225
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002226static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002227 bool Default = true;
2228 if (TC.getTriple().isOSDarwin()) {
2229 // The native darwin assembler doesn't support the linker_option directives,
2230 // so we disable them if we think the .s file will be passed to it.
2231 Default = TC.useIntegratedAs();
2232 }
2233 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2234 Default);
2235}
2236
Ted Kremenek62093662013-03-12 17:02:12 +00002237static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2238 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002239 bool UseDwarfDirectory =
2240 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2241 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002242 return !UseDwarfDirectory;
2243}
2244
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002245/// \brief Check whether the given input tree contains any compilation actions.
2246static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002247 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002248 return true;
2249
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002250 for (const auto &Act : *A)
2251 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002252 return true;
2253
2254 return false;
2255}
2256
2257/// \brief Check if -relax-all should be passed to the internal assembler.
2258/// This is done by default when compiling non-assembler source with -O0.
2259static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2260 bool RelaxDefault = true;
2261
2262 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2263 RelaxDefault = A->getOption().matches(options::OPT_O0);
2264
2265 if (RelaxDefault) {
2266 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002267 for (const auto &Act : C.getActions()) {
2268 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002269 RelaxDefault = true;
2270 break;
2271 }
2272 }
2273 }
2274
2275 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002276 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002277}
2278
David Blaikie9260ed62013-07-25 21:19:01 +00002279static void CollectArgsForIntegratedAssembler(Compilation &C,
2280 const ArgList &Args,
2281 ArgStringList &CmdArgs,
2282 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002283 if (UseRelaxAll(C, Args))
2284 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286 // When passing -I arguments to the assembler we sometimes need to
2287 // unconditionally take the next argument. For example, when parsing
2288 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2289 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2290 // arg after parsing the '-I' arg.
2291 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002292
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002293 // When using an integrated assembler, translate -Wa, and -Xassembler
2294 // options.
2295 bool CompressDebugSections = false;
2296 for (const Arg *A :
2297 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2298 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002299
Renato Golin7c542b42015-07-27 23:44:45 +00002300 for (const StringRef Value : A->getValues()) {
2301 if (TakeNextArg) {
2302 CmdArgs.push_back(Value.data());
2303 TakeNextArg = false;
2304 continue;
2305 }
David Blaikie9260ed62013-07-25 21:19:01 +00002306
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002307 if (Value == "-force_cpusubtype_ALL") {
2308 // Do nothing, this is the default and we don't support anything else.
2309 } else if (Value == "-L") {
2310 CmdArgs.push_back("-msave-temp-labels");
2311 } else if (Value == "--fatal-warnings") {
2312 CmdArgs.push_back("-massembler-fatal-warnings");
2313 } else if (Value == "--noexecstack") {
2314 CmdArgs.push_back("-mnoexecstack");
2315 } else if (Value == "-compress-debug-sections" ||
2316 Value == "--compress-debug-sections") {
2317 CompressDebugSections = true;
2318 } else if (Value == "-nocompress-debug-sections" ||
2319 Value == "--nocompress-debug-sections") {
2320 CompressDebugSections = false;
2321 } else if (Value.startswith("-I")) {
2322 CmdArgs.push_back(Value.data());
2323 // We need to consume the next argument if the current arg is a plain
2324 // -I. The next arg will be the include directory.
2325 if (Value == "-I")
2326 TakeNextArg = true;
2327 } else if (Value.startswith("-gdwarf-")) {
2328 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002329 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2330 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2331 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002332 } else {
2333 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002334 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002335 }
2336 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002337 }
2338 if (CompressDebugSections) {
2339 if (llvm::zlib::isAvailable())
2340 CmdArgs.push_back("-compress-debug-sections");
2341 else
2342 D.Diag(diag::warn_debug_compression_unavailable);
2343 }
David Blaikie9260ed62013-07-25 21:19:01 +00002344}
2345
Renato Goline807c122014-01-31 11:47:28 +00002346// Until ARM libraries are build separately, we have them all in one library
2347static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002348 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002349 TC.getArch() == llvm::Triple::x86)
2350 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002351 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002352 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002353 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002354}
2355
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002356static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2357 // The runtimes are located in the OS-specific resource directory.
2358 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002359 const llvm::Triple &Triple = TC.getTriple();
2360 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002361 StringRef OSLibName =
2362 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002363 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002364 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002365}
2366
Peter Collingbourne581f4382015-07-02 01:48:12 +00002367SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2368 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002369 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2370 ? "-android"
2371 : "";
2372
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002373 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002374 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2375 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002376 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002377 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002378 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002379 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002380
2381 SmallString<128> Path = getCompilerRTLibDir(TC);
2382 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2383 Arch + Env + Suffix);
2384
2385 return Path;
2386}
2387
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002388// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002389// FIXME: Make sure we can also emit shared objects if they're requested
2390// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002391static void addClangRT(const ToolChain &TC, const ArgList &Args,
2392 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002393 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002394}
2395
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002396static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2397 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002398 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2399 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002400 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002401 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002402 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002403 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002404 Args.hasArg(options::OPT_fcreate_profile) ||
2405 Args.hasArg(options::OPT_coverage)))
2406 return;
2407
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002408 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002409}
2410
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002411namespace {
2412enum OpenMPRuntimeKind {
2413 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2414 /// without knowing what runtime to target.
2415 OMPRT_Unknown,
2416
2417 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2418 /// the default for Clang.
2419 OMPRT_OMP,
2420
2421 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2422 /// this runtime but can swallow the pragmas, and find and link against the
2423 /// runtime library itself.
2424 OMPRT_GOMP,
2425
Chandler Carruthc6625c62015-05-28 21:10:31 +00002426 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002427 /// OpenMP runtime. We support this mode for users with existing dependencies
2428 /// on this runtime library name.
2429 OMPRT_IOMP5
2430};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002431}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002432
2433/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002434static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2435 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002436 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2437
2438 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2439 if (A)
2440 RuntimeName = A->getValue();
2441
2442 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002443 .Case("libomp", OMPRT_OMP)
2444 .Case("libgomp", OMPRT_GOMP)
2445 .Case("libiomp5", OMPRT_IOMP5)
2446 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002447
2448 if (RT == OMPRT_Unknown) {
2449 if (A)
2450 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002451 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002452 else
2453 // FIXME: We could use a nicer diagnostic here.
2454 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2455 }
2456
2457 return RT;
2458}
2459
Alexey Samsonov52550342014-09-15 19:58:40 +00002460static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2461 ArgStringList &CmdArgs, StringRef Sanitizer,
2462 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002463 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002464 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002465 if (!IsShared)
2466 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002467 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002468 if (!IsShared)
2469 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002470}
2471
Alexey Samsonov52550342014-09-15 19:58:40 +00002472// Tries to use a file with the list of dynamic symbols that need to be exported
2473// from the runtime library. Returns true if the file was found.
2474static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2475 ArgStringList &CmdArgs,
2476 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002477 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2478 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2479 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002480 return true;
2481 }
2482 return false;
2483}
2484
2485static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2486 ArgStringList &CmdArgs) {
2487 // Force linking against the system libraries sanitizers depends on
2488 // (see PR15823 why this is necessary).
2489 CmdArgs.push_back("--no-as-needed");
2490 CmdArgs.push_back("-lpthread");
2491 CmdArgs.push_back("-lrt");
2492 CmdArgs.push_back("-lm");
2493 // There's no libdl on FreeBSD.
2494 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2495 CmdArgs.push_back("-ldl");
2496}
2497
2498static void
2499collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2500 SmallVectorImpl<StringRef> &SharedRuntimes,
2501 SmallVectorImpl<StringRef> &StaticRuntimes,
2502 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2503 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2504 // Collect shared runtimes.
2505 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2506 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002507 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002508
Alexey Samsonov52550342014-09-15 19:58:40 +00002509 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002510 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002511 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2512 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002513 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002514 }
2515 if (SanArgs.needsAsanRt()) {
2516 if (SanArgs.needsSharedAsanRt()) {
2517 HelperStaticRuntimes.push_back("asan-preinit");
2518 } else {
2519 StaticRuntimes.push_back("asan");
2520 if (SanArgs.linkCXXRuntimes())
2521 StaticRuntimes.push_back("asan_cxx");
2522 }
2523 }
2524 if (SanArgs.needsDfsanRt())
2525 StaticRuntimes.push_back("dfsan");
2526 if (SanArgs.needsLsanRt())
2527 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002528 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002529 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002530 if (SanArgs.linkCXXRuntimes())
2531 StaticRuntimes.push_back("msan_cxx");
2532 }
2533 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002534 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002535 if (SanArgs.linkCXXRuntimes())
2536 StaticRuntimes.push_back("tsan_cxx");
2537 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002538 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002539 StaticRuntimes.push_back("ubsan_standalone");
2540 if (SanArgs.linkCXXRuntimes())
2541 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002542 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002543 if (SanArgs.needsSafeStackRt())
2544 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002545}
2546
Alexey Samsonov52550342014-09-15 19:58:40 +00002547// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2548// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2549static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002550 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002551 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2552 HelperStaticRuntimes;
2553 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2554 HelperStaticRuntimes);
2555 for (auto RT : SharedRuntimes)
2556 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2557 for (auto RT : HelperStaticRuntimes)
2558 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2559 bool AddExportDynamic = false;
2560 for (auto RT : StaticRuntimes) {
2561 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2562 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2563 }
2564 // If there is a static runtime with no dynamic list, force all the symbols
2565 // to be dynamic to be sure we export sanitizer interface functions.
2566 if (AddExportDynamic)
2567 CmdArgs.push_back("-export-dynamic");
2568 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002569}
2570
Reid Kleckner86ea7702015-02-04 23:45:07 +00002571static bool areOptimizationsEnabled(const ArgList &Args) {
2572 // Find the last -O arg and see if it is non-zero.
2573 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2574 return !A->getOption().matches(options::OPT_O0);
2575 // Defaults to -O0.
2576 return false;
2577}
2578
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002579static bool shouldUseFramePointerForTarget(const ArgList &Args,
2580 const llvm::Triple &Triple) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00002581 // XCore never wants frame pointers, regardless of OS.
2582 if (Triple.getArch() == llvm::Triple::xcore) {
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002583 return false;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002584 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002585
2586 if (Triple.isOSLinux()) {
2587 switch (Triple.getArch()) {
2588 // Don't use a frame pointer on linux if optimizing for certain targets.
2589 case llvm::Triple::mips64:
2590 case llvm::Triple::mips64el:
2591 case llvm::Triple::mips:
2592 case llvm::Triple::mipsel:
2593 case llvm::Triple::systemz:
2594 case llvm::Triple::x86:
2595 case llvm::Triple::x86_64:
2596 return !areOptimizationsEnabled(Args);
2597 default:
2598 return true;
2599 }
2600 }
2601
2602 if (Triple.isOSWindows()) {
2603 switch (Triple.getArch()) {
2604 case llvm::Triple::x86:
2605 return !areOptimizationsEnabled(Args);
2606 default:
2607 // All other supported Windows ISAs use xdata unwind information, so frame
2608 // pointers are not generally useful.
2609 return false;
2610 }
2611 }
2612
2613 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002614}
2615
Rafael Espindola224dd632011-12-14 21:02:23 +00002616static bool shouldUseFramePointer(const ArgList &Args,
2617 const llvm::Triple &Triple) {
2618 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2619 options::OPT_fomit_frame_pointer))
2620 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2621
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002622 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002623}
2624
Eric Christopherb7d97e92013-04-03 01:58:53 +00002625static bool shouldUseLeafFramePointer(const ArgList &Args,
2626 const llvm::Triple &Triple) {
2627 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2628 options::OPT_momit_leaf_frame_pointer))
2629 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2630
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002631 if (Triple.isPS4CPU())
2632 return false;
2633
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002634 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002635}
2636
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002637/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002638static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002639 SmallString<128> cwd;
2640 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002641 CmdArgs.push_back("-fdebug-compilation-dir");
2642 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002643 }
2644}
2645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002646static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002647 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2648 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2649 SmallString<128> T(FinalOutput->getValue());
2650 llvm::sys::path::replace_extension(T, "dwo");
2651 return Args.MakeArgString(T);
2652 } else {
2653 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002654 SmallString<128> T(
2655 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002656 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002657 llvm::sys::path::replace_extension(F, "dwo");
2658 T += F;
2659 return Args.MakeArgString(F);
2660 }
2661}
2662
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002663static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2664 const JobAction &JA, const ArgList &Args,
2665 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002666 ArgStringList ExtractArgs;
2667 ExtractArgs.push_back("--extract-dwo");
2668
2669 ArgStringList StripArgs;
2670 StripArgs.push_back("--strip-dwo");
2671
2672 // Grabbing the output of the earlier compile step.
2673 StripArgs.push_back(Output.getFilename());
2674 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002675 ExtractArgs.push_back(OutFile);
2676
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002677 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002678 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002679
2680 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002681 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002682
2683 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002684 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002685}
2686
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002687/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002688/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2689static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002690 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002691 if (A->getOption().matches(options::OPT_O4) ||
2692 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002693 return true;
2694
2695 if (A->getOption().matches(options::OPT_O0))
2696 return false;
2697
2698 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2699
Rafael Espindola91780de2013-08-26 14:05:41 +00002700 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002701 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002702 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002703 return true;
2704
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002705 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002706 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002707 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002708
2709 unsigned OptLevel = 0;
2710 if (S.getAsInteger(10, OptLevel))
2711 return false;
2712
2713 return OptLevel > 1;
2714 }
2715
2716 return false;
2717}
2718
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002719/// Add -x lang to \p CmdArgs for \p Input.
2720static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2721 ArgStringList &CmdArgs) {
2722 // When using -verify-pch, we don't want to provide the type
2723 // 'precompiled-header' if it was inferred from the file extension
2724 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2725 return;
2726
2727 CmdArgs.push_back("-x");
2728 if (Args.hasArg(options::OPT_rewrite_objc))
2729 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2730 else
2731 CmdArgs.push_back(types::getTypeName(Input.getType()));
2732}
2733
David Majnemerc371ff02015-03-22 08:39:22 +00002734static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002735 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002736 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002737
2738 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002739 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002740
2741 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002742 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002743 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002744 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002745}
2746
Rafael Espindola577637a2015-01-03 00:06:04 +00002747// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002748// options that build systems might add but are unused when assembling or only
2749// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002750static void claimNoWarnArgs(const ArgList &Args) {
2751 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002752 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002753 Args.ClaimAllArgs(options::OPT_flto);
2754 Args.ClaimAllArgs(options::OPT_fno_lto);
2755}
2756
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002757static void appendUserToPath(SmallVectorImpl<char> &Result) {
2758#ifdef LLVM_ON_UNIX
2759 const char *Username = getenv("LOGNAME");
2760#else
2761 const char *Username = getenv("USERNAME");
2762#endif
2763 if (Username) {
2764 // Validate that LoginName can be used in a path, and get its length.
2765 size_t Len = 0;
2766 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002767 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002768 Username = nullptr;
2769 break;
2770 }
2771 }
2772
2773 if (Username && Len > 0) {
2774 Result.append(Username, Username + Len);
2775 return;
2776 }
2777 }
2778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002779// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002780#ifdef LLVM_ON_UNIX
2781 std::string UID = llvm::utostr(getuid());
2782#else
2783 // FIXME: Windows seems to have an 'SID' that might work.
2784 std::string UID = "9999";
2785#endif
2786 Result.append(UID.begin(), UID.end());
2787}
2788
David Majnemere11d3732015-06-08 00:22:46 +00002789VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2790 const llvm::Triple &Triple,
2791 const llvm::opt::ArgList &Args,
2792 bool IsWindowsMSVC) {
2793 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2794 IsWindowsMSVC) ||
2795 Args.hasArg(options::OPT_fmsc_version) ||
2796 Args.hasArg(options::OPT_fms_compatibility_version)) {
2797 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2798 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002799 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002800
2801 if (MSCVersion && MSCompatibilityVersion) {
2802 if (D)
2803 D->Diag(diag::err_drv_argument_not_allowed_with)
2804 << MSCVersion->getAsString(Args)
2805 << MSCompatibilityVersion->getAsString(Args);
2806 return VersionTuple();
2807 }
2808
2809 if (MSCompatibilityVersion) {
2810 VersionTuple MSVT;
2811 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2812 D->Diag(diag::err_drv_invalid_value)
2813 << MSCompatibilityVersion->getAsString(Args)
2814 << MSCompatibilityVersion->getValue();
2815 return MSVT;
2816 }
2817
2818 if (MSCVersion) {
2819 unsigned Version = 0;
2820 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2821 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2822 << MSCVersion->getValue();
2823 return getMSCompatibilityVersion(Version);
2824 }
2825
2826 unsigned Major, Minor, Micro;
2827 Triple.getEnvironmentVersion(Major, Minor, Micro);
2828 if (Major || Minor || Micro)
2829 return VersionTuple(Major, Minor, Micro);
2830
2831 return VersionTuple(18);
2832 }
2833 return VersionTuple();
2834}
2835
Diego Novilloa0545962015-07-10 18:00:07 +00002836static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2837 const InputInfo &Output, const ArgList &Args,
2838 ArgStringList &CmdArgs) {
2839 auto *ProfileGenerateArg = Args.getLastArg(
2840 options::OPT_fprofile_instr_generate,
2841 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
2842 options::OPT_fprofile_generate_EQ);
2843
2844 auto *ProfileUseArg = Args.getLastArg(
2845 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
2846 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ);
2847
2848 if (ProfileGenerateArg && ProfileUseArg)
2849 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002850 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002851
2852 if (ProfileGenerateArg &&
2853 ProfileGenerateArg->getOption().matches(
2854 options::OPT_fprofile_instr_generate_EQ))
2855 ProfileGenerateArg->render(Args, CmdArgs);
2856 else if (ProfileGenerateArg &&
2857 ProfileGenerateArg->getOption().matches(
2858 options::OPT_fprofile_generate_EQ)) {
2859 SmallString<128> Path(ProfileGenerateArg->getValue());
2860 llvm::sys::path::append(Path, "default.profraw");
2861 CmdArgs.push_back(
2862 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2863 } else
2864 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2865
2866 if (ProfileUseArg &&
2867 ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2868 ProfileUseArg->render(Args, CmdArgs);
2869 else if (ProfileUseArg &&
2870 (ProfileUseArg->getOption().matches(options::OPT_fprofile_use_EQ) ||
2871 ProfileUseArg->getOption().matches(
2872 options::OPT_fprofile_instr_use))) {
2873 SmallString<128> Path(
2874 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2875 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2876 llvm::sys::path::append(Path, "default.profdata");
2877 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2878 }
2879
2880 if (Args.hasArg(options::OPT_ftest_coverage) ||
2881 Args.hasArg(options::OPT_coverage))
2882 CmdArgs.push_back("-femit-coverage-notes");
2883 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2884 false) ||
2885 Args.hasArg(options::OPT_coverage))
2886 CmdArgs.push_back("-femit-coverage-data");
2887
2888 if (Args.hasArg(options::OPT_fcoverage_mapping) && !ProfileGenerateArg)
2889 D.Diag(diag::err_drv_argument_only_allowed_with)
2890 << "-fcoverage-mapping"
2891 << "-fprofile-instr-generate";
2892
2893 if (Args.hasArg(options::OPT_fcoverage_mapping))
2894 CmdArgs.push_back("-fcoverage-mapping");
2895
2896 if (C.getArgs().hasArg(options::OPT_c) ||
2897 C.getArgs().hasArg(options::OPT_S)) {
2898 if (Output.isFilename()) {
2899 CmdArgs.push_back("-coverage-file");
2900 SmallString<128> CoverageFilename;
2901 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2902 CoverageFilename = FinalOutput->getValue();
2903 } else {
2904 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2905 }
2906 if (llvm::sys::path::is_relative(CoverageFilename)) {
2907 SmallString<128> Pwd;
2908 if (!llvm::sys::fs::current_path(Pwd)) {
2909 llvm::sys::path::append(Pwd, CoverageFilename);
2910 CoverageFilename.swap(Pwd);
2911 }
2912 }
2913 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2914 }
2915 }
2916}
2917
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002918void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002919 const InputInfo &Output, const InputInfoList &Inputs,
2920 const ArgList &Args, const char *LinkingOutput) const {
2921 bool KernelOrKext =
2922 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002923 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002924 ArgStringList CmdArgs;
2925
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002926 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002927 bool IsWindowsCygnus =
2928 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002929 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2930
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002931 // Check number of inputs for sanity. We need at least one input.
2932 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00002933 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00002934 // CUDA compilation may have multiple inputs (source file + results of
2935 // device-side compilations). All other jobs are expected to have exactly one
2936 // input.
2937 bool IsCuda = types::isCuda(Input.getType());
2938 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00002939
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002940 // Invoke ourselves in -cc1 mode.
2941 //
2942 // FIXME: Implement custom jobs for internal actions.
2943 CmdArgs.push_back("-cc1");
2944
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002945 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002946 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002947 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002948 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002949
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002950 const llvm::Triple TT(TripleStr);
2951 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2952 TT.getArch() == llvm::Triple::thumb)) {
2953 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2954 unsigned Version;
2955 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2956 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002957 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2958 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002959 }
2960
Tim Northover336f1892014-03-29 13:16:12 +00002961 // Push all default warning arguments that are specific to
2962 // the given target. These come before user provided warning options
2963 // are provided.
2964 getToolChain().addClangWarningOptions(CmdArgs);
2965
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002966 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002967 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002968
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002969 if (isa<AnalyzeJobAction>(JA)) {
2970 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2971 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002972 } else if (isa<MigrateJobAction>(JA)) {
2973 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002974 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002975 if (Output.getType() == types::TY_Dependencies)
2976 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002977 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002978 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002979 if (Args.hasArg(options::OPT_rewrite_objc) &&
2980 !Args.hasArg(options::OPT_g_Group))
2981 CmdArgs.push_back("-P");
2982 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002983 } else if (isa<AssembleJobAction>(JA)) {
2984 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002985
David Blaikie9260ed62013-07-25 21:19:01 +00002986 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002987
2988 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002989 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002990 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002991 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002992 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002993
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002994 if (JA.getType() == types::TY_Nothing)
2995 CmdArgs.push_back("-fsyntax-only");
2996 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002997 CmdArgs.push_back("-emit-pch");
2998 else
2999 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003000 } else if (isa<VerifyPCHJobAction>(JA)) {
3001 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003002 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003003 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3004 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003005
Renato Golin7c542b42015-07-27 23:44:45 +00003006 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003007 CmdArgs.push_back("-flto");
3008 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003009 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003010 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003011 } else if (JA.getType() == types::TY_LLVM_IR ||
3012 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003013 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003014 } else if (JA.getType() == types::TY_LLVM_BC ||
3015 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003016 CmdArgs.push_back("-emit-llvm-bc");
3017 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003018 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003019 } else if (JA.getType() == types::TY_AST) {
3020 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003021 } else if (JA.getType() == types::TY_ModuleFile) {
3022 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003023 } else if (JA.getType() == types::TY_RewrittenObjC) {
3024 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003025 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003026 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3027 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003028 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003029 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003030 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003031 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003032
3033 // Preserve use-list order by default when emitting bitcode, so that
3034 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3035 // same result as running passes here. For LTO, we don't need to preserve
3036 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003037 if (JA.getType() == types::TY_LLVM_BC)
3038 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003039 }
3040
Justin Bognera88f0122014-06-20 22:59:50 +00003041 // We normally speed up the clang process a bit by skipping destructors at
3042 // exit, but when we're generating diagnostics we can rely on some of the
3043 // cleanup.
3044 if (!C.isForDiagnostics())
3045 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003047// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003048#ifdef NDEBUG
3049 CmdArgs.push_back("-disable-llvm-verifier");
3050#endif
3051
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003052 // Set the main file name, so that debug info works even with
3053 // -save-temps.
3054 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003055 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003056
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003057 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003058 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003059 if (Args.hasArg(options::OPT_static))
3060 CmdArgs.push_back("-static-define");
3061
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003062 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003063 // Enable region store model by default.
3064 CmdArgs.push_back("-analyzer-store=region");
3065
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003066 // Treat blocks as analysis entry points.
3067 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3068
Ted Kremenek49c79792011-03-24 00:28:47 +00003069 CmdArgs.push_back("-analyzer-eagerly-assume");
3070
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003071 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003072 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003073 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003074
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003075 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003076 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003077
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003078 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003079 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003080
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003081 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003082
Artem Belevichba558952015-05-06 18:20:23 +00003083 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003084 CmdArgs.push_back("-analyzer-checker=cplusplus");
3085
Nico Webere8e53112014-05-11 01:04:02 +00003086 // Enable the following experimental checkers for testing.
3087 CmdArgs.push_back(
3088 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003089 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3090 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003091 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003092 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3093 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003094 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003095
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003096 // Set the output format. The default is plist, for (lame) historical
3097 // reasons.
3098 CmdArgs.push_back("-analyzer-output");
3099 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003100 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003101 else
3102 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003103
Ted Kremenekfe449a22010-03-22 22:32:05 +00003104 // Disable the presentation of standard compiler warnings when
3105 // using --analyze. We only want to show static analyzer diagnostics
3106 // or frontend errors.
3107 CmdArgs.push_back("-w");
3108
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003109 // Add -Xanalyzer arguments when running as analyzer.
3110 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003111 }
3112
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003113 CheckCodeGenerationOptions(D, Args);
3114
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003115 bool PIE = getToolChain().isPIEDefault();
3116 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003117 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003118
Alexey Bataev40e75222014-01-28 06:30:35 +00003119 // Android-specific defaults for PIC/PIE
3120 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003121 switch (getToolChain().getArch()) {
Alexey Bataev40e75222014-01-28 06:30:35 +00003122 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003123 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00003124 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003125 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00003126 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00003127 case llvm::Triple::mips:
3128 case llvm::Triple::mipsel:
3129 case llvm::Triple::mips64:
3130 case llvm::Triple::mips64el:
3131 PIC = true; // "-fpic"
3132 break;
3133
3134 case llvm::Triple::x86:
3135 case llvm::Triple::x86_64:
3136 PIC = true; // "-fPIC"
3137 IsPICLevelTwo = true;
3138 break;
3139
3140 default:
3141 break;
3142 }
3143 }
3144
Brad Smith5b05db82014-06-24 19:51:29 +00003145 // OpenBSD-specific defaults for PIE
3146 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00003147 switch (getToolChain().getArch()) {
Brad Smith5b05db82014-06-24 19:51:29 +00003148 case llvm::Triple::mips64:
3149 case llvm::Triple::mips64el:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003150 case llvm::Triple::sparcel:
Brad Smith5b05db82014-06-24 19:51:29 +00003151 case llvm::Triple::x86:
3152 case llvm::Triple::x86_64:
3153 IsPICLevelTwo = false; // "-fpie"
3154 break;
3155
3156 case llvm::Triple::ppc:
Brad Smithb58159a2015-06-04 08:45:23 +00003157 case llvm::Triple::sparc:
Brad Smith5b05db82014-06-24 19:51:29 +00003158 case llvm::Triple::sparcv9:
3159 IsPICLevelTwo = true; // "-fPIE"
3160 break;
3161
3162 default:
3163 break;
3164 }
3165 }
3166
Alexey Samsonov090301e2013-04-09 12:28:19 +00003167 // For the PIC and PIE flag options, this logic is different from the
3168 // legacy logic in very old versions of GCC, as that logic was just
3169 // a bug no one had ever fixed. This logic is both more rational and
3170 // consistent with GCC's new logic now that the bugs are fixed. The last
3171 // argument relating to either PIC or PIE wins, and no other argument is
3172 // used. If the last argument is any flavor of the '-fno-...' arguments,
3173 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
3174 // at the same level.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003175 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3176 options::OPT_fpic, options::OPT_fno_pic,
3177 options::OPT_fPIE, options::OPT_fno_PIE,
3178 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00003179 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3180 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003181 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00003182 if (LastPICArg) {
3183 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003184 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3185 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3186 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003187 PIC =
3188 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3189 IsPICLevelTwo =
3190 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003191 } else {
3192 PIE = PIC = false;
3193 }
3194 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003195 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00003196
Nick Lewycky609dd662013-10-11 03:33:53 +00003197 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00003198 // specified while enabling PIC enabled level 1 PIC, just force it back to
3199 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
3200 // informal testing).
3201 if (PIC && getToolChain().getTriple().isOSDarwin())
3202 IsPICLevelTwo |= getToolChain().isPICDefault();
3203
Chandler Carruthc0c04552012-04-08 16:40:35 +00003204 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
3205 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003206 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00003207 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003208 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00003209 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00003210 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00003211
Chandler Carruth76a943b2012-11-19 03:52:03 +00003212 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3213 // This is a very special mode. It trumps the other modes, almost no one
3214 // uses it, and it isn't even valid on any OS but Darwin.
3215 if (!getToolChain().getTriple().isOSDarwin())
3216 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003217 << A->getSpelling() << getToolChain().getTriple().str();
Chandler Carruth76a943b2012-11-19 03:52:03 +00003218
3219 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3220
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003221 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003222 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00003223
Chandler Carruth76a943b2012-11-19 03:52:03 +00003224 // Only a forced PIC mode can cause the actual compile to have PIC defines
3225 // etc., no flags are sufficient. This behavior was selected to closely
3226 // match that of llvm-gcc and Apple GCC before that.
3227 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
3228 CmdArgs.push_back("-pic-level");
3229 CmdArgs.push_back("2");
3230 }
3231 } else {
3232 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
3233 // handled in Clang's IRGen by the -pie-level flag.
3234 CmdArgs.push_back("-mrelocation-model");
3235 CmdArgs.push_back(PIC ? "pic" : "static");
3236
3237 if (PIC) {
3238 CmdArgs.push_back("-pic-level");
3239 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3240 if (PIE) {
3241 CmdArgs.push_back("-pie-level");
3242 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
3243 }
3244 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003245 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003246
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003247 CmdArgs.push_back("-mthread-model");
3248 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3249 CmdArgs.push_back(A->getValue());
3250 else
3251 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3252
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003253 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3254
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003255 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3256 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003257 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003258
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003259 // LLVM Code Generator Options.
3260
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003261 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3262 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003263 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3264 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003265 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003266 CmdArgs.push_back(A->getValue());
3267 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003268 }
3269 }
3270
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003271 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3272 StringRef v = A->getValue();
3273 CmdArgs.push_back("-mllvm");
3274 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3275 A->claim();
3276 }
3277
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003278 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3279 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003280 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003281 }
3282
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003283 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3284 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003285 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003286 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003287 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003288 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3289 CmdArgs.push_back("-fpcc-struct-return");
3290 } else {
3291 assert(A->getOption().matches(options::OPT_freg_struct_return));
3292 CmdArgs.push_back("-freg-struct-return");
3293 }
3294 }
3295
Roman Divacky65b88cd2011-03-01 17:40:53 +00003296 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3297 CmdArgs.push_back("-mrtd");
3298
Rafael Espindola224dd632011-12-14 21:02:23 +00003299 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003300 CmdArgs.push_back("-mdisable-fp-elim");
3301 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3302 options::OPT_fno_zero_initialized_in_bss))
3303 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003304
3305 bool OFastEnabled = isOptimizationLevelFast(Args);
3306 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3307 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003308 OptSpecifier StrictAliasingAliasOption =
3309 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003310 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3311 // doesn't do any TBAA.
3312 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003313 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003314 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003315 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003316 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3317 options::OPT_fno_struct_path_tbaa))
3318 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003319 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3320 false))
3321 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003322 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3323 options::OPT_fno_optimize_sibling_calls))
3324 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003325
Eric Christopher006208c2013-04-04 06:29:47 +00003326 // Handle segmented stacks.
3327 if (Args.hasArg(options::OPT_fsplit_stack))
3328 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003329
3330 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3331 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003332 OptSpecifier FastMathAliasOption =
3333 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3334
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003335 // Handle various floating point optimization flags, mapping them to the
3336 // appropriate LLVM code generation flags. The pattern for all of these is to
3337 // default off the codegen optimizations, and if any flag enables them and no
3338 // flag disables them after the flag enabling them, enable the codegen
3339 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003340 if (Arg *A = Args.getLastArg(
3341 options::OPT_ffast_math, FastMathAliasOption,
3342 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3343 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3344 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003345 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3346 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003347 A->getOption().getID() != options::OPT_fhonor_infinities)
3348 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003349 if (Arg *A = Args.getLastArg(
3350 options::OPT_ffast_math, FastMathAliasOption,
3351 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3352 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3353 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003354 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3355 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003356 A->getOption().getID() != options::OPT_fhonor_nans)
3357 CmdArgs.push_back("-menable-no-nans");
3358
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003359 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3360 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003361 if (Arg *A =
3362 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3363 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3364 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003365 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3366 // However, turning *off* -ffast_math merely restores the toolchain default
3367 // (which may be false).
3368 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3369 A->getOption().getID() == options::OPT_ffast_math ||
3370 A->getOption().getID() == options::OPT_Ofast)
3371 MathErrno = false;
3372 else if (A->getOption().getID() == options::OPT_fmath_errno)
3373 MathErrno = true;
3374 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003375 if (MathErrno)
3376 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003377
3378 // There are several flags which require disabling very specific
3379 // optimizations. Any of these being disabled forces us to turn off the
3380 // entire set of LLVM optimizations, so collect them through all the flag
3381 // madness.
3382 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003383 if (Arg *A = Args.getLastArg(
3384 options::OPT_ffast_math, FastMathAliasOption,
3385 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3386 options::OPT_fno_unsafe_math_optimizations,
3387 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003388 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3389 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003390 A->getOption().getID() != options::OPT_fno_associative_math)
3391 AssociativeMath = true;
3392 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003393 if (Arg *A = Args.getLastArg(
3394 options::OPT_ffast_math, FastMathAliasOption,
3395 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3396 options::OPT_fno_unsafe_math_optimizations,
3397 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003398 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3399 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003400 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3401 ReciprocalMath = true;
3402 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003403 if (Arg *A = Args.getLastArg(
3404 options::OPT_ffast_math, FastMathAliasOption,
3405 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3406 options::OPT_fno_unsafe_math_optimizations,
3407 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003408 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3409 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003410 A->getOption().getID() != options::OPT_fsigned_zeros)
3411 SignedZeros = false;
3412 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003413 if (Arg *A = Args.getLastArg(
3414 options::OPT_ffast_math, FastMathAliasOption,
3415 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3416 options::OPT_fno_unsafe_math_optimizations,
3417 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003418 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3419 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003420 A->getOption().getID() != options::OPT_ftrapping_math)
3421 TrappingMath = false;
3422 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3423 !TrappingMath)
3424 CmdArgs.push_back("-menable-unsafe-fp-math");
3425
Sanjay Patel76c9e092015-01-23 16:40:50 +00003426 if (!SignedZeros)
3427 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003428
Sanjay Patel359b1052015-04-09 15:03:23 +00003429 if (ReciprocalMath)
3430 CmdArgs.push_back("-freciprocal-math");
3431
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003432 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003433 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003434 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003435 options::OPT_ffp_contract)) {
3436 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003437 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003438 if (Val == "fast" || Val == "on" || Val == "off") {
3439 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3440 } else {
3441 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003442 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003443 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003444 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3445 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003446 // If fast-math is set then set the fp-contract mode to fast.
3447 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3448 }
3449 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003450
Sanjay Patel2987c292015-06-11 14:53:41 +00003451 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003452
Bob Wilson6a039162012-07-19 03:52:53 +00003453 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3454 // and if we find them, tell the frontend to provide the appropriate
3455 // preprocessor macros. This is distinct from enabling any optimizations as
3456 // these options induce language changes which must survive serialization
3457 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003458 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3459 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003460 if (!A->getOption().matches(options::OPT_fno_fast_math))
3461 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003462 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3463 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003464 if (A->getOption().matches(options::OPT_ffinite_math_only))
3465 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003466
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003467 // Decide whether to use verbose asm. Verbose assembly is the default on
3468 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003469 bool IsIntegratedAssemblerDefault =
3470 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003471 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003472 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003473 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003474 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003475
Rafael Espindolab8a12932015-05-22 20:44:03 +00003476 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3477 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003478 CmdArgs.push_back("-no-integrated-as");
3479
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003480 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3481 CmdArgs.push_back("-mdebug-pass");
3482 CmdArgs.push_back("Structure");
3483 }
3484 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3485 CmdArgs.push_back("-mdebug-pass");
3486 CmdArgs.push_back("Arguments");
3487 }
3488
John McCall8517abc2010-02-19 02:45:38 +00003489 // Enable -mconstructor-aliases except on darwin, where we have to
3490 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003491 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003492 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003493
John McCall7ef5cb32011-03-18 02:56:14 +00003494 // Darwin's kernel doesn't support guard variables; just die if we
3495 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003496 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003497 CmdArgs.push_back("-fforbid-guard-variables");
3498
Douglas Gregordbe39272011-02-01 15:15:22 +00003499 if (Args.hasArg(options::OPT_mms_bitfields)) {
3500 CmdArgs.push_back("-mms-bitfields");
3501 }
John McCall8517abc2010-02-19 02:45:38 +00003502
Daniel Dunbar306945d2009-09-16 06:17:29 +00003503 // This is a coarse approximation of what llvm-gcc actually does, both
3504 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3505 // complicated ways.
3506 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003507 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3508 options::OPT_fno_asynchronous_unwind_tables,
3509 (getToolChain().IsUnwindTablesDefault() ||
3510 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3511 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003512 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3513 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003514 CmdArgs.push_back("-munwind-tables");
3515
Chandler Carruth05fb5852012-11-21 23:40:23 +00003516 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003517
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003518 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3519 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003520 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003521 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003522
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003523 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003524 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003525
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003526 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003527 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003528 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003529 }
3530
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003531 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003532 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003533 if (!CPU.empty()) {
3534 CmdArgs.push_back("-target-cpu");
3535 CmdArgs.push_back(Args.MakeArgString(CPU));
3536 }
3537
Rafael Espindolaeb265472013-08-21 21:59:03 +00003538 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3539 CmdArgs.push_back("-mfpmath");
3540 CmdArgs.push_back(A->getValue());
3541 }
3542
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003543 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003544 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003545
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003546 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003548 default:
3549 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003550
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003551 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003552 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003553 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003554 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003555 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003556 break;
3557
Tim Northover573cbee2014-05-24 12:52:07 +00003558 case llvm::Triple::aarch64:
3559 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003560 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003561 break;
3562
Eric Christopher0b26a612010-03-02 02:41:08 +00003563 case llvm::Triple::mips:
3564 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003565 case llvm::Triple::mips64:
3566 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003567 AddMIPSTargetArgs(Args, CmdArgs);
3568 break;
3569
Ulrich Weigand8afad612014-07-28 13:17:52 +00003570 case llvm::Triple::ppc:
3571 case llvm::Triple::ppc64:
3572 case llvm::Triple::ppc64le:
3573 AddPPCTargetArgs(Args, CmdArgs);
3574 break;
3575
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003576 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003577 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003578 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003579 AddSparcTargetArgs(Args, CmdArgs);
3580 break;
3581
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003582 case llvm::Triple::x86:
3583 case llvm::Triple::x86_64:
3584 AddX86TargetArgs(Args, CmdArgs);
3585 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003586
3587 case llvm::Triple::hexagon:
3588 AddHexagonTargetArgs(Args, CmdArgs);
3589 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003590 }
3591
Hans Wennborg75958c42013-08-08 00:17:41 +00003592 // Add clang-cl arguments.
3593 if (getToolChain().getDriver().IsCLMode())
3594 AddClangCLArgs(Args, CmdArgs);
3595
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003596 // Pass the linker version in use.
3597 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3598 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003599 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003600 }
3601
Eric Christopherb7d97e92013-04-03 01:58:53 +00003602 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003603 CmdArgs.push_back("-momit-leaf-frame-pointer");
3604
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003605 // Explicitly error on some things we know we don't support and can't just
3606 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003607 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003608 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3609 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003610 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003611 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003612 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3613 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003614 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003615 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003616 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003617 }
3618
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003619 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003620 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003621 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003622 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003623 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3624 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003625 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003626 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003627 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003628
Chad Rosierbe10f982011-08-02 17:58:04 +00003629 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003630 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003631 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3632 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003633 }
3634
Manman Ren17bdb0f2013-11-20 20:22:14 +00003635 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3636 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003637 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003638 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003639 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3640 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003641 // FIXME: we should support specifying dwarf version with
3642 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003643 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003644 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003645 const llvm::Triple &Triple = getToolChain().getTriple();
3646 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003647 Triple.getOS() == llvm::Triple::FreeBSD ||
3648 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003649 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003650 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003651 CmdArgs.push_back("-gdwarf-2");
3652 else if (A->getOption().matches(options::OPT_gdwarf_3))
3653 CmdArgs.push_back("-gdwarf-3");
3654 else if (A->getOption().matches(options::OPT_gdwarf_4))
3655 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003656 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003657 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003658 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003659 const llvm::Triple &Triple = getToolChain().getTriple();
3660 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003661 Triple.getOS() == llvm::Triple::FreeBSD ||
3662 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003663 CmdArgs.push_back("-gdwarf-2");
3664 else
3665 CmdArgs.push_back("-g");
3666 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003667 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003668
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003669 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3670 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003671 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3672 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003673 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003674
Eric Christopher138c32b2013-09-13 22:37:55 +00003675 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003676 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3677 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003678 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003679 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003680 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003681 CmdArgs.push_back("-g");
3682 CmdArgs.push_back("-backend-option");
3683 CmdArgs.push_back("-split-dwarf=Enable");
3684 }
3685
Eric Christopher138c32b2013-09-13 22:37:55 +00003686 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3687 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3688 CmdArgs.push_back("-backend-option");
3689 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3690 }
Eric Christophereec89c22013-06-18 00:03:50 +00003691
Eric Christopher0d403d22014-02-14 01:27:03 +00003692 // -gdwarf-aranges turns on the emission of the aranges section in the
3693 // backend.
3694 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3695 CmdArgs.push_back("-backend-option");
3696 CmdArgs.push_back("-generate-arange-section");
3697 }
3698
David Blaikief36d9ba2014-01-27 18:52:43 +00003699 if (Args.hasFlag(options::OPT_fdebug_types_section,
3700 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003701 CmdArgs.push_back("-backend-option");
3702 CmdArgs.push_back("-generate-type-units");
3703 }
Eric Christophereec89c22013-06-18 00:03:50 +00003704
Ed Schouten6e576152015-03-26 17:50:28 +00003705 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3706 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3707
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003708 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003709 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003710 CmdArgs.push_back("-ffunction-sections");
3711 }
3712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003713 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3714 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003715 CmdArgs.push_back("-fdata-sections");
3716 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003717
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003718 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003719 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003720 CmdArgs.push_back("-fno-unique-section-names");
3721
Chris Lattner3c77a352010-06-22 00:03:40 +00003722 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3723
Diego Novilloa0545962015-07-10 18:00:07 +00003724 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003725
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003726 // Pass options for controlling the default header search paths.
3727 if (Args.hasArg(options::OPT_nostdinc)) {
3728 CmdArgs.push_back("-nostdsysteminc");
3729 CmdArgs.push_back("-nobuiltininc");
3730 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003731 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003732 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003733 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3734 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3735 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003736
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003737 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003738 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003739 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003740
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003741 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3742
Ted Kremenekf7639e12012-03-06 20:06:33 +00003743 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003744 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003745 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003746 options::OPT_ccc_arcmt_modify,
3747 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003748 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003749 switch (A->getOption().getID()) {
3750 default:
3751 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003752 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003753 CmdArgs.push_back("-arcmt-check");
3754 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003755 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003756 CmdArgs.push_back("-arcmt-modify");
3757 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003758 case options::OPT_ccc_arcmt_migrate:
3759 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003760 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003761 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003762
3763 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3764 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003765 break;
John McCalld70fb982011-06-15 23:25:17 +00003766 }
3767 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003768 } else {
3769 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3770 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3771 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003772 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003773
Ted Kremenekf7639e12012-03-06 20:06:33 +00003774 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3775 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003776 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3777 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003778 }
3779 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003780 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003781
3782 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003783 options::OPT_objcmt_migrate_subscripting,
3784 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003785 // None specified, means enable them all.
3786 CmdArgs.push_back("-objcmt-migrate-literals");
3787 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003788 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003789 } else {
3790 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3791 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003792 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003793 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003794 } else {
3795 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3796 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3797 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3798 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3799 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3800 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003801 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003802 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3803 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3804 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3805 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3806 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3807 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3808 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003809 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003810 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003811 }
3812
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003813 // Add preprocessing options like -I, -D, etc. if we are using the
3814 // preprocessor.
3815 //
3816 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003817 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003818 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003819
Rafael Espindolaa7431922011-07-21 23:40:37 +00003820 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3821 // that "The compiler can only warn and ignore the option if not recognized".
3822 // When building with ccache, it will pass -D options to clang even on
3823 // preprocessed inputs and configure concludes that -fPIC is not supported.
3824 Args.ClaimAllArgs(options::OPT_D);
3825
Alp Toker7874bdc2013-11-15 20:40:58 +00003826 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003827 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3828 if (A->getOption().matches(options::OPT_O4)) {
3829 CmdArgs.push_back("-O3");
3830 D.Diag(diag::warn_O4_is_O3);
3831 } else {
3832 A->render(Args, CmdArgs);
3833 }
3834 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003835
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003836 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003837 for (const Arg *A :
3838 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3839 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003840 }
3841
Rafael Espindola577637a2015-01-03 00:06:04 +00003842 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003843
Richard Smith3be1cb22014-08-07 00:24:21 +00003844 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003845 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003846 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3847 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003848 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003849 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003850
3851 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003852 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003853 //
3854 // If a std is supplied, only add -trigraphs if it follows the
3855 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003856 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003857 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3858 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003859 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003860 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003861 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003862 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003863 else
3864 Std->render(Args, CmdArgs);
3865
Nico Weber00721502014-12-23 22:32:37 +00003866 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003867 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003868 options::OPT_ftrigraphs,
3869 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003870 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003871 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003872 } else {
3873 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003874 //
3875 // FIXME: Clang doesn't correctly handle -std= when the input language
3876 // doesn't match. For the time being just ignore this for C++ inputs;
3877 // eventually we want to do all the standard defaulting here instead of
3878 // splitting it between the driver and clang -cc1.
3879 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003880 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
3881 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003882 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00003883 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00003884
Nico Weber00721502014-12-23 22:32:37 +00003885 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3886 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003887 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003888
Richard Smith282b4492013-09-04 22:50:31 +00003889 // GCC's behavior for -Wwrite-strings is a bit strange:
3890 // * In C, this "warning flag" changes the types of string literals from
3891 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3892 // for the discarded qualifier.
3893 // * In C++, this is just a normal warning flag.
3894 //
3895 // Implementing this warning correctly in C is hard, so we follow GCC's
3896 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3897 // a non-const char* in C, rather than using this crude hack.
3898 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003899 // FIXME: This should behave just like a warning flag, and thus should also
3900 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3901 Arg *WriteStrings =
3902 Args.getLastArg(options::OPT_Wwrite_strings,
3903 options::OPT_Wno_write_strings, options::OPT_w);
3904 if (WriteStrings &&
3905 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003906 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003907 }
3908
Chandler Carruth61fbf622011-04-23 09:27:53 +00003909 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003910 // during C++ compilation, which it is by default. GCC keeps this define even
3911 // in the presence of '-w', match this behavior bug-for-bug.
3912 if (types::isCXX(InputType) &&
3913 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3914 true)) {
3915 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003916 }
3917
Chandler Carruthe0391482010-05-22 02:21:53 +00003918 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3919 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3920 if (Asm->getOption().matches(options::OPT_fasm))
3921 CmdArgs.push_back("-fgnu-keywords");
3922 else
3923 CmdArgs.push_back("-fno-gnu-keywords");
3924 }
3925
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003926 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3927 CmdArgs.push_back("-fno-dwarf-directory-asm");
3928
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003929 if (ShouldDisableAutolink(Args, getToolChain()))
3930 CmdArgs.push_back("-fno-autolink");
3931
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003932 // Add in -fdebug-compilation-dir if necessary.
3933 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003934
Richard Smith9a568822011-11-21 19:36:32 +00003935 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3936 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003937 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003938 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003939 }
3940
Richard Smith79c927b2013-11-06 19:31:51 +00003941 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3942 CmdArgs.push_back("-foperator-arrow-depth");
3943 CmdArgs.push_back(A->getValue());
3944 }
3945
Richard Smith9a568822011-11-21 19:36:32 +00003946 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3947 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003948 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003949 }
3950
Richard Smitha3d3bd22013-05-08 02:12:03 +00003951 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3952 CmdArgs.push_back("-fconstexpr-steps");
3953 CmdArgs.push_back(A->getValue());
3954 }
3955
Richard Smithb3a14522013-02-22 01:59:51 +00003956 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3957 CmdArgs.push_back("-fbracket-depth");
3958 CmdArgs.push_back(A->getValue());
3959 }
3960
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003961 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3962 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003963 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003964 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003965 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3966 } else
3967 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003968 }
3969
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003970 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003971 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003972
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003973 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3974 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003975 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003976 }
David Chisnall5778fce2009-08-31 16:41:57 +00003977
Chris Lattnere23003d2010-01-09 21:54:33 +00003978 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3979 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003980 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003981 }
3982
Chris Lattnerb35583d2010-04-07 20:49:23 +00003983 CmdArgs.push_back("-ferror-limit");
3984 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003985 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003986 else
3987 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003988
Chandler Carrutha77a7272010-05-06 04:55:18 +00003989 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3990 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003991 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003992 }
3993
3994 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3995 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003996 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003997 }
3998
Richard Smithf6f003a2011-12-16 19:06:07 +00003999 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4000 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004001 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004002 }
4003
Nick Lewycky24653262014-12-16 21:39:02 +00004004 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4005 CmdArgs.push_back("-fspell-checking-limit");
4006 CmdArgs.push_back(A->getValue());
4007 }
4008
Daniel Dunbar2c978472009-11-04 06:24:47 +00004009 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004010 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004011 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004012 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004013 } else {
4014 // If -fmessage-length=N was not specified, determine whether this is a
4015 // terminal and, if so, implicitly define -fmessage-length appropriately.
4016 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004017 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004018 }
4019
John McCallb4a99d32013-02-19 01:57:35 +00004020 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4021 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4022 options::OPT_fvisibility_ms_compat)) {
4023 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4024 CmdArgs.push_back("-fvisibility");
4025 CmdArgs.push_back(A->getValue());
4026 } else {
4027 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4028 CmdArgs.push_back("-fvisibility");
4029 CmdArgs.push_back("hidden");
4030 CmdArgs.push_back("-ftype-visibility");
4031 CmdArgs.push_back("default");
4032 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004033 }
4034
Douglas Gregor08329632010-06-15 17:05:35 +00004035 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004036
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004037 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4038
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004039 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004040 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4041 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004042 CmdArgs.push_back("-ffreestanding");
4043
Daniel Dunbare357d562009-12-03 18:42:11 +00004044 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004045 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004046 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004047 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4048 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004049 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004050 // Emulated TLS is enabled by default on Android, and can be enabled manually
4051 // with -femulated-tls.
4052 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4053 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4054 EmulatedTLSDefault))
4055 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004056 // AltiVec-like language extensions aren't relevant for assembling.
4057 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004058 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004059 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4060 }
Richard Trieu91844232012-06-26 18:18:47 +00004061 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4062 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004063
Alexey Bataevdb390212015-05-20 04:24:19 +00004064 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004065 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4066 options::OPT_fno_openmp, false))
4067 switch (getOpenMPRuntime(getToolChain(), Args)) {
4068 case OMPRT_OMP:
4069 case OMPRT_IOMP5:
4070 // Clang can generate useful OpenMP code for these two runtime libraries.
4071 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004072
4073 // If no option regarding the use of TLS in OpenMP codegeneration is
4074 // given, decide a default based on the target. Otherwise rely on the
4075 // options and pass the right information to the frontend.
4076 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
4077 options::OPT_fnoopenmp_use_tls,
4078 getToolChain().getArch() == llvm::Triple::ppc ||
4079 getToolChain().getArch() == llvm::Triple::ppc64 ||
4080 getToolChain().getArch() == llvm::Triple::ppc64le))
4081 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004082 break;
4083 default:
4084 // By default, if Clang doesn't know how to generate useful OpenMP code
4085 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4086 // down to the actual compilation.
4087 // FIXME: It would be better to have a mode which *only* omits IR
4088 // generation based on the OpenMP support so that we get consistent
4089 // semantic analysis, etc.
4090 break;
4091 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004092
Peter Collingbourne32701642013-11-01 18:16:25 +00004093 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004094 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004095
Eric Christopher459d2712013-02-19 06:16:53 +00004096 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004097 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4098 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4099 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4100 Arch == llvm::Triple::ppc64le))
4101 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4102 << "ppc/ppc64/ppc64le";
4103 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004104
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004105 // -fzvector is incompatible with -faltivec.
4106 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4107 if (Args.hasArg(options::OPT_faltivec))
4108 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4109 << "-faltivec";
4110
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004111 if (getToolChain().SupportsProfiling())
4112 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004113
4114 // -flax-vector-conversions is default.
4115 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4116 options::OPT_fno_lax_vector_conversions))
4117 CmdArgs.push_back("-fno-lax-vector-conversions");
4118
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004119 if (Args.getLastArg(options::OPT_fapple_kext))
4120 CmdArgs.push_back("-fapple-kext");
4121
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004122 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004123 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004124 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004125 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4126 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004127
4128 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4129 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004130 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004131 }
4132
Bob Wilson14adb362012-02-03 06:27:22 +00004133 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004134
Chandler Carruth6e501032011-03-27 00:04:55 +00004135 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4136 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004137 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004138 if (A->getOption().matches(options::OPT_fwrapv))
4139 CmdArgs.push_back("-fwrapv");
4140 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4141 options::OPT_fno_strict_overflow)) {
4142 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4143 CmdArgs.push_back("-fwrapv");
4144 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004145
4146 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4147 options::OPT_fno_reroll_loops))
4148 if (A->getOption().matches(options::OPT_freroll_loops))
4149 CmdArgs.push_back("-freroll-loops");
4150
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004151 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004152 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4153 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004154
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004155 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4156
Daniel Dunbar4930e332009-11-17 08:07:36 +00004157 // -stack-protector=0 is default.
4158 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004159 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4160 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4161 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4162 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4163 Args.ClaimAllArgs(options::OPT_fstack_protector);
4164 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004165 options::OPT_fstack_protector_all,
4166 options::OPT_fstack_protector_strong,
4167 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004168 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004169 StackProtectorLevel = std::max<unsigned>(
4170 LangOptions::SSPOn,
4171 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004172 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004173 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004174 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004175 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004176 } else {
4177 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004178 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004179 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004180 if (StackProtectorLevel) {
4181 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004182 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004183 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004184
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004185 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004186 for (const Arg *A : Args.filtered(options::OPT__param)) {
4187 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004188 if (Str.startswith("ssp-buffer-size=")) {
4189 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004190 CmdArgs.push_back("-stack-protector-buffer-size");
4191 // FIXME: Verify the argument is a valid integer.
4192 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004193 }
Sean Silva14facf32015-06-09 01:57:17 +00004194 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004195 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004196 }
4197
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004198 // Translate -mstackrealign
4199 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4200 false)) {
4201 CmdArgs.push_back("-backend-option");
4202 CmdArgs.push_back("-force-align-stack");
4203 }
4204 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004205 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004206 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4207 }
4208
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004209 if (Args.hasArg(options::OPT_mstack_alignment)) {
4210 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4211 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004212 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004213
Hans Wennborg77dc2362015-01-20 19:45:50 +00004214 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4215 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4216
4217 if (!Size.empty())
4218 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4219 else
4220 CmdArgs.push_back("-mstack-probe-size=0");
4221 }
4222
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004223 if (getToolChain().getArch() == llvm::Triple::aarch64 ||
4224 getToolChain().getArch() == llvm::Triple::aarch64_be)
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004225 CmdArgs.push_back("-fallow-half-arguments-and-returns");
4226
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004227 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4228 options::OPT_mno_restrict_it)) {
4229 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4230 CmdArgs.push_back("-backend-option");
4231 CmdArgs.push_back("-arm-restrict-it");
4232 } else {
4233 CmdArgs.push_back("-backend-option");
4234 CmdArgs.push_back("-arm-no-restrict-it");
4235 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004236 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
4237 TT.getArch() == llvm::Triple::thumb)) {
4238 // Windows on ARM expects restricted IT blocks
4239 CmdArgs.push_back("-backend-option");
4240 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004241 }
4242
Daniel Dunbard18049a2009-04-07 21:16:11 +00004243 // Forward -f options with positive and negative forms; we translate
4244 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004245 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4246 StringRef fname = A->getValue();
4247 if (!llvm::sys::fs::exists(fname))
4248 D.Diag(diag::err_drv_no_such_file) << fname;
4249 else
4250 A->render(Args, CmdArgs);
4251 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004252
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004253 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00004254 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004255 CmdArgs.push_back("-fapple-kext");
4256 if (!Args.hasArg(options::OPT_fbuiltin))
4257 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00004258 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004259 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004260 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004261 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004262 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004263
Nuno Lopes13c88c72009-12-16 16:59:22 +00004264 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4265 options::OPT_fno_assume_sane_operator_new))
4266 CmdArgs.push_back("-fno-assume-sane-operator-new");
4267
Daniel Dunbar4930e332009-11-17 08:07:36 +00004268 // -fblocks=0 is default.
4269 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004270 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004271 (Args.hasArg(options::OPT_fgnu_runtime) &&
4272 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4273 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004274 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004276 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004277 !getToolChain().hasBlocksRuntime())
4278 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004279 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004280
Richard Smith47972af2015-06-16 00:08:24 +00004281 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004282 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004283 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004284 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004285 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004286 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4287 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004288 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004289 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004290 HaveModules = true;
4291 }
4292 }
4293
Richard Smith47972af2015-06-16 00:08:24 +00004294 // -fmodule-maps enables implicit reading of module map files. By default,
4295 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004296 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4297 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004298 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004299 }
4300
Daniel Jasperac42b752013-10-21 06:34:34 +00004301 // -fmodules-decluse checks that modules used are declared so (off by
4302 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004303 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004304 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004305 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004306 }
4307
Daniel Jasper962b38e2014-04-11 11:47:45 +00004308 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4309 // all #included headers are part of modules.
4310 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004311 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004312 CmdArgs.push_back("-fmodules-strict-decluse");
4313 }
4314
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004315 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4316 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4317 options::OPT_fno_implicit_modules)) {
4318 CmdArgs.push_back("-fno-implicit-modules");
4319 }
4320
Daniel Jasperac42b752013-10-21 06:34:34 +00004321 // -fmodule-name specifies the module that is currently being built (or
4322 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004323 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004324
Richard Smith9887d792014-10-17 01:42:53 +00004325 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004326 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004327 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004328
Richard Smithe842a472014-10-22 02:05:46 +00004329 // -fmodule-file can be used to specify files containing precompiled modules.
4330 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4331
4332 // -fmodule-cache-path specifies where our implicitly-built module files
4333 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004334 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004335 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004336 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004337 if (HaveModules) {
4338 if (C.isForDiagnostics()) {
4339 // When generating crash reports, we want to emit the modules along with
4340 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004341 Path = Output.getFilename();
4342 llvm::sys::path::replace_extension(Path, ".cache");
4343 llvm::sys::path::append(Path, "modules");
4344 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004345 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004346 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004347 llvm::sys::path::append(Path, "org.llvm.clang.");
4348 appendUserToPath(Path);
4349 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004350 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004351 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004352 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4353 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004354 }
4355
4356 // When building modules and generating crashdumps, we need to dump a module
4357 // dependency VFS alongside the output.
4358 if (HaveModules && C.isForDiagnostics()) {
4359 SmallString<128> VFSDir(Output.getFilename());
4360 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004361 // Add the cache directory as a temp so the crash diagnostics pick it up.
4362 C.addTempFile(Args.MakeArgString(VFSDir));
4363
Justin Bognera88f0122014-06-20 22:59:50 +00004364 llvm::sys::path::append(VFSDir, "vfs");
4365 CmdArgs.push_back("-module-dependency-dir");
4366 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004367 }
4368
Richard Smith9887d792014-10-17 01:42:53 +00004369 if (HaveModules)
4370 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004371
Douglas Gregor35b04d62013-02-07 19:01:24 +00004372 // Pass through all -fmodules-ignore-macro arguments.
4373 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004374 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4375 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004376
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004377 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4378
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004379 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4380 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4381 D.Diag(diag::err_drv_argument_not_allowed_with)
4382 << A->getAsString(Args) << "-fbuild-session-timestamp";
4383
4384 llvm::sys::fs::file_status Status;
4385 if (llvm::sys::fs::status(A->getValue(), Status))
4386 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004387 CmdArgs.push_back(Args.MakeArgString(
4388 "-fbuild-session-timestamp=" +
4389 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004390 }
4391
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004392 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004393 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4394 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004395 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4396
4397 Args.AddLastArg(CmdArgs,
4398 options::OPT_fmodules_validate_once_per_build_session);
4399 }
4400
Ben Langmuirdcf73862014-03-12 00:06:17 +00004401 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4402
John McCalldfea9982010-04-09 19:12:06 +00004403 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004404 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004405 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004406 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004407
Anders Carlssond470fef2010-11-21 00:09:52 +00004408 // -felide-constructors is the default.
4409 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004410 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004411 CmdArgs.push_back("-fno-elide-constructors");
4412
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004413 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004414
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004415 if (KernelOrKext || (types::isCXX(InputType) &&
4416 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4417 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004418 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004419
Tony Linthicum76329bf2011-12-12 21:14:55 +00004420 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004421 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4422 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004423 CmdArgs.push_back("-fshort-enums");
4424
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004425 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004426 if (Arg *A = Args.getLastArg(
4427 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4428 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4429 if (A->getOption().matches(options::OPT_funsigned_char) ||
4430 A->getOption().matches(options::OPT_fno_signed_char)) {
4431 CmdArgs.push_back("-fno-signed-char");
4432 }
4433 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004434 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004435 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004436
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004437 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004438 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4439 options::OPT_fno_use_cxa_atexit,
4440 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004441 getToolChain().getArch() != llvm::Triple::hexagon &&
4442 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004443 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004444 CmdArgs.push_back("-fno-use-cxa-atexit");
4445
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004446 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004447 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004448 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004449 CmdArgs.push_back("-fms-extensions");
4450
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004451 // -fno-use-line-directives is default.
4452 if (Args.hasFlag(options::OPT_fuse_line_directives,
4453 options::OPT_fno_use_line_directives, false))
4454 CmdArgs.push_back("-fuse-line-directives");
4455
Francois Pichet1b4f1632011-09-17 04:32:15 +00004456 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004457 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004458 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004459 (IsWindowsMSVC &&
4460 Args.hasFlag(options::OPT_fms_extensions,
4461 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004462 CmdArgs.push_back("-fms-compatibility");
4463
David Majnemerc371ff02015-03-22 08:39:22 +00004464 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004465 VersionTuple MSVT = visualstudio::getMSVCVersion(
4466 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4467 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004468 CmdArgs.push_back(
4469 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004470
David Majnemer8db91762015-05-18 04:49:30 +00004471 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4472 if (ImplyVCPPCXXVer) {
4473 if (IsMSVC2015Compatible)
4474 CmdArgs.push_back("-std=c++14");
4475 else
4476 CmdArgs.push_back("-std=c++11");
4477 }
4478
Eric Christopher5ecce122013-02-18 00:38:31 +00004479 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004480 if (Args.hasFlag(options::OPT_fborland_extensions,
4481 options::OPT_fno_borland_extensions, false))
4482 CmdArgs.push_back("-fborland-extensions");
4483
David Majnemerc371ff02015-03-22 08:39:22 +00004484 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4485 // than 19.
4486 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4487 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004488 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004489 CmdArgs.push_back("-fno-threadsafe-statics");
4490
Francois Pichet02744872011-09-01 16:38:08 +00004491 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4492 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004493 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004494 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004495 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004496
Chandler Carruthe03aa552010-04-17 20:17:31 +00004497 // -fgnu-keywords default varies depending on language; only pass if
4498 // specified.
4499 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004500 options::OPT_fno_gnu_keywords))
4501 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004502
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004503 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004504 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004505 CmdArgs.push_back("-fgnu89-inline");
4506
Chad Rosier9c76d242012-03-15 22:31:42 +00004507 if (Args.hasArg(options::OPT_fno_inline))
4508 CmdArgs.push_back("-fno-inline");
4509
Chad Rosier64d6be92012-03-06 21:17:19 +00004510 if (Args.hasArg(options::OPT_fno_inline_functions))
4511 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004512
John McCall5fb5df92012-06-20 06:18:46 +00004513 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004514
John McCall5fb5df92012-06-20 06:18:46 +00004515 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004516 // legacy is the default. Except for deployment taget of 10.5,
4517 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4518 // gets ignored silently.
4519 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004520 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4521 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004522 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004523 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004524 if (getToolChain().UseObjCMixedDispatch())
4525 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4526 else
4527 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4528 }
4529 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004530
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004531 // When ObjectiveC legacy runtime is in effect on MacOSX,
4532 // turn on the option to do Array/Dictionary subscripting
4533 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004534 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004535 getToolChain().getTriple().isMacOSX() &&
4536 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4537 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004538 objcRuntime.isNeXTFamily())
4539 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004540
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004541 // -fencode-extended-block-signature=1 is default.
4542 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4543 CmdArgs.push_back("-fencode-extended-block-signature");
4544 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004545
John McCall24fc0de2011-07-06 00:26:06 +00004546 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4547 // NOTE: This logic is duplicated in ToolChains.cpp.
4548 bool ARC = isObjCAutoRefCount(Args);
4549 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004550 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004551
John McCall24fc0de2011-07-06 00:26:06 +00004552 CmdArgs.push_back("-fobjc-arc");
4553
Chandler Carruth491db322011-11-04 07:34:47 +00004554 // FIXME: It seems like this entire block, and several around it should be
4555 // wrapped in isObjC, but for now we just use it here as this is where it
4556 // was being used previously.
4557 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4558 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4559 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4560 else
4561 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4562 }
4563
John McCall24fc0de2011-07-06 00:26:06 +00004564 // Allow the user to enable full exceptions code emission.
4565 // We define off for Objective-CC, on for Objective-C++.
4566 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4567 options::OPT_fno_objc_arc_exceptions,
4568 /*default*/ types::isCXX(InputType)))
4569 CmdArgs.push_back("-fobjc-arc-exceptions");
4570 }
4571
4572 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4573 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004574 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004575 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004576
John McCall24fc0de2011-07-06 00:26:06 +00004577 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4578 // takes precedence.
4579 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4580 if (!GCArg)
4581 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4582 if (GCArg) {
4583 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004584 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004585 } else if (getToolChain().SupportsObjCGC()) {
4586 GCArg->render(Args, CmdArgs);
4587 } else {
4588 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004589 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004590 }
4591 }
4592
Bob Wilsonb111ec92015-03-02 19:01:14 +00004593 if (Args.hasFlag(options::OPT_fapplication_extension,
4594 options::OPT_fno_application_extension, false))
4595 CmdArgs.push_back("-fapplication-extension");
4596
Reid Klecknerc542d372014-06-27 17:02:02 +00004597 // Handle GCC-style exception args.
4598 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004599 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4600 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004601
4602 if (getToolChain().UseSjLjExceptions())
4603 CmdArgs.push_back("-fsjlj-exceptions");
4604
4605 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004606 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4607 options::OPT_fno_assume_sane_operator_new))
4608 CmdArgs.push_back("-fno-assume-sane-operator-new");
4609
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004610 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4611 // most platforms.
4612 if (Args.hasFlag(options::OPT_fsized_deallocation,
4613 options::OPT_fno_sized_deallocation, false))
4614 CmdArgs.push_back("-fsized-deallocation");
4615
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004616 // -fconstant-cfstrings is default, and may be subject to argument translation
4617 // on Darwin.
4618 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4619 options::OPT_fno_constant_cfstrings) ||
4620 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4621 options::OPT_mno_constant_cfstrings))
4622 CmdArgs.push_back("-fno-constant-cfstrings");
4623
John Thompsoned4e2952009-11-05 20:14:16 +00004624 // -fshort-wchar default varies depending on platform; only
4625 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004626 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4627 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004628 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004629
Hans Wennborg28c96312013-07-31 23:39:13 +00004630 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004631 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004632 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004633 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004634
Daniel Dunbar096ed292011-10-05 21:04:55 +00004635 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4636 // -fno-pack-struct doesn't apply to -fpack-struct=.
4637 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004638 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004639 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004640 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004641 } else if (Args.hasFlag(options::OPT_fpack_struct,
4642 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004643 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004644 }
4645
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004646 // Handle -fmax-type-align=N and -fno-type-align
4647 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4648 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4649 if (!SkipMaxTypeAlign) {
4650 std::string MaxTypeAlignStr = "-fmax-type-align=";
4651 MaxTypeAlignStr += A->getValue();
4652 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4653 }
4654 } else if (getToolChain().getTriple().isOSDarwin()) {
4655 if (!SkipMaxTypeAlign) {
4656 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4657 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4658 }
4659 }
4660
Robert Lytton0e076492013-08-13 09:43:10 +00004661 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004662 if (!Args.hasArg(options::OPT_fcommon))
4663 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004664 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004665 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004666
Daniel Dunbard18049a2009-04-07 21:16:11 +00004667 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004668 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004669 CmdArgs.push_back("-fno-common");
4670
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004671 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004672 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004673 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004674 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004675 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004676 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004677
Daniel Dunbar6358d682010-10-15 22:30:42 +00004678 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004679 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004680 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004681 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004682
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004683 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004684 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4685 StringRef value = inputCharset->getValue();
4686 if (value != "UTF-8")
4687 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4688 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004689 }
4690
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004691 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004692 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4693 StringRef value = execCharset->getValue();
4694 if (value != "UTF-8")
4695 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4696 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004697 }
4698
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004699 // -fcaret-diagnostics is default.
4700 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4701 options::OPT_fno_caret_diagnostics, true))
4702 CmdArgs.push_back("-fno-caret-diagnostics");
4703
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004704 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004705 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004706 options::OPT_fno_diagnostics_fixit_info))
4707 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004708
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004709 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004710 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004711 options::OPT_fno_diagnostics_show_option))
4712 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004713
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004714 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004715 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004716 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004717 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004718 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004719
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004720 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004721 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004722 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004723 }
4724
Chandler Carruthb6766f02011-03-27 01:50:55 +00004725 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004726 options::OPT_fdiagnostics_show_note_include_stack,
4727 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004728 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004729 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004730 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4731 else
4732 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4733 }
4734
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004735 // Color diagnostics are the default, unless the terminal doesn't support
4736 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004737 // Support both clang's -f[no-]color-diagnostics and gcc's
4738 // -f[no-]diagnostics-colors[=never|always|auto].
4739 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004740 for (const auto &Arg : Args) {
4741 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004742 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4743 !O.matches(options::OPT_fdiagnostics_color) &&
4744 !O.matches(options::OPT_fno_color_diagnostics) &&
4745 !O.matches(options::OPT_fno_diagnostics_color) &&
4746 !O.matches(options::OPT_fdiagnostics_color_EQ))
4747 continue;
4748
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004749 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004750 if (O.matches(options::OPT_fcolor_diagnostics) ||
4751 O.matches(options::OPT_fdiagnostics_color)) {
4752 ShowColors = Colors_On;
4753 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4754 O.matches(options::OPT_fno_diagnostics_color)) {
4755 ShowColors = Colors_Off;
4756 } else {
4757 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004758 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004759 if (value == "always")
4760 ShowColors = Colors_On;
4761 else if (value == "never")
4762 ShowColors = Colors_Off;
4763 else if (value == "auto")
4764 ShowColors = Colors_Auto;
4765 else
4766 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004767 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004768 }
4769 }
4770 if (ShowColors == Colors_On ||
4771 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004772 CmdArgs.push_back("-fcolor-diagnostics");
4773
Nico Rieck7857d462013-09-11 00:38:02 +00004774 if (Args.hasArg(options::OPT_fansi_escape_codes))
4775 CmdArgs.push_back("-fansi-escape-codes");
4776
Daniel Dunbardb097022009-06-08 21:13:54 +00004777 if (!Args.hasFlag(options::OPT_fshow_source_location,
4778 options::OPT_fno_show_source_location))
4779 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004780
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004781 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004782 true))
4783 CmdArgs.push_back("-fno-show-column");
4784
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004785 if (!Args.hasFlag(options::OPT_fspell_checking,
4786 options::OPT_fno_spell_checking))
4787 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004788
Chad Rosierc8e56e82012-12-05 21:08:21 +00004789 // -fno-asm-blocks is default.
4790 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4791 false))
4792 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004793
Steven Wucb0d13f2015-01-16 23:05:28 +00004794 // -fgnu-inline-asm is default.
4795 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4796 options::OPT_fno_gnu_inline_asm, true))
4797 CmdArgs.push_back("-fno-gnu-inline-asm");
4798
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004799 // Enable vectorization per default according to the optimization level
4800 // selected. For optimization levels that want vectorization we use the alias
4801 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004802 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004803 OptSpecifier VectorizeAliasOption =
4804 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004805 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004806 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004807 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004808
Chad Rosier136d67d2014-04-28 19:30:57 +00004809 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004810 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004811 OptSpecifier SLPVectAliasOption =
4812 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004813 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004814 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004815 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004816
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004817 // -fno-slp-vectorize-aggressive is default.
4818 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004819 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004820 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004821
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004822 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4823 A->render(Args, CmdArgs);
4824
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004825 // -fdollars-in-identifiers default varies depending on platform and
4826 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004827 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004828 options::OPT_fno_dollars_in_identifiers)) {
4829 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004830 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004831 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004832 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004833 }
4834
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004835 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4836 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004837 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004838 options::OPT_fno_unit_at_a_time)) {
4839 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004840 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004841 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004842
Eli Friedman055c9702011-11-02 01:53:16 +00004843 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4844 options::OPT_fno_apple_pragma_pack, false))
4845 CmdArgs.push_back("-fapple-pragma-pack");
4846
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004847 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004848 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4849 // by default.
4850 if (getToolChain().getArch() == llvm::Triple::le32) {
4851 CmdArgs.push_back("-fno-math-builtin");
4852 }
4853
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004854// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4855//
4856// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004857#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004858 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004859 (getToolChain().getArch() == llvm::Triple::arm ||
4860 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004861 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4862 CmdArgs.push_back("-fno-builtin-strcat");
4863 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4864 CmdArgs.push_back("-fno-builtin-strcpy");
4865 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004866#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004867
Justin Bognera88f0122014-06-20 22:59:50 +00004868 // Enable rewrite includes if the user's asked for it or if we're generating
4869 // diagnostics.
4870 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4871 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004872 if (Args.hasFlag(options::OPT_frewrite_includes,
4873 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004874 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004875 CmdArgs.push_back("-frewrite-includes");
4876
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004877 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004878 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004879 options::OPT_traditional_cpp)) {
4880 if (isa<PreprocessJobAction>(JA))
4881 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004882 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004883 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004884 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004885
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004886 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004887 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004888
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004889 // Handle serialized diagnostics.
4890 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4891 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004892 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004893 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004894
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004895 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4896 CmdArgs.push_back("-fretain-comments-from-system-headers");
4897
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004898 // Forward -fcomment-block-commands to -cc1.
4899 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004900 // Forward -fparse-all-comments to -cc1.
4901 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004902
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004903 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4904 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004905 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00004906 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
4907 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004908
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004909 // We translate this by hand to the -cc1 argument, since nightly test uses
4910 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00004911 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004912 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004913 } else
Sean Silva14facf32015-06-09 01:57:17 +00004914 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004915 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004916
Bob Wilson23a55f12014-12-21 07:00:00 +00004917 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00004918 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
4919 // by the frontend.
4920 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
4921 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00004922
Daniel Dunbard67a3222009-03-30 06:36:42 +00004923 if (Output.getType() == types::TY_Dependencies) {
4924 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004925 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004926 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004927 CmdArgs.push_back(Output.getFilename());
4928 } else {
4929 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004930 }
4931
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004932 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004933
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004934 if (Input.isFilename())
4935 CmdArgs.push_back(Input.getFilename());
4936 else
4937 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004938
Chris Lattnere9d7d782009-11-03 19:50:27 +00004939 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4940
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004941 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004942
4943 // Optionally embed the -cc1 level arguments into the debug info, for build
4944 // analysis.
4945 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004946 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004947 for (const auto &Arg : Args)
4948 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004949
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004950 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004951 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004952 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004953 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00004954 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004955 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004956 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004957 }
4958 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00004959 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004960 }
4961
Eric Christopherd3804002013-02-22 20:12:52 +00004962 // Add the split debug info name to the command lines here so we
4963 // can propagate it to the backend.
4964 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004965 getToolChain().getTriple().isOSLinux() &&
4966 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4967 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004968 const char *SplitDwarfOut;
4969 if (SplitDwarf) {
4970 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00004971 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00004972 CmdArgs.push_back(SplitDwarfOut);
4973 }
4974
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004975 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
4976 // Include them with -fcuda-include-gpubinary.
4977 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00004978 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004979 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00004980 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004981 }
4982
Eric Christopherd3804002013-02-22 20:12:52 +00004983 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004984 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004985 Output.getType() == types::TY_Object &&
4986 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004987 auto CLCommand =
4988 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00004989 C.addCommand(llvm::make_unique<FallbackCommand>(
4990 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004991 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00004992 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004993 }
4994
Eric Christopherf1545832013-02-22 23:50:16 +00004995 // Handle the debug info splitting at object creation time if we're
4996 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004997 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004998 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004999 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005000
Roman Divacky178e01602011-02-10 16:52:03 +00005001 if (Arg *A = Args.getLastArg(options::OPT_pg))
5002 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005003 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5004 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005005
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005006 // Claim some arguments which clang supports automatically.
5007
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005008 // -fpch-preprocess is used with gcc to add a special marker in the output to
5009 // include the PCH file. Clang's PTH solution is completely transparent, so we
5010 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005011 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005012
Daniel Dunbar17731772009-03-23 19:03:36 +00005013 // Claim some arguments which clang doesn't support, but we don't
5014 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005015 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5016 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005017
Rafael Espindolab0092d72013-09-04 19:37:35 +00005018 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005019 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005020}
5021
John McCall5fb5df92012-06-20 06:18:46 +00005022/// Add options related to the Objective-C runtime/ABI.
5023///
5024/// Returns true if the runtime is non-fragile.
5025ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5026 ArgStringList &cmdArgs,
5027 RewriteKind rewriteKind) const {
5028 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005029 Arg *runtimeArg =
5030 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5031 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005032
5033 // Just forward -fobjc-runtime= to the frontend. This supercedes
5034 // options about fragility.
5035 if (runtimeArg &&
5036 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5037 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005038 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005039 if (runtime.tryParse(value)) {
5040 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005041 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005042 }
5043
5044 runtimeArg->render(args, cmdArgs);
5045 return runtime;
5046 }
5047
5048 // Otherwise, we'll need the ABI "version". Version numbers are
5049 // slightly confusing for historical reasons:
5050 // 1 - Traditional "fragile" ABI
5051 // 2 - Non-fragile ABI, version 1
5052 // 3 - Non-fragile ABI, version 2
5053 unsigned objcABIVersion = 1;
5054 // If -fobjc-abi-version= is present, use that to set the version.
5055 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005056 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005057 if (value == "1")
5058 objcABIVersion = 1;
5059 else if (value == "2")
5060 objcABIVersion = 2;
5061 else if (value == "3")
5062 objcABIVersion = 3;
5063 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005064 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005065 } else {
5066 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005067 bool nonFragileABIIsDefault =
5068 (rewriteKind == RK_NonFragile ||
5069 (rewriteKind == RK_None &&
5070 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005071 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5072 options::OPT_fno_objc_nonfragile_abi,
5073 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005074// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005075#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5076 unsigned nonFragileABIVersion = 1;
5077#else
5078 unsigned nonFragileABIVersion = 2;
5079#endif
5080
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005081 if (Arg *abiArg =
5082 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005083 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005084 if (value == "1")
5085 nonFragileABIVersion = 1;
5086 else if (value == "2")
5087 nonFragileABIVersion = 2;
5088 else
5089 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005090 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005091 }
5092
5093 objcABIVersion = 1 + nonFragileABIVersion;
5094 } else {
5095 objcABIVersion = 1;
5096 }
5097 }
5098
5099 // We don't actually care about the ABI version other than whether
5100 // it's non-fragile.
5101 bool isNonFragile = objcABIVersion != 1;
5102
5103 // If we have no runtime argument, ask the toolchain for its default runtime.
5104 // However, the rewriter only really supports the Mac runtime, so assume that.
5105 ObjCRuntime runtime;
5106 if (!runtimeArg) {
5107 switch (rewriteKind) {
5108 case RK_None:
5109 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5110 break;
5111 case RK_Fragile:
5112 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5113 break;
5114 case RK_NonFragile:
5115 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5116 break;
5117 }
5118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005119 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005120 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5121 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005122 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005123 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5124
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005125 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005126 } else {
5127 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5128 }
5129
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005130 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005131 } else {
5132 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005133 // Legacy behaviour is to target the gnustep runtime if we are i
5134 // non-fragile mode or the GCC runtime in fragile mode.
5135 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005136 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005137 else
5138 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005139 }
5140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005141 cmdArgs.push_back(
5142 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005143 return runtime;
5144}
5145
Reid Klecknerc542d372014-06-27 17:02:02 +00005146static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5147 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5148 I += HaveDash;
5149 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005150}
Reid Klecknerc542d372014-06-27 17:02:02 +00005151
5152struct EHFlags {
5153 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5154 bool Synch;
5155 bool Asynch;
5156 bool NoExceptC;
5157};
5158
5159/// /EH controls whether to run destructor cleanups when exceptions are
5160/// thrown. There are three modifiers:
5161/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5162/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5163/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5164/// - c: Assume that extern "C" functions are implicitly noexcept. This
5165/// modifier is an optimization, so we ignore it for now.
5166/// The default is /EHs-c-, meaning cleanups are disabled.
5167static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5168 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005169
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005170 std::vector<std::string> EHArgs =
5171 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005172 for (auto EHVal : EHArgs) {
5173 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5174 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005175 case 'a':
5176 EH.Asynch = maybeConsumeDash(EHVal, I);
5177 continue;
5178 case 'c':
5179 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5180 continue;
5181 case 's':
5182 EH.Synch = maybeConsumeDash(EHVal, I);
5183 continue;
5184 default:
5185 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005186 }
5187 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5188 break;
5189 }
5190 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005191
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005192 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5193 // can use -Xclang to manually enable C++ EH until then.
5194 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005195
Reid Klecknerc542d372014-06-27 17:02:02 +00005196 return EH;
5197}
5198
Hans Wennborg75958c42013-08-08 00:17:41 +00005199void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5200 unsigned RTOptionID = options::OPT__SLASH_MT;
5201
Hans Wennborgf1a74252013-09-10 20:18:04 +00005202 if (Args.hasArg(options::OPT__SLASH_LDd))
5203 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5204 // but defining _DEBUG is sticky.
5205 RTOptionID = options::OPT__SLASH_MTd;
5206
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005207 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005208 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005209
David Majnemere2afb472015-07-24 06:49:13 +00005210 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005211 switch (RTOptionID) {
5212 case options::OPT__SLASH_MD:
5213 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005214 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005215 CmdArgs.push_back("-D_MT");
5216 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005217 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005218 break;
5219 case options::OPT__SLASH_MDd:
5220 CmdArgs.push_back("-D_DEBUG");
5221 CmdArgs.push_back("-D_MT");
5222 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005223 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005224 break;
5225 case options::OPT__SLASH_MT:
5226 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005227 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005228 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005229 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005230 break;
5231 case options::OPT__SLASH_MTd:
5232 CmdArgs.push_back("-D_DEBUG");
5233 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005234 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005235 break;
5236 default:
5237 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005238 }
5239
David Majnemere2afb472015-07-24 06:49:13 +00005240 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5241 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5242 } else {
5243 CmdArgs.push_back(FlagForCRT.data());
5244
5245 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5246 // users want. The /Za flag to cl.exe turns this off, but it's not
5247 // implemented in clang.
5248 CmdArgs.push_back("--dependent-lib=oldnames");
5249 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005250
Hans Wennborg8858a032014-07-21 23:42:07 +00005251 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5252 // would produce interleaved output, so ignore /showIncludes in such cases.
5253 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5254 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5255 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005256
David Majnemerf6072342014-07-01 22:24:56 +00005257 // This controls whether or not we emit RTTI data for polymorphic types.
5258 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5259 /*default=*/false))
5260 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005261
Reid Klecknerc542d372014-06-27 17:02:02 +00005262 const Driver &D = getToolChain().getDriver();
5263 EHFlags EH = parseClangCLEHFlags(D, Args);
5264 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005265 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005266 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005267 CmdArgs.push_back("-fexceptions");
5268 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005269
Hans Wennborge50cec32014-06-13 20:59:54 +00005270 // /EP should expand to -E -P.
5271 if (Args.hasArg(options::OPT__SLASH_EP)) {
5272 CmdArgs.push_back("-E");
5273 CmdArgs.push_back("-P");
5274 }
5275
David Majnemera5b195a2015-02-14 01:35:12 +00005276 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005277 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5278 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005279 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5280 else
5281 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5282
5283 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5284 VolatileOptionID = A->getOption().getID();
5285
5286 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5287 CmdArgs.push_back("-fms-volatile");
5288
David Majnemer86c318f2014-02-11 21:05:00 +00005289 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5290 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5291 if (MostGeneralArg && BestCaseArg)
5292 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5293 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5294
5295 if (MostGeneralArg) {
5296 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5297 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5298 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5299
5300 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5301 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5302 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5303 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5304 << FirstConflict->getAsString(Args)
5305 << SecondConflict->getAsString(Args);
5306
5307 if (SingleArg)
5308 CmdArgs.push_back("-fms-memptr-rep=single");
5309 else if (MultipleArg)
5310 CmdArgs.push_back("-fms-memptr-rep=multiple");
5311 else
5312 CmdArgs.push_back("-fms-memptr-rep=virtual");
5313 }
5314
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005315 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5316 A->render(Args, CmdArgs);
5317
Hans Wennborg81f74482013-09-10 01:07:07 +00005318 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5319 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005320 if (Args.hasArg(options::OPT__SLASH_fallback))
5321 CmdArgs.push_back("msvc-fallback");
5322 else
5323 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005324 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005325}
5326
Douglas Katzman95354292015-06-23 20:42:09 +00005327visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005328 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005329 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005330 return CLFallback.get();
5331}
5332
Daniel Sanders7f933f42015-01-30 17:35:23 +00005333void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5334 ArgStringList &CmdArgs) const {
5335 StringRef CPUName;
5336 StringRef ABIName;
5337 const llvm::Triple &Triple = getToolChain().getTriple();
5338 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5339
5340 CmdArgs.push_back("-target-abi");
5341 CmdArgs.push_back(ABIName.data());
5342}
5343
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005344void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005345 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005346 const ArgList &Args,
5347 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005348 ArgStringList CmdArgs;
5349
5350 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5351 const InputInfo &Input = Inputs[0];
5352
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005353 // Don't warn about "clang -w -c foo.s"
5354 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005355 // and "clang -emit-llvm -c foo.s"
5356 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005357
Rafael Espindola577637a2015-01-03 00:06:04 +00005358 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005359
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005360 // Invoke ourselves in -cc1as mode.
5361 //
5362 // FIXME: Implement custom jobs for internal actions.
5363 CmdArgs.push_back("-cc1as");
5364
5365 // Add the "effective" target triple.
5366 CmdArgs.push_back("-triple");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005367 std::string TripleStr =
5368 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005369 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5370
5371 // Set the output mode, we currently only expect to be used as a real
5372 // assembler.
5373 CmdArgs.push_back("-filetype");
5374 CmdArgs.push_back("obj");
5375
Eric Christopher45f2e712012-12-18 00:31:10 +00005376 // Set the main file name, so that debug info works even with
5377 // -save-temps or preprocessed assembly.
5378 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005379 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005380
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005381 // Add the target cpu
John Brawn94fd9632015-05-21 12:19:49 +00005382 const llvm::Triple Triple(TripleStr);
Renato Golin7c542b42015-07-27 23:44:45 +00005383 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005384 if (!CPU.empty()) {
5385 CmdArgs.push_back("-target-cpu");
5386 CmdArgs.push_back(Args.MakeArgString(CPU));
5387 }
5388
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005389 // Add the target features
5390 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005391 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005392
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005393 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005394 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005395
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005396 // Pass along any -I options so we get proper .include search paths.
5397 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5398
Eric Christopherfc3ee562012-01-10 00:38:01 +00005399 // Determine the original source input.
5400 const Action *SourceAction = &JA;
5401 while (SourceAction->getKind() != Action::InputClass) {
5402 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5403 SourceAction = SourceAction->getInputs()[0];
5404 }
5405
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005406 // Forward -g and handle debug info related flags, assuming we are dealing
5407 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005408 if (SourceAction->getType() == types::TY_Asm ||
5409 SourceAction->getType() == types::TY_PP_Asm) {
5410 Args.ClaimAllArgs(options::OPT_g_Group);
5411 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5412 if (!A->getOption().matches(options::OPT_g0))
5413 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005414
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005415 if (Args.hasArg(options::OPT_gdwarf_2))
5416 CmdArgs.push_back("-gdwarf-2");
5417 if (Args.hasArg(options::OPT_gdwarf_3))
5418 CmdArgs.push_back("-gdwarf-3");
5419 if (Args.hasArg(options::OPT_gdwarf_4))
5420 CmdArgs.push_back("-gdwarf-4");
5421
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005422 // Add the -fdebug-compilation-dir flag if needed.
5423 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005424
5425 // Set the AT_producer to the clang version when using the integrated
5426 // assembler on assembly source files.
5427 CmdArgs.push_back("-dwarf-debug-producer");
5428 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005429
5430 // And pass along -I options
5431 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005432 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005433
5434 // Optionally embed the -cc1as level arguments into the debug info, for build
5435 // analysis.
5436 if (getToolChain().UseDwarfDebugFlags()) {
5437 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005438 for (const auto &Arg : Args)
5439 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005440
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005441 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005442 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5443 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005444 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005445 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005446 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005447 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005448 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005449 }
5450 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005451 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005452 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005453
5454 // FIXME: Add -static support, once we have it.
5455
Daniel Sanders7f933f42015-01-30 17:35:23 +00005456 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005457 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005458 default:
5459 break;
5460
5461 case llvm::Triple::mips:
5462 case llvm::Triple::mipsel:
5463 case llvm::Triple::mips64:
5464 case llvm::Triple::mips64el:
5465 AddMIPSTargetArgs(Args, CmdArgs);
5466 break;
5467 }
5468
David Blaikie372d9502014-01-17 03:17:40 +00005469 // Consume all the warning flags. Usually this would be handled more
5470 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5471 // doesn't handle that so rather than warning about unused flags that are
5472 // actually used, we'll lie by omission instead.
5473 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005474 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5475 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005476
David Blaikie9260ed62013-07-25 21:19:01 +00005477 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5478 getToolChain().getDriver());
5479
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005480 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005481
5482 assert(Output.isFilename() && "Unexpected lipo output.");
5483 CmdArgs.push_back("-o");
5484 CmdArgs.push_back(Output.getFilename());
5485
Daniel Dunbarb440f562010-08-02 02:38:21 +00005486 assert(Input.isFilename() && "Invalid input.");
5487 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005488
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005489 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005490 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005491
5492 // Handle the debug info splitting at object creation time if we're
5493 // creating an object.
5494 // TODO: Currently only works on linux with newer objcopy.
5495 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005496 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005497 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005498 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005499}
5500
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005501void GnuTool::anchor() {}
5502
Daniel Dunbara3246a02009-03-18 08:07:30 +00005503void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005504 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005505 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005506 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005507 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005508 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005509
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005510 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005511 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005512 // Don't forward any -g arguments to assembly steps.
5513 if (isa<AssembleJobAction>(JA) &&
5514 A->getOption().matches(options::OPT_g_Group))
5515 continue;
5516
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005517 // Don't forward any -W arguments to assembly and link steps.
5518 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5519 A->getOption().matches(options::OPT_W_Group))
5520 continue;
5521
Daniel Dunbar2da02722009-03-19 07:55:12 +00005522 // It is unfortunate that we have to claim here, as this means
5523 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005524 // platforms using a generic gcc, even if we are just using gcc
5525 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005526 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005527 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005528 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005529 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005530
Daniel Dunbar4e295052010-01-25 22:35:08 +00005531 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005532
5533 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005534 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005535 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005536 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005537 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005538 }
5539
Daniel Dunbar5716d872009-05-02 21:41:52 +00005540 // Try to force gcc to match the tool chain we want, if we recognize
5541 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005542 //
5543 // FIXME: The triple class should directly provide the information we want
5544 // here.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005545 const llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005546 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005547 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005548 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5549 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005550 CmdArgs.push_back("-m64");
5551
Daniel Dunbarb440f562010-08-02 02:38:21 +00005552 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005553 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005554 CmdArgs.push_back(Output.getFilename());
5555 } else {
5556 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005557 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005558 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005559
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005560 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005561
5562 // Only pass -x if gcc will understand it; otherwise hope gcc
5563 // understands the suffix correctly. The main use case this would go
5564 // wrong in is for linker inputs if they happened to have an odd
5565 // suffix; really the only way to get this to happen is a command
5566 // like '-x foobar a.c' which will treat a.c like a linker input.
5567 //
5568 // FIXME: For the linker case specifically, can we safely convert
5569 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005570 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005571 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005572 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5573 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005574 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005575 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005576 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005578 else if (II.getType() == types::TY_ModuleFile)
5579 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005580 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005581
Daniel Dunbara3246a02009-03-18 08:07:30 +00005582 if (types::canTypeBeUserSpecified(II.getType())) {
5583 CmdArgs.push_back("-x");
5584 CmdArgs.push_back(types::getTypeName(II.getType()));
5585 }
5586
Daniel Dunbarb440f562010-08-02 02:38:21 +00005587 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005588 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005589 else {
5590 const Arg &A = II.getInputArg();
5591
5592 // Reverse translate some rewritten options.
5593 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5594 CmdArgs.push_back("-lstdc++");
5595 continue;
5596 }
5597
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005598 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005599 A.render(Args, CmdArgs);
5600 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005601 }
5602
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005603 const std::string customGCCName = D.getCCCGenericGCCName();
5604 const char *GCCName;
5605 if (!customGCCName.empty())
5606 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005607 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005608 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005609 } else
5610 GCCName = "gcc";
5611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005612 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005613 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005614}
5615
Douglas Katzman95354292015-06-23 20:42:09 +00005616void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5617 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005618 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005619}
5620
Douglas Katzman95354292015-06-23 20:42:09 +00005621void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5622 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005623 const Driver &D = getToolChain().getDriver();
5624
Eric Christophercc7ff502015-01-29 00:56:17 +00005625 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005626 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005627 case types::TY_LLVM_IR:
5628 case types::TY_LTO_IR:
5629 case types::TY_LLVM_BC:
5630 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005631 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005632 break;
5633 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005634 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005635 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005636 case types::TY_Nothing:
5637 CmdArgs.push_back("-fsyntax-only");
5638 break;
5639 default:
5640 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005641 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005642}
5643
Douglas Katzman95354292015-06-23 20:42:09 +00005644void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5645 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005646 // The types are (hopefully) good enough.
5647}
5648
Tony Linthicum76329bf2011-12-12 21:14:55 +00005649// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005650void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5651 ArgStringList &CmdArgs) const {}
5652void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5653 const InputInfo &Output,
5654 const InputInfoList &Inputs,
5655 const ArgList &Args,
5656 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005657 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005658
5659 const Driver &D = getToolChain().getDriver();
5660 ArgStringList CmdArgs;
5661
5662 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005663 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005664 CmdArgs.push_back(Args.MakeArgString(MarchString));
5665
5666 RenderExtraToolArgs(JA, CmdArgs);
5667
5668 if (Output.isFilename()) {
5669 CmdArgs.push_back("-o");
5670 CmdArgs.push_back(Output.getFilename());
5671 } else {
5672 assert(Output.isNothing() && "Unexpected output");
5673 CmdArgs.push_back("-fsyntax-only");
5674 }
5675
Douglas Katzman54366072015-07-27 16:53:08 +00005676 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005677 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005678
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005679 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005680
Tony Linthicum76329bf2011-12-12 21:14:55 +00005681 // Only pass -x if gcc will understand it; otherwise hope gcc
5682 // understands the suffix correctly. The main use case this would go
5683 // wrong in is for linker inputs if they happened to have an odd
5684 // suffix; really the only way to get this to happen is a command
5685 // like '-x foobar a.c' which will treat a.c like a linker input.
5686 //
5687 // FIXME: For the linker case specifically, can we safely convert
5688 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005689 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005690 // Don't try to pass LLVM or AST inputs to a generic gcc.
5691 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5692 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5693 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005694 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005695 else if (II.getType() == types::TY_AST)
5696 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005697 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005698 else if (II.getType() == types::TY_ModuleFile)
5699 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005700 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005701
5702 if (II.isFilename())
5703 CmdArgs.push_back(II.getFilename());
5704 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005705 // Don't render as input, we need gcc to do the translations.
5706 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005707 II.getInputArg().render(Args, CmdArgs);
5708 }
5709
5710 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005711 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005712 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005713}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005714
Douglas Katzman95354292015-06-23 20:42:09 +00005715void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5716 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005717 // The types are (hopefully) good enough.
5718}
5719
Douglas Katzman54366072015-07-27 16:53:08 +00005720static void
5721constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5722 const toolchains::HexagonToolChain &ToolChain,
5723 const InputInfo &Output, const InputInfoList &Inputs,
5724 const ArgList &Args, ArgStringList &CmdArgs,
5725 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005726
Matthew Curtise689b052012-12-06 15:46:07 +00005727 const Driver &D = ToolChain.getDriver();
5728
Matthew Curtise689b052012-12-06 15:46:07 +00005729 //----------------------------------------------------------------------------
5730 //
5731 //----------------------------------------------------------------------------
5732 bool hasStaticArg = Args.hasArg(options::OPT_static);
5733 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005734 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005735 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5736 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5737 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005738 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005739 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005740
Matthew Curtise689b052012-12-06 15:46:07 +00005741 //----------------------------------------------------------------------------
5742 // Silence warnings for various options
5743 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005744
Matthew Curtise689b052012-12-06 15:46:07 +00005745 Args.ClaimAllArgs(options::OPT_g_Group);
5746 Args.ClaimAllArgs(options::OPT_emit_llvm);
5747 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5748 // handled somewhere else.
5749 Args.ClaimAllArgs(options::OPT_static_libgcc);
5750
5751 //----------------------------------------------------------------------------
5752 //
5753 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005754 for (const auto &Opt : ToolChain.ExtraOpts)
5755 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005756
Douglas Katzman54366072015-07-27 16:53:08 +00005757 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005758 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005759
Matthew Curtise689b052012-12-06 15:46:07 +00005760 if (buildingLib) {
5761 CmdArgs.push_back("-shared");
5762 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5763 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005764 }
5765
Matthew Curtise689b052012-12-06 15:46:07 +00005766 if (hasStaticArg)
5767 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005768
Matthew Curtise8f80a12012-12-06 17:49:03 +00005769 if (buildPIE && !buildingLib)
5770 CmdArgs.push_back("-pie");
5771
Douglas Katzman54366072015-07-27 16:53:08 +00005772 if (const char *v =
5773 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005774 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005775 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005776 }
5777
Matthew Curtise689b052012-12-06 15:46:07 +00005778 //----------------------------------------------------------------------------
5779 //
5780 //----------------------------------------------------------------------------
5781 CmdArgs.push_back("-o");
5782 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005783
Matthew Curtise689b052012-12-06 15:46:07 +00005784 const std::string MarchSuffix = "/" + MarchString;
5785 const std::string G0Suffix = "/G0";
5786 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005787 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005788 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005789 const std::string StartFilesDir =
5790 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005791
5792 //----------------------------------------------------------------------------
5793 // moslib
5794 //----------------------------------------------------------------------------
5795 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005796 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005797
Sean Silva14facf32015-06-09 01:57:17 +00005798 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5799 A->claim();
5800 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005801 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005802 }
Matthew Curtise689b052012-12-06 15:46:07 +00005803 if (oslibs.empty()) {
5804 oslibs.push_back("standalone");
5805 hasStandalone = true;
5806 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005807
Matthew Curtise689b052012-12-06 15:46:07 +00005808 //----------------------------------------------------------------------------
5809 // Start Files
5810 //----------------------------------------------------------------------------
5811 if (incStdLib && incStartFiles) {
5812
5813 if (!buildingLib) {
5814 if (hasStandalone) {
5815 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005816 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005817 }
5818 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5819 }
5820 std::string initObj = useShared ? "/initS.o" : "/init.o";
5821 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5822 }
5823
5824 //----------------------------------------------------------------------------
5825 // Library Search Paths
5826 //----------------------------------------------------------------------------
5827 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005828 for (const auto &LibPath : LibPaths)
5829 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005830
5831 //----------------------------------------------------------------------------
5832 //
5833 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005834 Args.AddAllArgs(CmdArgs,
5835 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5836 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005837
5838 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5839
5840 //----------------------------------------------------------------------------
5841 // Libraries
5842 //----------------------------------------------------------------------------
5843 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005844 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005845 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5846 CmdArgs.push_back("-lm");
5847 }
5848
5849 CmdArgs.push_back("--start-group");
5850
5851 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00005852 for (const std::string &Lib : oslibs)
5853 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00005854 CmdArgs.push_back("-lc");
5855 }
5856 CmdArgs.push_back("-lgcc");
5857
5858 CmdArgs.push_back("--end-group");
5859 }
5860
5861 //----------------------------------------------------------------------------
5862 // End files
5863 //----------------------------------------------------------------------------
5864 if (incStdLib && incStartFiles) {
5865 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5866 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5867 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005868}
5869
Douglas Katzman95354292015-06-23 20:42:09 +00005870void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5871 const InputInfo &Output,
5872 const InputInfoList &Inputs,
5873 const ArgList &Args,
5874 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005875
Douglas Katzman54366072015-07-27 16:53:08 +00005876 const toolchains::HexagonToolChain &ToolChain =
5877 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00005878
5879 ArgStringList CmdArgs;
5880 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
5881 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00005882
5883 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005884 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00005885 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005886}
5887// Hexagon tools end.
5888
Tom Stellard8fa33092015-07-18 01:49:05 +00005889void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
5890 const InputInfo &Output,
5891 const InputInfoList &Inputs,
5892 const ArgList &Args,
5893 const char *LinkingOutput) const {
5894
5895 std::string Linker = getToolChain().GetProgramPath(getShortName());
5896 ArgStringList CmdArgs;
5897 CmdArgs.push_back("-flavor");
5898 CmdArgs.push_back("gnu");
5899 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00005900 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00005901 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5902 CmdArgs.push_back("-o");
5903 CmdArgs.push_back(Output.getFilename());
5904 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5905 CmdArgs, Inputs));
5906}
5907// AMDGPU tools end.
5908
Renato Golin7c542b42015-07-27 23:44:45 +00005909const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005910 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00005911 if (!Arch.empty())
5912 MArch = Arch;
5913 else
Bernard Ogden31561762013-12-12 13:27:11 +00005914 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00005915 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00005916
5917 // Handle -march=native.
5918 if (MArch == "native") {
5919 std::string CPU = llvm::sys::getHostCPUName();
5920 if (CPU != "generic") {
5921 // Translate the native cpu into the architecture suffix for that CPU.
5922 const char *Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
5923 // If there is no valid architecture suffix for this CPU we don't know how
5924 // to handle it, so return no architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005925 if (strcmp(Suffix, "") == 0)
John Brawn94fd9632015-05-21 12:19:49 +00005926 MArch = "";
5927 else
5928 MArch = std::string("arm") + Suffix;
5929 }
5930 }
5931
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005932 return MArch;
5933}
5934/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005935const char *arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00005936 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00005937 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
5938 // here means an -march=native that we can't handle, so instead return no CPU.
5939 if (MArch.empty())
5940 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005941
John Brawna95c1a82015-05-08 12:52:18 +00005942 // We need to return an empty string here on invalid MArch values as the
5943 // various places that call this function can't cope with a null result.
5944 const char *result = Triple.getARMCPUForArch(MArch);
5945 if (result)
5946 return result;
5947 else
5948 return "";
Bernard Ogden31561762013-12-12 13:27:11 +00005949}
5950
5951/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00005952std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005953 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005954 // FIXME: Warn on inconsistent use of -mcpu and -march.
5955 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00005956 if (!CPU.empty()) {
5957 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00005958 // Handle -mcpu=native.
5959 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005960 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005961 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005962 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005963 }
5964
Renato Goline17c5802015-07-27 23:44:42 +00005965 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00005966}
5967
5968/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005969/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00005970// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005971const char *arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Artyom Skrobov902ac2d2015-06-04 21:31:41 +00005972 if (CPU == "generic" &&
5973 llvm::ARMTargetParser::parseArch(Arch) == llvm::ARM::AK_ARMV8_1A)
5974 return "v8.1a";
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005975
Renato Golin3c007252015-05-28 15:05:53 +00005976 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
5977 if (ArchKind == llvm::ARM::AK_INVALID)
5978 return "";
5979 return llvm::ARMTargetParser::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00005980}
5981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005982void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00005983 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005984 if (Args.hasArg(options::OPT_r))
5985 return;
5986
John Brawn94fd9632015-05-21 12:19:49 +00005987 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
5988 // to generate BE-8 executables.
5989 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
5990 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005991}
5992
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00005993mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
5994 return (NanEncoding)llvm::StringSwitch<int>(CPU)
5995 .Case("mips1", NanLegacy)
5996 .Case("mips2", NanLegacy)
5997 .Case("mips3", NanLegacy)
5998 .Case("mips4", NanLegacy)
5999 .Case("mips5", NanLegacy)
6000 .Case("mips32", NanLegacy)
6001 .Case("mips32r2", NanLegacy)
6002 .Case("mips32r3", NanLegacy | Nan2008)
6003 .Case("mips32r5", NanLegacy | Nan2008)
6004 .Case("mips32r6", Nan2008)
6005 .Case("mips64", NanLegacy)
6006 .Case("mips64r2", NanLegacy)
6007 .Case("mips64r3", NanLegacy | Nan2008)
6008 .Case("mips64r5", NanLegacy | Nan2008)
6009 .Case("mips64r6", Nan2008)
6010 .Default(NanLegacy);
6011}
6012
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006013bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6014 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6015 return A && (A->getValue() == StringRef(Value));
6016}
6017
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006018bool mips::isUCLibc(const ArgList &Args) {
6019 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006020 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006021}
6022
Daniel Sanders2bf13662014-07-10 14:40:57 +00006023bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006024 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6025 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006026 .Case("2008", true)
6027 .Case("legacy", false)
6028 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006029
6030 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006031 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006032 .Cases("mips32r6", "mips64r6", true)
6033 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006034
6035 return false;
6036}
6037
Daniel Sanders379d44b2014-07-16 11:52:23 +00006038bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006039 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006040 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006041 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006042 return false;
6043
6044 if (ABIName != "32")
6045 return false;
6046
Toma Tabacu94ea6862015-06-16 13:54:13 +00006047 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6048 // present.
6049 if (FloatABI == "soft")
6050 return false;
6051
Daniel Sanders379d44b2014-07-16 11:52:23 +00006052 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006053 .Cases("mips2", "mips3", "mips4", "mips5", true)
6054 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6055 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6056 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006057}
6058
Toma Tabacu94ea6862015-06-16 13:54:13 +00006059bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6060 StringRef CPUName, StringRef ABIName,
6061 StringRef FloatABI) {
6062 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6063
6064 // FPXX shouldn't be used if -msingle-float is present.
6065 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6066 options::OPT_mdouble_float))
6067 if (A->getOption().matches(options::OPT_msingle_float))
6068 UseFPXX = false;
6069
6070 return UseFPXX;
6071}
6072
Tim Northover157d9112014-01-16 08:48:16 +00006073llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006074 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6075 // archs which Darwin doesn't use.
6076
6077 // The matching this routine does is fairly pointless, since it is neither the
6078 // complete architecture list, nor a reasonable subset. The problem is that
6079 // historically the driver driver accepts this and also ties its -march=
6080 // handling to the architecture name, so we need to be careful before removing
6081 // support for it.
6082
6083 // This code must be kept in sync with Clang's Darwin specific argument
6084 // translation.
6085
6086 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006087 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6088 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6089 .Case("ppc64", llvm::Triple::ppc64)
6090 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6091 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6092 llvm::Triple::x86)
6093 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6094 // This is derived from the driver driver.
6095 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6096 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6097 .Cases("armv7s", "xscale", llvm::Triple::arm)
6098 .Case("arm64", llvm::Triple::aarch64)
6099 .Case("r600", llvm::Triple::r600)
6100 .Case("amdgcn", llvm::Triple::amdgcn)
6101 .Case("nvptx", llvm::Triple::nvptx)
6102 .Case("nvptx64", llvm::Triple::nvptx64)
6103 .Case("amdil", llvm::Triple::amdil)
6104 .Case("spir", llvm::Triple::spir)
6105 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006106}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006107
Tim Northover157d9112014-01-16 08:48:16 +00006108void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006109 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006110 T.setArch(Arch);
6111
6112 if (Str == "x86_64h")
6113 T.setArchName(Str);
6114 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6115 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006116 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006117 }
6118}
6119
Bob Wilsondecc03e2012-11-23 06:14:39 +00006120const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006121 const InputInfo &Input) {
6122 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006123}
6124
Bob Wilsondecc03e2012-11-23 06:14:39 +00006125const char *Clang::getBaseInputStem(const ArgList &Args,
6126 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006127 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006128
Chris Lattner906bb902011-01-16 08:14:11 +00006129 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006130 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006131
6132 return Str;
6133}
6134
Bob Wilsondecc03e2012-11-23 06:14:39 +00006135const char *Clang::getDependencyFileName(const ArgList &Args,
6136 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006137 // FIXME: Think about this more.
6138 std::string Res;
6139
6140 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006141 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006142 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006143 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006144 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006145 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006146 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006147}
6148
Douglas Katzman95354292015-06-23 20:42:09 +00006149void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6150 const InputInfo &Output,
6151 const InputInfoList &Inputs,
6152 const ArgList &Args,
6153 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006154 const ToolChain &ToolChain = getToolChain();
6155 const Driver &D = ToolChain.getDriver();
6156 ArgStringList CmdArgs;
6157
6158 // Silence warning for "clang -g foo.o -o foo"
6159 Args.ClaimAllArgs(options::OPT_g_Group);
6160 // and "clang -emit-llvm foo.o -o foo"
6161 Args.ClaimAllArgs(options::OPT_emit_llvm);
6162 // and for "clang -w foo.o -o foo". Other warning options are already
6163 // handled somewhere else.
6164 Args.ClaimAllArgs(options::OPT_w);
6165
6166 if (!D.SysRoot.empty())
6167 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6168
6169 // CloudABI only supports static linkage.
6170 CmdArgs.push_back("-Bstatic");
6171 CmdArgs.push_back("--eh-frame-hdr");
6172 CmdArgs.push_back("--gc-sections");
6173
6174 if (Output.isFilename()) {
6175 CmdArgs.push_back("-o");
6176 CmdArgs.push_back(Output.getFilename());
6177 } else {
6178 assert(Output.isNothing() && "Invalid output.");
6179 }
6180
6181 if (!Args.hasArg(options::OPT_nostdlib) &&
6182 !Args.hasArg(options::OPT_nostartfiles)) {
6183 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6184 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6185 }
6186
6187 Args.AddAllArgs(CmdArgs, options::OPT_L);
6188 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6189 for (const auto &Path : Paths)
6190 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006191 Args.AddAllArgs(CmdArgs,
6192 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6193 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006194
Alexey Samsonov907880e2015-06-19 19:57:46 +00006195 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006196 AddGoldPlugin(ToolChain, Args, CmdArgs);
6197
6198 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6199
6200 if (!Args.hasArg(options::OPT_nostdlib) &&
6201 !Args.hasArg(options::OPT_nodefaultlibs)) {
6202 if (D.CCCIsCXX())
6203 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6204 CmdArgs.push_back("-lc");
6205 CmdArgs.push_back("-lcompiler_rt");
6206 }
6207
6208 if (!Args.hasArg(options::OPT_nostdlib) &&
6209 !Args.hasArg(options::OPT_nostartfiles))
6210 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6211
6212 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006213 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006214}
6215
Douglas Katzman95354292015-06-23 20:42:09 +00006216void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6217 const InputInfo &Output,
6218 const InputInfoList &Inputs,
6219 const ArgList &Args,
6220 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006221 ArgStringList CmdArgs;
6222
6223 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6224 const InputInfo &Input = Inputs[0];
6225
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006226 // Determine the original source input.
6227 const Action *SourceAction = &JA;
6228 while (SourceAction->getKind() != Action::InputClass) {
6229 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6230 SourceAction = SourceAction->getInputs()[0];
6231 }
6232
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006233 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006234 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006235 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6236 // FIXME: at run-time detect assembler capabilities or rely on version
6237 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006238 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006239 const llvm::Triple &T(getToolChain().getTriple());
6240 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006241 CmdArgs.push_back("-Q");
6242 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006243
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006244 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006245 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006246 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006247 if (Args.hasArg(options::OPT_gstabs))
6248 CmdArgs.push_back("--gstabs");
6249 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006250 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006251 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006252
Daniel Dunbarbe220842009-03-20 16:06:39 +00006253 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006254 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006255
Daniel Dunbar6d484762010-07-22 01:47:22 +00006256 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006257 if (getToolChain().getArch() == llvm::Triple::x86 ||
6258 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006259 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6260 CmdArgs.push_back("-force_cpusubtype_ALL");
6261
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006262 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006263 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006264 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006265 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006266 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006267 CmdArgs.push_back("-static");
6268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006269 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006270
6271 assert(Output.isFilename() && "Unexpected lipo output.");
6272 CmdArgs.push_back("-o");
6273 CmdArgs.push_back(Output.getFilename());
6274
Daniel Dunbarb440f562010-08-02 02:38:21 +00006275 assert(Input.isFilename() && "Invalid input.");
6276 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006277
6278 // asm_final spec is empty.
6279
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006280 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006281 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006282}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006283
Tim Northover157d9112014-01-16 08:48:16 +00006284void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006285
Tim Northover157d9112014-01-16 08:48:16 +00006286void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6287 ArgStringList &CmdArgs) const {
6288 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006289
Daniel Dunbarc1964212009-03-26 16:23:12 +00006290 // Derived from darwin_arch spec.
6291 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006292 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006293
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006294 // FIXME: Is this needed anymore?
6295 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006296 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006297}
6298
Douglas Katzman95354292015-06-23 20:42:09 +00006299bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006300 // We only need to generate a temp path for LTO if we aren't compiling object
6301 // files. When compiling source files, we run 'dsymutil' after linking. We
6302 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006303 for (const auto &Input : Inputs)
6304 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006305 return true;
6306
6307 return false;
6308}
6309
Douglas Katzman95354292015-06-23 20:42:09 +00006310void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6311 ArgStringList &CmdArgs,
6312 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006313 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006314 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006315
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006316 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006317 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6318 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006319 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6320 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006321 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006322 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006323 }
6324
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006325 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006326 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006327 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6328 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006329
Bob Wilson3d27dad2013-08-02 22:25:34 +00006330 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6331 CmdArgs.push_back("-export_dynamic");
6332
Bob Wilsonb111ec92015-03-02 19:01:14 +00006333 // If we are using App Extension restrictions, pass a flag to the linker
6334 // telling it that the compiled code has been audited.
6335 if (Args.hasFlag(options::OPT_fapplication_extension,
6336 options::OPT_fno_application_extension, false))
6337 CmdArgs.push_back("-application_extension");
6338
Bill Wendling313b6bf2012-11-16 23:03:00 +00006339 // If we are using LTO, then automatically create a temporary file path for
6340 // the linker to use, so that it's lifetime will extend past a possible
6341 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006342 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006343 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006344 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006345 C.addTempFile(TmpPath);
6346 CmdArgs.push_back("-object_path_lto");
6347 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006348 }
6349
Daniel Dunbarc1964212009-03-26 16:23:12 +00006350 // Derived from the "link" spec.
6351 Args.AddAllArgs(CmdArgs, options::OPT_static);
6352 if (!Args.hasArg(options::OPT_static))
6353 CmdArgs.push_back("-dynamic");
6354 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6355 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6356 // here. How do we wish to handle such things?
6357 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006358
Daniel Dunbarc1964212009-03-26 16:23:12 +00006359 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006360 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006361 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006362 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006363
6364 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6365 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6366 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6367
6368 Arg *A;
6369 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6370 (A = Args.getLastArg(options::OPT_current__version)) ||
6371 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006372 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6373 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006374
6375 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6376 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6377 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6378 } else {
6379 CmdArgs.push_back("-dylib");
6380
6381 Arg *A;
6382 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6383 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6384 (A = Args.getLastArg(options::OPT_client__name)) ||
6385 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6386 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6387 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006388 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6389 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006390
Daniel Dunbarc1964212009-03-26 16:23:12 +00006391 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6392 "-dylib_compatibility_version");
6393 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6394 "-dylib_current_version");
6395
Tim Northover157d9112014-01-16 08:48:16 +00006396 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006397
6398 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6399 "-dylib_install_name");
6400 }
6401
6402 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6403 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6404 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006405 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006406 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006407 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6408 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6409 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6410 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6411 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6412 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006413 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006414 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6415 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6416 Args.AddAllArgs(CmdArgs, options::OPT_init);
6417
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006418 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006419 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006420
Daniel Dunbarc1964212009-03-26 16:23:12 +00006421 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6422 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6423 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6424 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6425 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006426
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006427 if (const Arg *A =
6428 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6429 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006430 if (A->getOption().matches(options::OPT_fpie) ||
6431 A->getOption().matches(options::OPT_fPIE))
6432 CmdArgs.push_back("-pie");
6433 else
6434 CmdArgs.push_back("-no_pie");
6435 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006436
6437 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6438 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6439 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6440 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6441 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6442 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6443 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6444 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6445 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6446 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6447 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6448 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6449 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6450 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6451 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6452 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006453
Daniel Dunbar84384642011-05-02 21:03:47 +00006454 // Give --sysroot= preference, over the Apple specific behavior to also use
6455 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006456 StringRef sysroot = C.getSysRoot();
6457 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006458 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006459 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006460 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6461 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006462 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006463 }
6464
Daniel Dunbarc1964212009-03-26 16:23:12 +00006465 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6466 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6467 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6468 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6469 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006470 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006471 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6472 Args.AddAllArgs(CmdArgs, options::OPT_y);
6473 Args.AddLastArg(CmdArgs, options::OPT_w);
6474 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6475 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6476 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6477 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6478 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6479 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6480 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6481 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6482 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6483 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6484 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6485 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6486}
6487
Douglas Katzman95354292015-06-23 20:42:09 +00006488void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6489 const InputInfo &Output,
6490 const InputInfoList &Inputs,
6491 const ArgList &Args,
6492 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006493 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006494
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006495 // If the number of arguments surpasses the system limits, we will encode the
6496 // input files in a separate file, shortening the command line. To this end,
6497 // build a list of input file names that can be passed via a file with the
6498 // -filelist linker option.
6499 llvm::opt::ArgStringList InputFileList;
6500
Daniel Dunbarc1964212009-03-26 16:23:12 +00006501 // The logic here is derived from gcc's behavior; most of which
6502 // comes from specs (starting with link_command). Consult gcc for
6503 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006504 ArgStringList CmdArgs;
6505
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006506 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6507 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6508 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006509 for (const auto &Arg : Args)
6510 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006511 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006512 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006513 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006514 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006515 return;
6516 }
6517
Daniel Dunbarc1964212009-03-26 16:23:12 +00006518 // I'm not sure why this particular decomposition exists in gcc, but
6519 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006520 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006521
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006522 // It seems that the 'e' option is completely ignored for dynamic executables
6523 // (the default), and with static executables, the last one wins, as expected.
6524 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6525 options::OPT_Z_Flag, options::OPT_u_Group,
6526 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006527
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006528 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6529 // members of static archive libraries which implement Objective-C classes or
6530 // categories.
6531 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6532 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006533
Daniel Dunbarc1964212009-03-26 16:23:12 +00006534 CmdArgs.push_back("-o");
6535 CmdArgs.push_back(Output.getFilename());
6536
Chad Rosier06fd3c62012-05-16 23:45:12 +00006537 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006538 !Args.hasArg(options::OPT_nostartfiles))
6539 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006540
Peter Collingbournec4122c12015-06-15 21:08:13 +00006541 // SafeStack requires its own runtime libraries
6542 // These libraries should be linked first, to make sure the
6543 // __safestack_init constructor executes before everything else
6544 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6545 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6546 "libclang_rt.safestack_osx.a",
6547 /*AlwaysLink=*/true);
6548 }
6549
Daniel Dunbarc1964212009-03-26 16:23:12 +00006550 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006551
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006552 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6553 options::OPT_fno_openmp, false)) {
6554 switch (getOpenMPRuntime(getToolChain(), Args)) {
6555 case OMPRT_OMP:
6556 CmdArgs.push_back("-lomp");
6557 break;
6558 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006559 CmdArgs.push_back("-lgomp");
6560 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006561 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006562 CmdArgs.push_back("-liomp5");
6563 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006564 case OMPRT_Unknown:
6565 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006566 break;
6567 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006568 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006569
Douglas Gregor9295df02012-05-15 21:00:27 +00006570 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006571 // Build the input file for -filelist (list of linker input files) in case we
6572 // need it later
6573 for (const auto &II : Inputs) {
6574 if (!II.isFilename()) {
6575 // This is a linker input argument.
6576 // We cannot mix input arguments and file names in a -filelist input, thus
6577 // we prematurely stop our list (remaining files shall be passed as
6578 // arguments).
6579 if (InputFileList.size() > 0)
6580 break;
6581
6582 continue;
6583 }
6584
6585 InputFileList.push_back(II.getFilename());
6586 }
6587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006588 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006589 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006590 // We use arclite library for both ARC and subscripting support.
6591 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6592
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006593 CmdArgs.push_back("-framework");
6594 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006595 // Link libobj.
6596 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006597 }
John McCall31168b02011-06-15 23:02:42 +00006598
Daniel Dunbarc1964212009-03-26 16:23:12 +00006599 if (LinkingOutput) {
6600 CmdArgs.push_back("-arch_multiple");
6601 CmdArgs.push_back("-final_output");
6602 CmdArgs.push_back(LinkingOutput);
6603 }
6604
Daniel Dunbarc1964212009-03-26 16:23:12 +00006605 if (Args.hasArg(options::OPT_fnested_functions))
6606 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006607
Justin Bognerc7701242015-05-12 05:44:36 +00006608 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6609 // paths are different enough from other toolchains that this needs a fair
6610 // amount of refactoring done first.
6611 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6612
Daniel Dunbarc1964212009-03-26 16:23:12 +00006613 if (!Args.hasArg(options::OPT_nostdlib) &&
6614 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006615 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006616 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006617
Daniel Dunbarc1964212009-03-26 16:23:12 +00006618 // link_ssp spec is empty.
6619
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006620 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006621 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006622 }
6623
Chad Rosier06fd3c62012-05-16 23:45:12 +00006624 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006625 !Args.hasArg(options::OPT_nostartfiles)) {
6626 // endfile_spec is empty.
6627 }
6628
6629 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6630 Args.AddAllArgs(CmdArgs, options::OPT_F);
6631
Steven Wu3ffb61b2015-02-06 18:08:29 +00006632 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006633 for (const Arg *A : Args.filtered(options::OPT_iframework))
6634 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006635
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006636 if (!Args.hasArg(options::OPT_nostdlib) &&
6637 !Args.hasArg(options::OPT_nodefaultlibs)) {
6638 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6639 if (A->getValue() == StringRef("Accelerate")) {
6640 CmdArgs.push_back("-framework");
6641 CmdArgs.push_back("Accelerate");
6642 }
6643 }
6644 }
6645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006646 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006647 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006648 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006649 Cmd->setInputFileList(std::move(InputFileList));
6650 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006651}
6652
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006653void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006654 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006655 const InputInfoList &Inputs,
6656 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006657 const char *LinkingOutput) const {
6658 ArgStringList CmdArgs;
6659
6660 CmdArgs.push_back("-create");
6661 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006662
6663 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006664 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006665
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006666 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006667 assert(II.isFilename() && "Unexpected lipo input.");
6668 CmdArgs.push_back(II.getFilename());
6669 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006670
6671 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006672 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006673}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006674
Daniel Dunbar88299622010-06-04 18:28:36 +00006675void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006676 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006677 const InputInfoList &Inputs,
6678 const ArgList &Args,
6679 const char *LinkingOutput) const {
6680 ArgStringList CmdArgs;
6681
Daniel Dunbareb86b042011-05-09 17:23:16 +00006682 CmdArgs.push_back("-o");
6683 CmdArgs.push_back(Output.getFilename());
6684
Daniel Dunbar88299622010-06-04 18:28:36 +00006685 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6686 const InputInfo &Input = Inputs[0];
6687 assert(Input.isFilename() && "Unexpected dsymutil input.");
6688 CmdArgs.push_back(Input.getFilename());
6689
Daniel Dunbar88299622010-06-04 18:28:36 +00006690 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006691 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006692 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006693}
6694
Eric Christopher551ef452011-08-23 17:56:55 +00006695void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006696 const InputInfo &Output,
6697 const InputInfoList &Inputs,
6698 const ArgList &Args,
6699 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006700 ArgStringList CmdArgs;
6701 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006702 CmdArgs.push_back("--debug-info");
6703 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006704 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006705
6706 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6707 const InputInfo &Input = Inputs[0];
6708 assert(Input.isFilename() && "Unexpected verify input");
6709
6710 // Grabbing the output of the earlier dsymutil run.
6711 CmdArgs.push_back(Input.getFilename());
6712
6713 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006714 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006715 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006716}
6717
Douglas Katzman95354292015-06-23 20:42:09 +00006718void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006719 const InputInfo &Output,
6720 const InputInfoList &Inputs,
6721 const ArgList &Args,
6722 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006723 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006724 ArgStringList CmdArgs;
6725
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006726 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006727
6728 CmdArgs.push_back("-o");
6729 CmdArgs.push_back(Output.getFilename());
6730
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006731 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006732 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006733
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006734 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006735 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006736}
6737
Douglas Katzman95354292015-06-23 20:42:09 +00006738void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6739 const InputInfo &Output,
6740 const InputInfoList &Inputs,
6741 const ArgList &Args,
6742 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006743 // FIXME: Find a real GCC, don't hard-code versions here
6744 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6745 const llvm::Triple &T = getToolChain().getTriple();
6746 std::string LibPath = "/usr/lib/";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006747 const llvm::Triple::ArchType Arch = T.getArch();
David Chisnallf571cde2012-02-15 13:39:01 +00006748 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006749 case llvm::Triple::x86:
6750 GCCLibPath +=
6751 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6752 break;
6753 case llvm::Triple::x86_64:
6754 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6755 GCCLibPath += "/4.5.2/amd64/";
6756 LibPath += "amd64/";
6757 break;
6758 default:
6759 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006760 }
6761
6762 ArgStringList CmdArgs;
6763
David Chisnall272a0712012-02-29 15:06:12 +00006764 // Demangle C++ names in errors
6765 CmdArgs.push_back("-C");
6766
David Chisnallf571cde2012-02-15 13:39:01 +00006767 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6768 (!Args.hasArg(options::OPT_shared))) {
6769 CmdArgs.push_back("-e");
6770 CmdArgs.push_back("_start");
6771 }
6772
6773 if (Args.hasArg(options::OPT_static)) {
6774 CmdArgs.push_back("-Bstatic");
6775 CmdArgs.push_back("-dn");
6776 } else {
6777 CmdArgs.push_back("-Bdynamic");
6778 if (Args.hasArg(options::OPT_shared)) {
6779 CmdArgs.push_back("-shared");
6780 } else {
6781 CmdArgs.push_back("--dynamic-linker");
6782 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6783 }
6784 }
6785
6786 if (Output.isFilename()) {
6787 CmdArgs.push_back("-o");
6788 CmdArgs.push_back(Output.getFilename());
6789 } else {
6790 assert(Output.isNothing() && "Invalid output.");
6791 }
6792
6793 if (!Args.hasArg(options::OPT_nostdlib) &&
6794 !Args.hasArg(options::OPT_nostartfiles)) {
6795 if (!Args.hasArg(options::OPT_shared)) {
6796 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6797 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006798 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006799 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6800 } else {
6801 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006802 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6803 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006804 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006805 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006806 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006807 }
6808
6809 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6810
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006811 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6812 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006813
6814 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6815
6816 if (!Args.hasArg(options::OPT_nostdlib) &&
6817 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006818 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006819 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006820 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006821 if (!Args.hasArg(options::OPT_shared)) {
6822 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006823 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006824 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006825 }
David Chisnallf571cde2012-02-15 13:39:01 +00006826 }
6827
6828 if (!Args.hasArg(options::OPT_nostdlib) &&
6829 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006830 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006831 }
David Chisnall96de9932012-02-16 16:00:47 +00006832 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006833
Alexey Samsonov7811d192014-02-20 13:57:37 +00006834 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006836 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006837 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006838}
6839
Douglas Katzman95354292015-06-23 20:42:09 +00006840void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6841 const InputInfo &Output,
6842 const InputInfoList &Inputs,
6843 const ArgList &Args,
6844 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006845 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006846 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006847 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006848
Rafael Espindolacc126272014-02-28 01:55:21 +00006849 switch (getToolChain().getArch()) {
6850 case llvm::Triple::x86:
6851 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6852 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006853 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006854 break;
6855
6856 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006857 CmdArgs.push_back("-mppc");
6858 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006859 break;
6860
6861 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006862 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006863 CmdArgs.push_back("-32");
6864 NeedsKPIC = true;
6865 break;
6866
6867 case llvm::Triple::sparcv9:
6868 CmdArgs.push_back("-64");
6869 CmdArgs.push_back("-Av9a");
6870 NeedsKPIC = true;
6871 break;
6872
6873 case llvm::Triple::mips64:
6874 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006875 StringRef CPUName;
6876 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006877 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006878
6879 CmdArgs.push_back("-mabi");
6880 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6881
6882 if (getToolChain().getArch() == llvm::Triple::mips64)
6883 CmdArgs.push_back("-EB");
6884 else
6885 CmdArgs.push_back("-EL");
6886
Rafael Espindolacc126272014-02-28 01:55:21 +00006887 NeedsKPIC = true;
6888 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006889 }
6890
Rafael Espindolacc126272014-02-28 01:55:21 +00006891 default:
6892 break;
6893 }
6894
6895 if (NeedsKPIC)
6896 addAssemblerKPIC(Args, CmdArgs);
6897
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006898 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006899
6900 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006901 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006902
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006903 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006904 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006905
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006906 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006907 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006908}
6909
Douglas Katzman95354292015-06-23 20:42:09 +00006910void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6911 const InputInfo &Output,
6912 const InputInfoList &Inputs,
6913 const ArgList &Args,
6914 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006915 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006916 ArgStringList CmdArgs;
6917
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006918 // Silence warning for "clang -g foo.o -o foo"
6919 Args.ClaimAllArgs(options::OPT_g_Group);
6920 // and "clang -emit-llvm foo.o -o foo"
6921 Args.ClaimAllArgs(options::OPT_emit_llvm);
6922 // and for "clang -w foo.o -o foo". Other warning options are already
6923 // handled somewhere else.
6924 Args.ClaimAllArgs(options::OPT_w);
6925
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006926 if (getToolChain().getArch() == llvm::Triple::mips64)
6927 CmdArgs.push_back("-EB");
6928 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6929 CmdArgs.push_back("-EL");
6930
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006931 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006932 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006933 CmdArgs.push_back("-e");
6934 CmdArgs.push_back("__start");
6935 }
6936
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006937 if (Args.hasArg(options::OPT_static)) {
6938 CmdArgs.push_back("-Bstatic");
6939 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006940 if (Args.hasArg(options::OPT_rdynamic))
6941 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006942 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006943 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006944 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006945 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006946 } else {
6947 CmdArgs.push_back("-dynamic-linker");
6948 CmdArgs.push_back("/usr/libexec/ld.so");
6949 }
6950 }
6951
Rafael Espindola044f7832013-06-05 04:28:55 +00006952 if (Args.hasArg(options::OPT_nopie))
6953 CmdArgs.push_back("-nopie");
6954
Daniel Dunbarb440f562010-08-02 02:38:21 +00006955 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006956 CmdArgs.push_back("-o");
6957 CmdArgs.push_back(Output.getFilename());
6958 } else {
6959 assert(Output.isNothing() && "Invalid output.");
6960 }
6961
6962 if (!Args.hasArg(options::OPT_nostdlib) &&
6963 !Args.hasArg(options::OPT_nostartfiles)) {
6964 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006965 if (Args.hasArg(options::OPT_pg))
6966 CmdArgs.push_back(
6967 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00006968 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006969 CmdArgs.push_back(
6970 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
6971 CmdArgs.push_back(
6972 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006973 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006974 CmdArgs.push_back(
6975 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006976 }
6977 }
6978
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006979 std::string Triple = getToolChain().getTripleString();
6980 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006981 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006982 CmdArgs.push_back(
6983 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006984
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006985 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6986 options::OPT_e, options::OPT_s, options::OPT_t,
6987 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006988
Daniel Dunbar54423b22010-09-17 00:24:54 +00006989 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006990
6991 if (!Args.hasArg(options::OPT_nostdlib) &&
6992 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006993 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006994 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006995 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006996 CmdArgs.push_back("-lm_p");
6997 else
6998 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006999 }
7000
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007001 // FIXME: For some reason GCC passes -lgcc before adding
7002 // the default system libraries. Just mimic this for now.
7003 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007004
Eric Christopher17674ec2012-09-13 06:32:34 +00007005 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007006 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7007 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007008 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007009 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007010 }
7011
Chandler Carruth45661652011-12-17 22:32:42 +00007012 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007013 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007014 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007015 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007016 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007017 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007018
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007019 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007020 }
7021
7022 if (!Args.hasArg(options::OPT_nostdlib) &&
7023 !Args.hasArg(options::OPT_nostartfiles)) {
7024 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007025 CmdArgs.push_back(
7026 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007027 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007028 CmdArgs.push_back(
7029 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007030 }
7031
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007032 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007033 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007034}
Ed Schoutene33194b2009-04-02 19:13:12 +00007035
Douglas Katzman95354292015-06-23 20:42:09 +00007036void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7037 const InputInfo &Output,
7038 const InputInfoList &Inputs,
7039 const ArgList &Args,
7040 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007041 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007042 ArgStringList CmdArgs;
7043
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007044 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007045
7046 CmdArgs.push_back("-o");
7047 CmdArgs.push_back(Output.getFilename());
7048
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007049 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007050 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007051
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007052 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007053 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007054}
7055
Douglas Katzman95354292015-06-23 20:42:09 +00007056void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7057 const InputInfo &Output,
7058 const InputInfoList &Inputs,
7059 const ArgList &Args,
7060 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007061 const Driver &D = getToolChain().getDriver();
7062 ArgStringList CmdArgs;
7063
7064 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7065 (!Args.hasArg(options::OPT_shared))) {
7066 CmdArgs.push_back("-e");
7067 CmdArgs.push_back("__start");
7068 }
7069
7070 if (Args.hasArg(options::OPT_static)) {
7071 CmdArgs.push_back("-Bstatic");
7072 } else {
7073 if (Args.hasArg(options::OPT_rdynamic))
7074 CmdArgs.push_back("-export-dynamic");
7075 CmdArgs.push_back("--eh-frame-hdr");
7076 CmdArgs.push_back("-Bdynamic");
7077 if (Args.hasArg(options::OPT_shared)) {
7078 CmdArgs.push_back("-shared");
7079 } else {
7080 CmdArgs.push_back("-dynamic-linker");
7081 CmdArgs.push_back("/usr/libexec/ld.so");
7082 }
7083 }
7084
7085 if (Output.isFilename()) {
7086 CmdArgs.push_back("-o");
7087 CmdArgs.push_back(Output.getFilename());
7088 } else {
7089 assert(Output.isNothing() && "Invalid output.");
7090 }
7091
7092 if (!Args.hasArg(options::OPT_nostdlib) &&
7093 !Args.hasArg(options::OPT_nostartfiles)) {
7094 if (!Args.hasArg(options::OPT_shared)) {
7095 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007096 CmdArgs.push_back(
7097 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007098 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007099 CmdArgs.push_back(
7100 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7101 CmdArgs.push_back(
7102 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007103 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007104 CmdArgs.push_back(
7105 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007106 }
7107 }
7108
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007109 Args.AddAllArgs(CmdArgs,
7110 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007111
7112 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7113
7114 if (!Args.hasArg(options::OPT_nostdlib) &&
7115 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007116 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007117 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7118 if (Args.hasArg(options::OPT_pg))
7119 CmdArgs.push_back("-lm_p");
7120 else
7121 CmdArgs.push_back("-lm");
7122 }
7123
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007124 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007125 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007126 CmdArgs.push_back("-lpthread_p");
7127 else
7128 CmdArgs.push_back("-lpthread");
7129 }
7130
Eli Friedman9fa28852012-08-08 23:57:20 +00007131 if (!Args.hasArg(options::OPT_shared)) {
7132 if (Args.hasArg(options::OPT_pg))
7133 CmdArgs.push_back("-lc_p");
7134 else
7135 CmdArgs.push_back("-lc");
7136 }
7137
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007138 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007139 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007140 case llvm::Triple::arm:
7141 MyArch = "arm";
7142 break;
7143 case llvm::Triple::x86:
7144 MyArch = "i386";
7145 break;
7146 case llvm::Triple::x86_64:
7147 MyArch = "amd64";
7148 break;
7149 default:
7150 llvm_unreachable("Unsupported architecture");
7151 }
7152 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007153 }
7154
7155 if (!Args.hasArg(options::OPT_nostdlib) &&
7156 !Args.hasArg(options::OPT_nostartfiles)) {
7157 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007158 CmdArgs.push_back(
7159 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007160 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007161 CmdArgs.push_back(
7162 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007163 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007164
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007165 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007166 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007167}
7168
Douglas Katzman95354292015-06-23 20:42:09 +00007169void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7170 const InputInfo &Output,
7171 const InputInfoList &Inputs,
7172 const ArgList &Args,
7173 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007174 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007175 ArgStringList CmdArgs;
7176
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007177 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7178 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007179 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007180 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007181 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007182 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007183 else if (getToolChain().getArch() == llvm::Triple::mips ||
7184 getToolChain().getArch() == llvm::Triple::mipsel ||
7185 getToolChain().getArch() == llvm::Triple::mips64 ||
7186 getToolChain().getArch() == llvm::Triple::mips64el) {
7187 StringRef CPUName;
7188 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007189 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007190
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007191 CmdArgs.push_back("-march");
7192 CmdArgs.push_back(CPUName.data());
7193
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007194 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007195 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007196
7197 if (getToolChain().getArch() == llvm::Triple::mips ||
7198 getToolChain().getArch() == llvm::Triple::mips64)
7199 CmdArgs.push_back("-EB");
7200 else
7201 CmdArgs.push_back("-EL");
7202
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007203 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007204 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007205 getToolChain().getArch() == llvm::Triple::armeb ||
7206 getToolChain().getArch() == llvm::Triple::thumb ||
7207 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007208 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007209 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007210 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7211
7212 if (FloatABI == "hard") {
7213 CmdArgs.push_back("-mfpu=vfp");
7214 } else {
7215 CmdArgs.push_back("-mfpu=softvfp");
7216 }
7217
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007218 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007219 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007220 case llvm::Triple::GNUEABI:
7221 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007222 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007223 break;
7224
7225 default:
7226 CmdArgs.push_back("-matpcs");
7227 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007228 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007229 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007230 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007231 if (getToolChain().getArch() == llvm::Triple::sparc)
7232 CmdArgs.push_back("-Av8plusa");
7233 else
7234 CmdArgs.push_back("-Av9a");
7235
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007236 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007237 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007238
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007239 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007240
7241 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007242 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007243
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007244 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007245 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007246
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007247 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007248 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007249}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007250
Douglas Katzman95354292015-06-23 20:42:09 +00007251void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7252 const InputInfo &Output,
7253 const InputInfoList &Inputs,
7254 const ArgList &Args,
7255 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007256 const toolchains::FreeBSD &ToolChain =
7257 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007258 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007259 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007260 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007261 !Args.hasArg(options::OPT_shared) &&
7262 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007263 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007264
7265 // Silence warning for "clang -g foo.o -o foo"
7266 Args.ClaimAllArgs(options::OPT_g_Group);
7267 // and "clang -emit-llvm foo.o -o foo"
7268 Args.ClaimAllArgs(options::OPT_emit_llvm);
7269 // and for "clang -w foo.o -o foo". Other warning options are already
7270 // handled somewhere else.
7271 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007272
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007273 if (!D.SysRoot.empty())
7274 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7275
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007276 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007277 CmdArgs.push_back("-pie");
7278
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007279 if (Args.hasArg(options::OPT_static)) {
7280 CmdArgs.push_back("-Bstatic");
7281 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007282 if (Args.hasArg(options::OPT_rdynamic))
7283 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007284 CmdArgs.push_back("--eh-frame-hdr");
7285 if (Args.hasArg(options::OPT_shared)) {
7286 CmdArgs.push_back("-Bshareable");
7287 } else {
7288 CmdArgs.push_back("-dynamic-linker");
7289 CmdArgs.push_back("/libexec/ld-elf.so.1");
7290 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007291 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007292 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7293 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7294 CmdArgs.push_back("--hash-style=both");
7295 }
7296 }
7297 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007298 }
7299
7300 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7301 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007302 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007303 CmdArgs.push_back("-m");
7304 CmdArgs.push_back("elf_i386_fbsd");
7305 }
7306
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007307 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007308 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007309 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007310 }
7311
Daniel Dunbarb440f562010-08-02 02:38:21 +00007312 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007313 CmdArgs.push_back("-o");
7314 CmdArgs.push_back(Output.getFilename());
7315 } else {
7316 assert(Output.isNothing() && "Invalid output.");
7317 }
7318
7319 if (!Args.hasArg(options::OPT_nostdlib) &&
7320 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007321 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007322 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007323 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007324 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007325 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007326 crt1 = "Scrt1.o";
7327 else
7328 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007329 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007330 if (crt1)
7331 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7332
7333 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7334
Craig Topper92fc2df2014-05-17 16:56:41 +00007335 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007336 if (Args.hasArg(options::OPT_static))
7337 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007338 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007339 crtbegin = "crtbeginS.o";
7340 else
7341 crtbegin = "crtbegin.o";
7342
7343 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007344 }
7345
7346 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007347 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007348 for (const auto &Path : Paths)
7349 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007350 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7351 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007352 Args.AddAllArgs(CmdArgs, options::OPT_s);
7353 Args.AddAllArgs(CmdArgs, options::OPT_t);
7354 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7355 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007356
Alexey Samsonov907880e2015-06-19 19:57:46 +00007357 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007358 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007359
Alexey Samsonov52550342014-09-15 19:58:40 +00007360 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007361 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007362
7363 if (!Args.hasArg(options::OPT_nostdlib) &&
7364 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007365 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007366 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007367 if (Args.hasArg(options::OPT_pg))
7368 CmdArgs.push_back("-lm_p");
7369 else
7370 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007371 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007372 if (NeedsSanitizerDeps)
7373 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007374 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7375 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007376 if (Args.hasArg(options::OPT_pg))
7377 CmdArgs.push_back("-lgcc_p");
7378 else
7379 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007380 if (Args.hasArg(options::OPT_static)) {
7381 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007382 } else if (Args.hasArg(options::OPT_pg)) {
7383 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007384 } else {
7385 CmdArgs.push_back("--as-needed");
7386 CmdArgs.push_back("-lgcc_s");
7387 CmdArgs.push_back("--no-as-needed");
7388 }
7389
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007390 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007391 if (Args.hasArg(options::OPT_pg))
7392 CmdArgs.push_back("-lpthread_p");
7393 else
7394 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007395 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007396
Roman Divacky66f22762011-02-10 16:59:40 +00007397 if (Args.hasArg(options::OPT_pg)) {
7398 if (Args.hasArg(options::OPT_shared))
7399 CmdArgs.push_back("-lc");
7400 else
7401 CmdArgs.push_back("-lc_p");
7402 CmdArgs.push_back("-lgcc_p");
7403 } else {
7404 CmdArgs.push_back("-lc");
7405 CmdArgs.push_back("-lgcc");
7406 }
7407
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007408 if (Args.hasArg(options::OPT_static)) {
7409 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007410 } else if (Args.hasArg(options::OPT_pg)) {
7411 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007412 } else {
7413 CmdArgs.push_back("--as-needed");
7414 CmdArgs.push_back("-lgcc_s");
7415 CmdArgs.push_back("--no-as-needed");
7416 }
7417 }
7418
7419 if (!Args.hasArg(options::OPT_nostdlib) &&
7420 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007421 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007422 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007423 else
7424 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007425 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007426 }
7427
Alexey Samsonov7811d192014-02-20 13:57:37 +00007428 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007429
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007430 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007431 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007432}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007433
Douglas Katzman95354292015-06-23 20:42:09 +00007434void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007435 const InputInfo &Output,
7436 const InputInfoList &Inputs,
7437 const ArgList &Args,
7438 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007439 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007440 ArgStringList CmdArgs;
7441
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007442 // GNU as needs different flags for creating the correct output format
7443 // on architectures with different ABIs or optional feature sets.
7444 switch (getToolChain().getArch()) {
7445 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007446 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007447 break;
7448 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007449 case llvm::Triple::armeb:
7450 case llvm::Triple::thumb:
7451 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007452 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007453 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7454 std::string Arch =
7455 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007456 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007457 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007458 }
7459
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007460 case llvm::Triple::mips:
7461 case llvm::Triple::mipsel:
7462 case llvm::Triple::mips64:
7463 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007464 StringRef CPUName;
7465 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007466 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007467
7468 CmdArgs.push_back("-march");
7469 CmdArgs.push_back(CPUName.data());
7470
7471 CmdArgs.push_back("-mabi");
7472 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7473
7474 if (getToolChain().getArch() == llvm::Triple::mips ||
7475 getToolChain().getArch() == llvm::Triple::mips64)
7476 CmdArgs.push_back("-EB");
7477 else
7478 CmdArgs.push_back("-EL");
7479
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007480 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007481 break;
7482 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007483
7484 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007485 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007486 CmdArgs.push_back("-32");
7487 addAssemblerKPIC(Args, CmdArgs);
7488 break;
7489
7490 case llvm::Triple::sparcv9:
7491 CmdArgs.push_back("-64");
7492 CmdArgs.push_back("-Av9");
7493 addAssemblerKPIC(Args, CmdArgs);
7494 break;
7495
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007496 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007497 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007498 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007499
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007500 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007501
7502 CmdArgs.push_back("-o");
7503 CmdArgs.push_back(Output.getFilename());
7504
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007505 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007506 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007507
David Chisnallddbd68f2011-09-27 22:03:18 +00007508 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007509 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007510}
7511
Douglas Katzman95354292015-06-23 20:42:09 +00007512void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7513 const InputInfo &Output,
7514 const InputInfoList &Inputs,
7515 const ArgList &Args,
7516 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007517 const Driver &D = getToolChain().getDriver();
7518 ArgStringList CmdArgs;
7519
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007520 if (!D.SysRoot.empty())
7521 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7522
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007523 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007524 if (Args.hasArg(options::OPT_static)) {
7525 CmdArgs.push_back("-Bstatic");
7526 } else {
7527 if (Args.hasArg(options::OPT_rdynamic))
7528 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007529 if (Args.hasArg(options::OPT_shared)) {
7530 CmdArgs.push_back("-Bshareable");
7531 } else {
7532 CmdArgs.push_back("-dynamic-linker");
7533 CmdArgs.push_back("/libexec/ld.elf_so");
7534 }
7535 }
7536
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007537 // Many NetBSD architectures support more than one ABI.
7538 // Determine the correct emulation for ld.
7539 switch (getToolChain().getArch()) {
7540 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007541 CmdArgs.push_back("-m");
7542 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007543 break;
7544 case llvm::Triple::arm:
7545 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007546 CmdArgs.push_back("-m");
7547 switch (getToolChain().getTriple().getEnvironment()) {
7548 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007549 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007550 CmdArgs.push_back("armelf_nbsd_eabi");
7551 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007552 case llvm::Triple::EABIHF:
7553 case llvm::Triple::GNUEABIHF:
7554 CmdArgs.push_back("armelf_nbsd_eabihf");
7555 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007556 default:
7557 CmdArgs.push_back("armelf_nbsd");
7558 break;
7559 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007560 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007561 case llvm::Triple::armeb:
7562 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007563 arm::appendEBLinkFlags(
7564 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007565 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007566 CmdArgs.push_back("-m");
7567 switch (getToolChain().getTriple().getEnvironment()) {
7568 case llvm::Triple::EABI:
7569 case llvm::Triple::GNUEABI:
7570 CmdArgs.push_back("armelfb_nbsd_eabi");
7571 break;
7572 case llvm::Triple::EABIHF:
7573 case llvm::Triple::GNUEABIHF:
7574 CmdArgs.push_back("armelfb_nbsd_eabihf");
7575 break;
7576 default:
7577 CmdArgs.push_back("armelfb_nbsd");
7578 break;
7579 }
7580 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007581 case llvm::Triple::mips64:
7582 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007583 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007584 CmdArgs.push_back("-m");
7585 if (getToolChain().getArch() == llvm::Triple::mips64)
7586 CmdArgs.push_back("elf32btsmip");
7587 else
7588 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007589 } else if (mips::hasMipsAbiArg(Args, "64")) {
7590 CmdArgs.push_back("-m");
7591 if (getToolChain().getArch() == llvm::Triple::mips64)
7592 CmdArgs.push_back("elf64btsmip");
7593 else
7594 CmdArgs.push_back("elf64ltsmip");
7595 }
7596 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007597 case llvm::Triple::ppc:
7598 CmdArgs.push_back("-m");
7599 CmdArgs.push_back("elf32ppc_nbsd");
7600 break;
7601
7602 case llvm::Triple::ppc64:
7603 case llvm::Triple::ppc64le:
7604 CmdArgs.push_back("-m");
7605 CmdArgs.push_back("elf64ppc");
7606 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007607
7608 case llvm::Triple::sparc:
7609 CmdArgs.push_back("-m");
7610 CmdArgs.push_back("elf32_sparc");
7611 break;
7612
7613 case llvm::Triple::sparcv9:
7614 CmdArgs.push_back("-m");
7615 CmdArgs.push_back("elf64_sparc");
7616 break;
7617
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007618 default:
7619 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007620 }
7621
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007622 if (Output.isFilename()) {
7623 CmdArgs.push_back("-o");
7624 CmdArgs.push_back(Output.getFilename());
7625 } else {
7626 assert(Output.isNothing() && "Invalid output.");
7627 }
7628
7629 if (!Args.hasArg(options::OPT_nostdlib) &&
7630 !Args.hasArg(options::OPT_nostartfiles)) {
7631 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007632 CmdArgs.push_back(
7633 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7634 CmdArgs.push_back(
7635 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7636 CmdArgs.push_back(
7637 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007638 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007639 CmdArgs.push_back(
7640 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7641 CmdArgs.push_back(
7642 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007643 }
7644 }
7645
7646 Args.AddAllArgs(CmdArgs, options::OPT_L);
7647 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7648 Args.AddAllArgs(CmdArgs, options::OPT_e);
7649 Args.AddAllArgs(CmdArgs, options::OPT_s);
7650 Args.AddAllArgs(CmdArgs, options::OPT_t);
7651 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7652 Args.AddAllArgs(CmdArgs, options::OPT_r);
7653
7654 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7655
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007656 unsigned Major, Minor, Micro;
7657 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7658 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007659 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007660 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007661 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007662 case llvm::Triple::arm:
7663 case llvm::Triple::armeb:
7664 case llvm::Triple::thumb:
7665 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007666 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007667 case llvm::Triple::ppc64:
7668 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007669 case llvm::Triple::x86:
7670 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007671 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007672 break;
7673 default:
7674 break;
7675 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007676 }
7677
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007678 if (!Args.hasArg(options::OPT_nostdlib) &&
7679 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007680 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007681 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7682 CmdArgs.push_back("-lm");
7683 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007684 if (Args.hasArg(options::OPT_pthread))
7685 CmdArgs.push_back("-lpthread");
7686 CmdArgs.push_back("-lc");
7687
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007688 if (useLibgcc) {
7689 if (Args.hasArg(options::OPT_static)) {
7690 // libgcc_eh depends on libc, so resolve as much as possible,
7691 // pull in any new requirements from libc and then get the rest
7692 // of libgcc.
7693 CmdArgs.push_back("-lgcc_eh");
7694 CmdArgs.push_back("-lc");
7695 CmdArgs.push_back("-lgcc");
7696 } else {
7697 CmdArgs.push_back("-lgcc");
7698 CmdArgs.push_back("--as-needed");
7699 CmdArgs.push_back("-lgcc_s");
7700 CmdArgs.push_back("--no-as-needed");
7701 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007702 }
7703 }
7704
7705 if (!Args.hasArg(options::OPT_nostdlib) &&
7706 !Args.hasArg(options::OPT_nostartfiles)) {
7707 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007708 CmdArgs.push_back(
7709 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007710 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007711 CmdArgs.push_back(
7712 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7713 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007714 }
7715
Alexey Samsonov7811d192014-02-20 13:57:37 +00007716 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007717
Logan Chieneb9162f2014-06-26 14:23:45 +00007718 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007719 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007720}
7721
Douglas Katzman95354292015-06-23 20:42:09 +00007722void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7723 const InputInfo &Output,
7724 const InputInfoList &Inputs,
7725 const ArgList &Args,
7726 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007727 claimNoWarnArgs(Args);
7728
Rafael Espindola92b00932010-08-10 00:25:48 +00007729 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007730 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007731
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007732 switch (getToolChain().getArch()) {
7733 default:
7734 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007735 // Add --32/--64 to make sure we get the format we want.
7736 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007737 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007738 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007739 break;
7740 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007741 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7742 CmdArgs.push_back("--x32");
7743 else
7744 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007745 break;
7746 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007747 CmdArgs.push_back("-a32");
7748 CmdArgs.push_back("-mppc");
7749 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007750 break;
7751 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007752 CmdArgs.push_back("-a64");
7753 CmdArgs.push_back("-mppc64");
7754 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007755 break;
7756 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007757 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007758 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007759 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007760 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007761 break;
7762 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007763 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007764 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007765 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007766 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007767 break;
7768 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007769 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007770 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007771 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007772 break;
7773 case llvm::Triple::arm:
7774 case llvm::Triple::armeb:
7775 case llvm::Triple::thumb:
7776 case llvm::Triple::thumbeb: {
Scott Douglass3205f522015-03-23 10:54:24 +00007777 const llvm::Triple &Triple = getToolChain().getTriple();
7778 switch (Triple.getSubArch()) {
7779 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007780 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007781 break;
7782 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007783 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007784 break;
7785 default:
7786 break;
7787 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007788
Tim Northover9c7e0352013-12-12 11:55:52 +00007789 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
Derek Schuffa419e1c2015-04-10 23:07:19 +00007790 getToolChain().getDriver(), Args,
7791 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007792 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007793
7794 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007795
7796 // FIXME: remove krait check when GNU tools support krait cpu
7797 // for now replace it with -march=armv7-a to avoid a lower
7798 // march from being picked in the absence of a cpu flag.
7799 Arg *A;
7800 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007801 StringRef(A->getValue()).lower() == "krait")
7802 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007803 else
7804 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007805 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007806 break;
7807 }
7808 case llvm::Triple::mips:
7809 case llvm::Triple::mipsel:
7810 case llvm::Triple::mips64:
7811 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007812 StringRef CPUName;
7813 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007814 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007815 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007816
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007817 CmdArgs.push_back("-march");
7818 CmdArgs.push_back(CPUName.data());
7819
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007820 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007821 CmdArgs.push_back(ABIName.data());
7822
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007823 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7824 // or -mshared (not implemented) is in effect.
7825 bool IsPicOrPie = false;
7826 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7827 options::OPT_fpic, options::OPT_fno_pic,
7828 options::OPT_fPIE, options::OPT_fno_PIE,
7829 options::OPT_fpie, options::OPT_fno_pie)) {
7830 if (A->getOption().matches(options::OPT_fPIC) ||
7831 A->getOption().matches(options::OPT_fpic) ||
7832 A->getOption().matches(options::OPT_fPIE) ||
7833 A->getOption().matches(options::OPT_fpie))
7834 IsPicOrPie = true;
7835 }
7836 if (!IsPicOrPie)
7837 CmdArgs.push_back("-mno-shared");
7838
Daniel Sanders379d44b2014-07-16 11:52:23 +00007839 // LLVM doesn't support -mplt yet and acts as if it is always given.
7840 // However, -mplt has no effect with the N64 ABI.
7841 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007842
7843 if (getToolChain().getArch() == llvm::Triple::mips ||
7844 getToolChain().getArch() == llvm::Triple::mips64)
7845 CmdArgs.push_back("-EB");
7846 else
7847 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007848
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007849 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7850 if (StringRef(A->getValue()) == "2008")
7851 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7852 }
7853
Daniel Sanders379d44b2014-07-16 11:52:23 +00007854 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00007855 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007856 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7857 options::OPT_mfp64)) {
7858 A->claim();
7859 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00007860 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
7861 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00007862 CmdArgs.push_back("-mfpxx");
7863
7864 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7865 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007866 if (Arg *A =
7867 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007868 if (A->getOption().matches(options::OPT_mips16)) {
7869 A->claim();
7870 A->render(Args, CmdArgs);
7871 } else {
7872 A->claim();
7873 CmdArgs.push_back("-no-mips16");
7874 }
7875 }
7876
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007877 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7878 options::OPT_mno_micromips);
7879 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7880 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7881
Simon Atanasyanbd986632013-11-26 11:58:04 +00007882 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7883 // Do not use AddLastArg because not all versions of MIPS assembler
7884 // support -mmsa / -mno-msa options.
7885 if (A->getOption().matches(options::OPT_mmsa))
7886 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7887 }
7888
Daniel Sanders379d44b2014-07-16 11:52:23 +00007889 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7890 options::OPT_msoft_float);
7891
Toma Tabacub36d6102015-06-11 12:13:18 +00007892 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
7893 options::OPT_msingle_float);
7894
Daniel Sanders379d44b2014-07-16 11:52:23 +00007895 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7896 options::OPT_mno_odd_spreg);
7897
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007898 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007899 break;
7900 }
7901 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007902 // Always pass an -march option, since our default of z10 is later
7903 // than the GNU assembler's default.
7904 StringRef CPUName = getSystemZTargetCPU(Args);
7905 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007906 break;
7907 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007908 }
7909
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007910 if (NeedsKPIC)
7911 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007912
Renato Golina74bbc72015-07-22 15:32:36 +00007913 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007914 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00007915
7916 CmdArgs.push_back("-o");
7917 CmdArgs.push_back(Output.getFilename());
7918
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007919 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007920 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007921
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007922 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007923 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007924
7925 // Handle the debug info splitting at object creation time if we're
7926 // creating an object.
7927 // TODO: Currently only works on linux with newer objcopy.
7928 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007929 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007930 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00007931 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00007932}
7933
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007934static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007935 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007936 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00007937 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007938 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7939 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007940 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007941 CmdArgs.push_back("-lgcc");
7942
Logan Chien3d3373c2012-11-19 12:04:11 +00007943 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007944 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007945 CmdArgs.push_back("-lgcc");
7946 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00007947 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007948 CmdArgs.push_back("--as-needed");
7949 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00007950 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00007951 CmdArgs.push_back("--no-as-needed");
7952 }
7953
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007954 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007955 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007956 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007957 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007958
7959 // According to Android ABI, we have to link with libdl if we are
7960 // linking with non-static libgcc.
7961 //
7962 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7963 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7964 if (isAndroid && !StaticLibgcc)
7965 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007966}
7967
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007968static std::string getLinuxDynamicLinker(const ArgList &Args,
7969 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007970 const llvm::Triple::ArchType Arch = ToolChain.getArch();
7971
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007972 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7973 if (ToolChain.getTriple().isArch64Bit())
7974 return "/system/bin/linker64";
7975 else
7976 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007977 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
7978 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007979 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007980 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007981 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007982 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007983 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007984 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00007985 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
7986 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007987 return "/lib/ld-linux-armhf.so.3";
7988 else
7989 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007990 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
7991 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00007992 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
7993 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007994 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007995 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007996 return "/lib/ld-linux.so.3";
7997 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
7998 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007999 StringRef CPUName;
8000 StringRef ABIName;
8001 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8002 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8003
8004 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8005 .Case("o32", "/lib")
8006 .Case("n32", "/lib32")
8007 .Case("n64", "/lib64")
8008 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008009 StringRef LibName;
8010 if (mips::isUCLibc(Args))
8011 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8012 else
8013 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008014
8015 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008016 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008017 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008018 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008019 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8020 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008021 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008022 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008023 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8024 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008025 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008026 } else if (Arch == llvm::Triple::systemz)
Ulrich Weigand8afad612014-07-28 13:17:52 +00008027 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008028 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008029 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008030 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008031 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8032 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008033 else
8034 return "/lib64/ld-linux-x86-64.so.2";
8035}
8036
Renato Golinc4b49242014-02-13 10:01:16 +00008037static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008038 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008039 // Make use of compiler-rt if --rtlib option is used
8040 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8041
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008042 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008043 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008044 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008045 default:
8046 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008047 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008048 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008049 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008050 break;
8051 }
Renato Golinc4b49242014-02-13 10:01:16 +00008052 break;
8053 case ToolChain::RLT_Libgcc:
8054 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8055 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008056 }
8057}
8058
Rafael Espindola1e085772014-08-15 17:14:35 +00008059static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8060 switch (T.getArch()) {
8061 case llvm::Triple::x86:
8062 return "elf_i386";
8063 case llvm::Triple::aarch64:
8064 return "aarch64linux";
8065 case llvm::Triple::aarch64_be:
8066 return "aarch64_be_linux";
8067 case llvm::Triple::arm:
8068 case llvm::Triple::thumb:
8069 return "armelf_linux_eabi";
8070 case llvm::Triple::armeb:
8071 case llvm::Triple::thumbeb:
8072 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8073 case llvm::Triple::ppc:
8074 return "elf32ppclinux";
8075 case llvm::Triple::ppc64:
8076 return "elf64ppc";
8077 case llvm::Triple::ppc64le:
8078 return "elf64lppc";
8079 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008080 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008081 return "elf32_sparc";
8082 case llvm::Triple::sparcv9:
8083 return "elf64_sparc";
8084 case llvm::Triple::mips:
8085 return "elf32btsmip";
8086 case llvm::Triple::mipsel:
8087 return "elf32ltsmip";
8088 case llvm::Triple::mips64:
8089 if (mips::hasMipsAbiArg(Args, "n32"))
8090 return "elf32btsmipn32";
8091 return "elf64btsmip";
8092 case llvm::Triple::mips64el:
8093 if (mips::hasMipsAbiArg(Args, "n32"))
8094 return "elf32ltsmipn32";
8095 return "elf64ltsmip";
8096 case llvm::Triple::systemz:
8097 return "elf64_s390";
8098 case llvm::Triple::x86_64:
8099 if (T.getEnvironment() == llvm::Triple::GNUX32)
8100 return "elf32_x86_64";
8101 return "elf_x86_64";
8102 default:
8103 llvm_unreachable("Unexpected arch");
8104 }
8105}
8106
Douglas Katzman95354292015-06-23 20:42:09 +00008107void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8108 const InputInfo &Output,
8109 const InputInfoList &Inputs,
8110 const ArgList &Args,
8111 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008112 const toolchains::Linux &ToolChain =
8113 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008114 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008115 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008116 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008117 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008118 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008119 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8120 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008121
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008122 ArgStringList CmdArgs;
8123
Rafael Espindolad1002f62010-11-15 18:28:16 +00008124 // Silence warning for "clang -g foo.o -o foo"
8125 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008126 // and "clang -emit-llvm foo.o -o foo"
8127 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008128 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008129 // handled somewhere else.
8130 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008131
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008132 if (!D.SysRoot.empty())
8133 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008134
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008135 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008136 CmdArgs.push_back("-pie");
8137
Rafael Espindola1c76c592010-11-07 22:57:16 +00008138 if (Args.hasArg(options::OPT_rdynamic))
8139 CmdArgs.push_back("-export-dynamic");
8140
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008141 if (Args.hasArg(options::OPT_s))
8142 CmdArgs.push_back("-s");
8143
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008144 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
8145 arm::appendEBLinkFlags(
8146 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008147 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008148
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008149 for (const auto &Opt : ToolChain.ExtraOpts)
8150 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008151
8152 if (!Args.hasArg(options::OPT_static)) {
8153 CmdArgs.push_back("--eh-frame-hdr");
8154 }
8155
8156 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008157 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008158
8159 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008160 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8161 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008162 CmdArgs.push_back("-Bstatic");
8163 else
8164 CmdArgs.push_back("-static");
8165 } else if (Args.hasArg(options::OPT_shared)) {
8166 CmdArgs.push_back("-shared");
8167 }
8168
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008169 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8170 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008171 (!Args.hasArg(options::OPT_static) &&
8172 !Args.hasArg(options::OPT_shared))) {
8173 CmdArgs.push_back("-dynamic-linker");
8174 CmdArgs.push_back(Args.MakeArgString(
8175 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8176 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008177
8178 CmdArgs.push_back("-o");
8179 CmdArgs.push_back(Output.getFilename());
8180
Rafael Espindola81937ec2010-12-01 01:52:43 +00008181 if (!Args.hasArg(options::OPT_nostdlib) &&
8182 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008183 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008184 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008185 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008186 if (Args.hasArg(options::OPT_pg))
8187 crt1 = "gcrt1.o";
8188 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008189 crt1 = "Scrt1.o";
8190 else
8191 crt1 = "crt1.o";
8192 }
8193 if (crt1)
8194 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008195
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008196 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8197 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008198
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008199 const char *crtbegin;
8200 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008201 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008202 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008203 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008204 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008205 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008206 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008207 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008208 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008209
8210 // Add crtfastmath.o if available and fast math is enabled.
8211 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008212 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008213
8214 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008215 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008216
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008217 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008218
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008219 for (const auto &Path : Paths)
8220 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008221
Alexey Samsonov907880e2015-06-19 19:57:46 +00008222 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008223 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008224
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008225 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8226 CmdArgs.push_back("--no-demangle");
8227
Alexey Samsonov52550342014-09-15 19:58:40 +00008228 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008229 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008230 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008231 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008232
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008233 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008234 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008235 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008236 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008237 if (OnlyLibstdcxxStatic)
8238 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008239 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008240 if (OnlyLibstdcxxStatic)
8241 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008242 CmdArgs.push_back("-lm");
8243 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008244 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8245 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008246
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008247 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008248 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8249 if (Args.hasArg(options::OPT_static))
8250 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008251
Alexey Samsonov52550342014-09-15 19:58:40 +00008252 if (NeedsSanitizerDeps)
8253 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8254
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008255 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8256 Args.hasArg(options::OPT_pthreads);
8257
8258 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8259 options::OPT_fno_openmp, false)) {
8260 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8261 // FIXME: Does this really make sense for all GNU toolchains?
8262 WantPthread = true;
8263
8264 // Also link the particular OpenMP runtimes.
8265 switch (getOpenMPRuntime(ToolChain, Args)) {
8266 case OMPRT_OMP:
8267 CmdArgs.push_back("-lomp");
8268 break;
8269 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008270 CmdArgs.push_back("-lgomp");
8271
8272 // FIXME: Exclude this for platforms with libgomp that don't require
8273 // librt. Most modern Linux platforms require it, but some may not.
8274 CmdArgs.push_back("-lrt");
8275 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008276 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008277 CmdArgs.push_back("-liomp5");
8278 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008279 case OMPRT_Unknown:
8280 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008281 break;
8282 }
Chandler Carruth01538002013-01-17 13:19:29 +00008283 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008284
Renato Golinc4b49242014-02-13 10:01:16 +00008285 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008286
Richard Smith31d1de22015-05-20 22:48:44 +00008287 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008288 CmdArgs.push_back("-lpthread");
8289
8290 CmdArgs.push_back("-lc");
8291
8292 if (Args.hasArg(options::OPT_static))
8293 CmdArgs.push_back("--end-group");
8294 else
Renato Golinc4b49242014-02-13 10:01:16 +00008295 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008296 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008297
Rafael Espindola81937ec2010-12-01 01:52:43 +00008298 if (!Args.hasArg(options::OPT_nostartfiles)) {
8299 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008300 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008301 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008302 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008303 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008304 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008305 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008306
Rafael Espindola81937ec2010-12-01 01:52:43 +00008307 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008308 if (!isAndroid)
8309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008310 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008311 }
8312
Justin Bognerd3371d82015-07-17 03:35:54 +00008313 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8314 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008315}
8316
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008317// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8318// for the various SFI requirements like register masking. The assembly tool
8319// inserts the file containing the macros as an input into all the assembly
8320// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008321void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8322 const InputInfo &Output,
8323 const InputInfoList &Inputs,
8324 const ArgList &Args,
8325 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008326 const toolchains::NaClToolChain &ToolChain =
8327 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008328 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8329 "nacl-arm-macros.s");
8330 InputInfoList NewInputs;
8331 NewInputs.push_back(NaClMacros);
8332 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008333 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8334 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008335}
8336
Douglas Katzman750cfc52015-06-29 18:42:16 +00008337// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008338// we use static by default, do not yet support sanitizers or LTO, and a few
8339// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008340// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008341void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8342 const InputInfo &Output,
8343 const InputInfoList &Inputs,
8344 const ArgList &Args,
8345 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008346
Douglas Katzman54366072015-07-27 16:53:08 +00008347 const toolchains::NaClToolChain &ToolChain =
8348 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008349 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008350 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008351 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008352 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008353
8354 ArgStringList CmdArgs;
8355
8356 // Silence warning for "clang -g foo.o -o foo"
8357 Args.ClaimAllArgs(options::OPT_g_Group);
8358 // and "clang -emit-llvm foo.o -o foo"
8359 Args.ClaimAllArgs(options::OPT_emit_llvm);
8360 // and for "clang -w foo.o -o foo". Other warning options are already
8361 // handled somewhere else.
8362 Args.ClaimAllArgs(options::OPT_w);
8363
8364 if (!D.SysRoot.empty())
8365 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8366
8367 if (Args.hasArg(options::OPT_rdynamic))
8368 CmdArgs.push_back("-export-dynamic");
8369
8370 if (Args.hasArg(options::OPT_s))
8371 CmdArgs.push_back("-s");
8372
Douglas Katzman54366072015-07-27 16:53:08 +00008373 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8374 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008375 CmdArgs.push_back("--build-id");
8376
8377 if (!IsStatic)
8378 CmdArgs.push_back("--eh-frame-hdr");
8379
8380 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008381 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008382 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008383 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008384 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008385 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008386 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008387 else if (Arch == llvm::Triple::mipsel)
8388 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008389 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008390 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8391 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008392
8393 if (IsStatic)
8394 CmdArgs.push_back("-static");
8395 else if (Args.hasArg(options::OPT_shared))
8396 CmdArgs.push_back("-shared");
8397
8398 CmdArgs.push_back("-o");
8399 CmdArgs.push_back(Output.getFilename());
8400 if (!Args.hasArg(options::OPT_nostdlib) &&
8401 !Args.hasArg(options::OPT_nostartfiles)) {
8402 if (!Args.hasArg(options::OPT_shared))
8403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8404 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8405
8406 const char *crtbegin;
8407 if (IsStatic)
8408 crtbegin = "crtbeginT.o";
8409 else if (Args.hasArg(options::OPT_shared))
8410 crtbegin = "crtbeginS.o";
8411 else
8412 crtbegin = "crtbegin.o";
8413 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8414 }
8415
8416 Args.AddAllArgs(CmdArgs, options::OPT_L);
8417 Args.AddAllArgs(CmdArgs, options::OPT_u);
8418
8419 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8420
8421 for (const auto &Path : Paths)
8422 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8423
8424 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8425 CmdArgs.push_back("--no-demangle");
8426
8427 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8428
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008429 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008430 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008431 bool OnlyLibstdcxxStatic =
8432 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008433 if (OnlyLibstdcxxStatic)
8434 CmdArgs.push_back("-Bstatic");
8435 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8436 if (OnlyLibstdcxxStatic)
8437 CmdArgs.push_back("-Bdynamic");
8438 CmdArgs.push_back("-lm");
8439 }
8440
8441 if (!Args.hasArg(options::OPT_nostdlib)) {
8442 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8443 // Always use groups, since it has no effect on dynamic libraries.
8444 CmdArgs.push_back("--start-group");
8445 CmdArgs.push_back("-lc");
8446 // NaCl's libc++ currently requires libpthread, so just always include it
8447 // in the group for C++.
8448 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008449 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008450 // Gold, used by Mips, handles nested groups differently than ld, and
8451 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8452 // which is not a desired behaviour here.
8453 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8454 if (getToolChain().getArch() == llvm::Triple::mipsel)
8455 CmdArgs.push_back("-lnacl");
8456
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008457 CmdArgs.push_back("-lpthread");
8458 }
8459
8460 CmdArgs.push_back("-lgcc");
8461 CmdArgs.push_back("--as-needed");
8462 if (IsStatic)
8463 CmdArgs.push_back("-lgcc_eh");
8464 else
8465 CmdArgs.push_back("-lgcc_s");
8466 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008467
8468 // Mips needs to create and use pnacl_legacy library that contains
8469 // definitions from bitcode/pnaclmm.c and definitions for
8470 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8471 if (getToolChain().getArch() == llvm::Triple::mipsel)
8472 CmdArgs.push_back("-lpnacl_legacy");
8473
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008474 CmdArgs.push_back("--end-group");
8475 }
8476
8477 if (!Args.hasArg(options::OPT_nostartfiles)) {
8478 const char *crtend;
8479 if (Args.hasArg(options::OPT_shared))
8480 crtend = "crtendS.o";
8481 else
8482 crtend = "crtend.o";
8483
8484 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8485 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8486 }
8487 }
8488
Justin Bognerd3371d82015-07-17 03:35:54 +00008489 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8490 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008491}
8492
Douglas Katzman95354292015-06-23 20:42:09 +00008493void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8494 const InputInfo &Output,
8495 const InputInfoList &Inputs,
8496 const ArgList &Args,
8497 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008498 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008499 ArgStringList CmdArgs;
8500
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008501 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008502
8503 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008504 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008505
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008506 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008507 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008508
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008509 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008510 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008511}
8512
Douglas Katzman95354292015-06-23 20:42:09 +00008513void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8514 const InputInfo &Output,
8515 const InputInfoList &Inputs,
8516 const ArgList &Args,
8517 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008518 const Driver &D = getToolChain().getDriver();
8519 ArgStringList CmdArgs;
8520
Daniel Dunbarb440f562010-08-02 02:38:21 +00008521 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008522 CmdArgs.push_back("-o");
8523 CmdArgs.push_back(Output.getFilename());
8524 } else {
8525 assert(Output.isNothing() && "Invalid output.");
8526 }
8527
8528 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008529 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008530 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8531 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8532 CmdArgs.push_back(
8533 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8534 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008535 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008536
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008537 Args.AddAllArgs(CmdArgs,
8538 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008539
Daniel Dunbar54423b22010-09-17 00:24:54 +00008540 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008541
Alexey Samsonov7811d192014-02-20 13:57:37 +00008542 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008543
Chris Lattner3e2ee142010-07-07 16:01:42 +00008544 if (!Args.hasArg(options::OPT_nostdlib) &&
8545 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008546 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008547 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008548 CmdArgs.push_back("-lm");
8549 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008550 }
8551
8552 if (!Args.hasArg(options::OPT_nostdlib) &&
8553 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008554 if (Args.hasArg(options::OPT_pthread))
8555 CmdArgs.push_back("-lpthread");
8556 CmdArgs.push_back("-lc");
8557 CmdArgs.push_back("-lCompilerRT-Generic");
8558 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8559 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008560 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008561 }
8562
Logan Chieneb9162f2014-06-26 14:23:45 +00008563 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008564 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008565}
8566
Daniel Dunbarcc912342009-05-02 18:28:39 +00008567/// DragonFly Tools
8568
8569// For now, DragonFly Assemble does just about the same as for
8570// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008571void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8572 const InputInfo &Output,
8573 const InputInfoList &Inputs,
8574 const ArgList &Args,
8575 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008576 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008577 ArgStringList CmdArgs;
8578
8579 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8580 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008581 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008582 CmdArgs.push_back("--32");
8583
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008584 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008585
8586 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008587 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008588
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008589 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008590 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008591
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008592 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008593 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008594}
8595
Douglas Katzman95354292015-06-23 20:42:09 +00008596void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8597 const InputInfo &Output,
8598 const InputInfoList &Inputs,
8599 const ArgList &Args,
8600 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008601 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008602 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008603 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008604
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008605 if (!D.SysRoot.empty())
8606 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8607
John McCall65b8da02013-04-11 22:55:55 +00008608 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008609 if (Args.hasArg(options::OPT_static)) {
8610 CmdArgs.push_back("-Bstatic");
8611 } else {
John McCall65b8da02013-04-11 22:55:55 +00008612 if (Args.hasArg(options::OPT_rdynamic))
8613 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008614 if (Args.hasArg(options::OPT_shared))
8615 CmdArgs.push_back("-Bshareable");
8616 else {
8617 CmdArgs.push_back("-dynamic-linker");
8618 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8619 }
John McCall65b8da02013-04-11 22:55:55 +00008620 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008621 }
8622
8623 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8624 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008625 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008626 CmdArgs.push_back("-m");
8627 CmdArgs.push_back("elf_i386");
8628 }
8629
Daniel Dunbarb440f562010-08-02 02:38:21 +00008630 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008631 CmdArgs.push_back("-o");
8632 CmdArgs.push_back(Output.getFilename());
8633 } else {
8634 assert(Output.isNothing() && "Invalid output.");
8635 }
8636
8637 if (!Args.hasArg(options::OPT_nostdlib) &&
8638 !Args.hasArg(options::OPT_nostartfiles)) {
8639 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008640 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008641 CmdArgs.push_back(
8642 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008643 else {
8644 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008645 CmdArgs.push_back(
8646 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008647 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008648 CmdArgs.push_back(
8649 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008650 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008651 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008652 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008653 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008654 CmdArgs.push_back(
8655 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008656 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008657 CmdArgs.push_back(
8658 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008659 }
8660
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008661 Args.AddAllArgs(CmdArgs,
8662 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008663
Daniel Dunbar54423b22010-09-17 00:24:54 +00008664 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008665
8666 if (!Args.hasArg(options::OPT_nostdlib) &&
8667 !Args.hasArg(options::OPT_nodefaultlibs)) {
8668 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8669 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008670 if (UseGCC47)
8671 CmdArgs.push_back("-L/usr/lib/gcc47");
8672 else
8673 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008674
8675 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008676 if (UseGCC47) {
8677 CmdArgs.push_back("-rpath");
8678 CmdArgs.push_back("/usr/lib/gcc47");
8679 } else {
8680 CmdArgs.push_back("-rpath");
8681 CmdArgs.push_back("/usr/lib/gcc44");
8682 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008683 }
8684
Hans Wennborg70850d82013-07-18 20:29:38 +00008685 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008686 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008687 CmdArgs.push_back("-lm");
8688 }
8689
Daniel Dunbarcc912342009-05-02 18:28:39 +00008690 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008691 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008692
8693 if (!Args.hasArg(options::OPT_nolibc)) {
8694 CmdArgs.push_back("-lc");
8695 }
8696
John McCall65b8da02013-04-11 22:55:55 +00008697 if (UseGCC47) {
8698 if (Args.hasArg(options::OPT_static) ||
8699 Args.hasArg(options::OPT_static_libgcc)) {
8700 CmdArgs.push_back("-lgcc");
8701 CmdArgs.push_back("-lgcc_eh");
8702 } else {
8703 if (Args.hasArg(options::OPT_shared_libgcc)) {
8704 CmdArgs.push_back("-lgcc_pic");
8705 if (!Args.hasArg(options::OPT_shared))
8706 CmdArgs.push_back("-lgcc");
8707 } else {
8708 CmdArgs.push_back("-lgcc");
8709 CmdArgs.push_back("--as-needed");
8710 CmdArgs.push_back("-lgcc_pic");
8711 CmdArgs.push_back("--no-as-needed");
8712 }
8713 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008714 } else {
John McCall65b8da02013-04-11 22:55:55 +00008715 if (Args.hasArg(options::OPT_shared)) {
8716 CmdArgs.push_back("-lgcc_pic");
8717 } else {
8718 CmdArgs.push_back("-lgcc");
8719 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008720 }
8721 }
8722
8723 if (!Args.hasArg(options::OPT_nostdlib) &&
8724 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008725 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008726 CmdArgs.push_back(
8727 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008728 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008729 CmdArgs.push_back(
8730 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8731 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008732 }
8733
Alexey Samsonov7811d192014-02-20 13:57:37 +00008734 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008735
Logan Chieneb9162f2014-06-26 14:23:45 +00008736 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008737 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008738}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008739
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008740// Try to find Exe from a Visual Studio distribution. This first tries to find
8741// an installed copy of Visual Studio and, failing that, looks in the PATH,
8742// making sure that whatever executable that's found is not a same-named exe
8743// from clang itself to prevent clang from falling back to itself.
8744static std::string FindVisualStudioExecutable(const ToolChain &TC,
8745 const char *Exe,
8746 const char *ClangProgramPath) {
8747 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8748 std::string visualStudioBinDir;
8749 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8750 visualStudioBinDir)) {
8751 SmallString<128> FilePath(visualStudioBinDir);
8752 llvm::sys::path::append(FilePath, Exe);
8753 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8754 return FilePath.str();
8755 }
8756
8757 return Exe;
8758}
8759
Douglas Katzman95354292015-06-23 20:42:09 +00008760void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8761 const InputInfo &Output,
8762 const InputInfoList &Inputs,
8763 const ArgList &Args,
8764 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008765 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008766 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008767
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008768 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8769 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008770 CmdArgs.push_back(
8771 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008772
8773 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008774 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008775 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008776
Zachary Turner10d75b22014-10-22 20:40:43 +00008777 if (!llvm::sys::Process::GetEnv("LIB")) {
8778 // If the VC environment hasn't been configured (perhaps because the user
8779 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008780 // the environment variable is set however, assume the user knows what
8781 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008782 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008783 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008784 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8785 SmallString<128> LibDir(VisualStudioDir);
8786 llvm::sys::path::append(LibDir, "VC", "lib");
8787 switch (MSVC.getArch()) {
8788 case llvm::Triple::x86:
8789 // x86 just puts the libraries directly in lib
8790 break;
8791 case llvm::Triple::x86_64:
8792 llvm::sys::path::append(LibDir, "amd64");
8793 break;
8794 case llvm::Triple::arm:
8795 llvm::sys::path::append(LibDir, "arm");
8796 break;
8797 default:
8798 break;
8799 }
8800 CmdArgs.push_back(
8801 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8802 }
8803
8804 std::string WindowsSdkLibPath;
8805 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8806 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8807 WindowsSdkLibPath.c_str()));
8808 }
8809
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008810 CmdArgs.push_back("-nologo");
8811
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008812 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008813 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008814
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008815 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008816 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008817 if (DLL) {
8818 CmdArgs.push_back(Args.MakeArgString("-dll"));
8819
8820 SmallString<128> ImplibName(Output.getFilename());
8821 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008822 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008823 }
8824
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008825 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008826 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008827 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008828 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008829 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008830 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008831 };
8832 for (const auto &Component : CompilerRTComponents)
8833 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008834 // Make sure the dynamic runtime thunk is not optimized out at link time
8835 // to ensure proper SEH handling.
8836 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008837 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008838 CmdArgs.push_back(
8839 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008840 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008841 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008842 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008843 };
8844 for (const auto &Component : CompilerRTComponents)
8845 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008846 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008847 }
8848
Hans Wennborg2e274592013-08-13 23:38:57 +00008849 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008850
Reid Kleckner337188f2014-09-16 19:22:00 +00008851 // Add filenames, libraries, and other linker inputs.
8852 for (const auto &Input : Inputs) {
8853 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008854 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008855 continue;
8856 }
8857
8858 const Arg &A = Input.getInputArg();
8859
8860 // Render -l options differently for the MSVC linker.
8861 if (A.getOption().matches(options::OPT_l)) {
8862 StringRef Lib = A.getValue();
8863 const char *LinkLibArg;
8864 if (Lib.endswith(".lib"))
8865 LinkLibArg = Args.MakeArgString(Lib);
8866 else
8867 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8868 CmdArgs.push_back(LinkLibArg);
8869 continue;
8870 }
8871
8872 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8873 // or -L. Render it, even if MSVC doesn't understand it.
8874 A.renderAsInput(Args, CmdArgs);
8875 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008876
Zachary Turner719f58c2014-12-01 23:06:47 +00008877 // We need to special case some linker paths. In the case of lld, we need to
8878 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8879 // linker, we need to use a special search algorithm.
8880 llvm::SmallString<128> linkPath;
8881 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8882 if (Linker.equals_lower("lld"))
8883 Linker = "lld-link";
8884
8885 if (Linker.equals_lower("link")) {
8886 // If we're using the MSVC linker, it's not sufficient to just use link
8887 // from the program PATH, because other environments like GnuWin32 install
8888 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008889 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008890 C.getDriver().getClangProgramPath());
8891 } else {
8892 linkPath = Linker;
8893 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008894 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008895 }
8896
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008897 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00008898 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008899}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008900
Douglas Katzman95354292015-06-23 20:42:09 +00008901void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
8902 const InputInfo &Output,
8903 const InputInfoList &Inputs,
8904 const ArgList &Args,
8905 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008906 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8907}
8908
Douglas Katzman95354292015-06-23 20:42:09 +00008909std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00008910 Compilation &C, const JobAction &JA, const InputInfo &Output,
8911 const InputInfoList &Inputs, const ArgList &Args,
8912 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008913 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008914 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008915 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008916 CmdArgs.push_back("/W0"); // No warnings.
8917
8918 // The goal is to be able to invoke this tool correctly based on
8919 // any flag accepted by clang-cl.
8920
8921 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008922 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008923
8924 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00008925 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
8926 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
8927 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008928 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8929 if (A->getOption().getID() == options::OPT_O0) {
8930 CmdArgs.push_back("/Od");
8931 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00008932 CmdArgs.push_back("/Og");
8933
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008934 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00008935 if (OptLevel == "s" || OptLevel == "z")
8936 CmdArgs.push_back("/Os");
8937 else
8938 CmdArgs.push_back("/Ot");
8939
8940 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008941 }
8942 }
David Majnemer015ce0f2015-07-27 07:32:11 +00008943 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
8944 options::OPT_fno_omit_frame_pointer))
8945 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
8946 ? "/Oy"
8947 : "/Oy-");
8948 if (!Args.hasArg(options::OPT_fwritable_strings))
8949 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008950
Nico Weber3f8dafb2015-03-12 19:37:10 +00008951 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00008952 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8953
David Majnemerf6072342014-07-01 22:24:56 +00008954 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8955 /*default=*/false))
8956 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008957 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8958 options::OPT_fno_function_sections))
8959 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8960 ? "/Gy"
8961 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008962 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8963 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008964 CmdArgs.push_back(
8965 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008966 if (Args.hasArg(options::OPT_fsyntax_only))
8967 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008968 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8969 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008970
Nico Weber3f8dafb2015-03-12 19:37:10 +00008971 std::vector<std::string> Includes =
8972 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008973 for (const auto &Include : Includes)
8974 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008975
Hans Wennborg87cfa712013-09-19 20:32:16 +00008976 // Flags that can simply be passed through.
8977 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8978 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008979 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00008980 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008981
8982 // The order of these flags is relevant, so pick the last one.
8983 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8984 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8985 A->render(Args, CmdArgs);
8986
Hans Wennborg87cfa712013-09-19 20:32:16 +00008987 // Input filename.
8988 assert(Inputs.size() == 1);
8989 const InputInfo &II = Inputs[0];
8990 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8991 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8992 if (II.isFilename())
8993 CmdArgs.push_back(II.getFilename());
8994 else
8995 II.getInputArg().renderAsInput(Args, CmdArgs);
8996
8997 // Output filename.
8998 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008999 const char *Fo =
9000 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009001 CmdArgs.push_back(Fo);
9002
Hans Wennborg188382e2013-09-20 18:16:35 +00009003 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009004 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9005 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009006 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009007 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009008}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009009
Yaron Keren1c0070c2015-07-02 04:45:27 +00009010/// MinGW Tools
9011void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9012 const InputInfo &Output,
9013 const InputInfoList &Inputs,
9014 const ArgList &Args,
9015 const char *LinkingOutput) const {
9016 claimNoWarnArgs(Args);
9017 ArgStringList CmdArgs;
9018
9019 if (getToolChain().getArch() == llvm::Triple::x86) {
9020 CmdArgs.push_back("--32");
9021 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9022 CmdArgs.push_back("--64");
9023 }
9024
9025 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9026
9027 CmdArgs.push_back("-o");
9028 CmdArgs.push_back(Output.getFilename());
9029
9030 for (const auto &II : Inputs)
9031 CmdArgs.push_back(II.getFilename());
9032
9033 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009034 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009035
9036 if (Args.hasArg(options::OPT_gsplit_dwarf))
9037 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9038 SplitDebugName(Args, Inputs[0]));
9039}
9040
9041void MinGW::Linker::AddLibGCC(const ArgList &Args,
9042 ArgStringList &CmdArgs) const {
9043 if (Args.hasArg(options::OPT_mthreads))
9044 CmdArgs.push_back("-lmingwthrd");
9045 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009046
9047 // Add libgcc or compiler-rt.
9048 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9049
Yaron Keren1c0070c2015-07-02 04:45:27 +00009050 CmdArgs.push_back("-lmoldname");
9051 CmdArgs.push_back("-lmingwex");
9052 CmdArgs.push_back("-lmsvcrt");
9053}
9054
9055void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9056 const InputInfo &Output,
9057 const InputInfoList &Inputs,
9058 const ArgList &Args,
9059 const char *LinkingOutput) const {
9060 const ToolChain &TC = getToolChain();
9061 const Driver &D = TC.getDriver();
9062 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9063
9064 ArgStringList CmdArgs;
9065
9066 // Silence warning for "clang -g foo.o -o foo"
9067 Args.ClaimAllArgs(options::OPT_g_Group);
9068 // and "clang -emit-llvm foo.o -o foo"
9069 Args.ClaimAllArgs(options::OPT_emit_llvm);
9070 // and for "clang -w foo.o -o foo". Other warning options are already
9071 // handled somewhere else.
9072 Args.ClaimAllArgs(options::OPT_w);
9073
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009074 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9075 if (LinkerName.equals_lower("lld")) {
9076 CmdArgs.push_back("-flavor");
9077 CmdArgs.push_back("gnu");
9078 }
9079
Yaron Keren1c0070c2015-07-02 04:45:27 +00009080 if (!D.SysRoot.empty())
9081 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9082
9083 if (Args.hasArg(options::OPT_s))
9084 CmdArgs.push_back("-s");
9085
9086 CmdArgs.push_back("-m");
9087 if (TC.getArch() == llvm::Triple::x86)
9088 CmdArgs.push_back("i386pe");
9089 if (TC.getArch() == llvm::Triple::x86_64)
9090 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009091 if (TC.getArch() == llvm::Triple::arm)
9092 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009093
9094 if (Args.hasArg(options::OPT_mwindows)) {
9095 CmdArgs.push_back("--subsystem");
9096 CmdArgs.push_back("windows");
9097 } else if (Args.hasArg(options::OPT_mconsole)) {
9098 CmdArgs.push_back("--subsystem");
9099 CmdArgs.push_back("console");
9100 }
9101
9102 if (Args.hasArg(options::OPT_static))
9103 CmdArgs.push_back("-Bstatic");
9104 else {
9105 if (Args.hasArg(options::OPT_mdll))
9106 CmdArgs.push_back("--dll");
9107 else if (Args.hasArg(options::OPT_shared))
9108 CmdArgs.push_back("--shared");
9109 CmdArgs.push_back("-Bdynamic");
9110 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9111 CmdArgs.push_back("-e");
9112 if (TC.getArch() == llvm::Triple::x86)
9113 CmdArgs.push_back("_DllMainCRTStartup@12");
9114 else
9115 CmdArgs.push_back("DllMainCRTStartup");
9116 CmdArgs.push_back("--enable-auto-image-base");
9117 }
9118 }
9119
9120 CmdArgs.push_back("-o");
9121 CmdArgs.push_back(Output.getFilename());
9122
9123 Args.AddAllArgs(CmdArgs, options::OPT_e);
9124 // FIXME: add -N, -n flags
9125 Args.AddLastArg(CmdArgs, options::OPT_r);
9126 Args.AddLastArg(CmdArgs, options::OPT_s);
9127 Args.AddLastArg(CmdArgs, options::OPT_t);
9128 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9129 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9130
9131 if (!Args.hasArg(options::OPT_nostdlib) &&
9132 !Args.hasArg(options::OPT_nostartfiles)) {
9133 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9134 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9135 } else {
9136 if (Args.hasArg(options::OPT_municode))
9137 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9138 else
9139 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9140 }
9141 if (Args.hasArg(options::OPT_pg))
9142 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9143 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9144 }
9145
9146 Args.AddAllArgs(CmdArgs, options::OPT_L);
9147 const ToolChain::path_list Paths = TC.getFilePaths();
9148 for (const auto &Path : Paths)
9149 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9150
9151 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9152
9153 // TODO: Add ASan stuff here
9154
9155 // TODO: Add profile stuff here
9156
9157 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9158 !Args.hasArg(options::OPT_nodefaultlibs)) {
9159 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9160 !Args.hasArg(options::OPT_static);
9161 if (OnlyLibstdcxxStatic)
9162 CmdArgs.push_back("-Bstatic");
9163 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9164 if (OnlyLibstdcxxStatic)
9165 CmdArgs.push_back("-Bdynamic");
9166 }
9167
9168 if (!Args.hasArg(options::OPT_nostdlib)) {
9169 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9170 if (Args.hasArg(options::OPT_static))
9171 CmdArgs.push_back("--start-group");
9172
9173 if (Args.hasArg(options::OPT_fstack_protector) ||
9174 Args.hasArg(options::OPT_fstack_protector_strong) ||
9175 Args.hasArg(options::OPT_fstack_protector_all)) {
9176 CmdArgs.push_back("-lssp_nonshared");
9177 CmdArgs.push_back("-lssp");
9178 }
9179 if (Args.hasArg(options::OPT_fopenmp))
9180 CmdArgs.push_back("-lgomp");
9181
9182 AddLibGCC(Args, CmdArgs);
9183
9184 if (Args.hasArg(options::OPT_pg))
9185 CmdArgs.push_back("-lgmon");
9186
Yaron Kerenadce68e2015-07-06 18:52:19 +00009187 if (Args.hasArg(options::OPT_pthread))
9188 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009189
9190 // add system libraries
9191 if (Args.hasArg(options::OPT_mwindows)) {
9192 CmdArgs.push_back("-lgdi32");
9193 CmdArgs.push_back("-lcomdlg32");
9194 }
9195 CmdArgs.push_back("-ladvapi32");
9196 CmdArgs.push_back("-lshell32");
9197 CmdArgs.push_back("-luser32");
9198 CmdArgs.push_back("-lkernel32");
9199
9200 if (Args.hasArg(options::OPT_static))
9201 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009202 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009203 AddLibGCC(Args, CmdArgs);
9204 }
9205
9206 if (!Args.hasArg(options::OPT_nostartfiles)) {
9207 // Add crtfastmath.o if available and fast math is enabled.
9208 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9209
9210 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9211 }
9212 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009213 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009214 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009215}
9216
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009217/// XCore Tools
9218// We pass assemble and link construction to the xcc tool.
9219
Douglas Katzman95354292015-06-23 20:42:09 +00009220void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9221 const InputInfo &Output,
9222 const InputInfoList &Inputs,
9223 const ArgList &Args,
9224 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009225 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009226 ArgStringList CmdArgs;
9227
9228 CmdArgs.push_back("-o");
9229 CmdArgs.push_back(Output.getFilename());
9230
9231 CmdArgs.push_back("-c");
9232
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009233 if (Args.hasArg(options::OPT_v))
9234 CmdArgs.push_back("-v");
9235
Robert Lytton894d25c2014-05-02 09:33:25 +00009236 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9237 if (!A->getOption().matches(options::OPT_g0))
9238 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009239
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009240 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9241 false))
9242 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009244 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009245
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009246 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009247 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009248
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009249 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009250 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009251}
9252
Douglas Katzman95354292015-06-23 20:42:09 +00009253void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9254 const InputInfo &Output,
9255 const InputInfoList &Inputs,
9256 const ArgList &Args,
9257 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009258 ArgStringList CmdArgs;
9259
9260 if (Output.isFilename()) {
9261 CmdArgs.push_back("-o");
9262 CmdArgs.push_back(Output.getFilename());
9263 } else {
9264 assert(Output.isNothing() && "Invalid output.");
9265 }
9266
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009267 if (Args.hasArg(options::OPT_v))
9268 CmdArgs.push_back("-v");
9269
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009270 // Pass -fexceptions through to the linker if it was present.
9271 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9272 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009273 CmdArgs.push_back("-fexceptions");
9274
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009275 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9276
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009277 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009279}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009280
Douglas Katzman95354292015-06-23 20:42:09 +00009281void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9282 const InputInfo &Output,
9283 const InputInfoList &Inputs,
9284 const ArgList &Args,
9285 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009286 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009287 const auto &TC =
9288 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9289 ArgStringList CmdArgs;
9290 const char *Exec;
9291
9292 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009293 default:
9294 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009295 case llvm::Triple::arm:
9296 case llvm::Triple::thumb:
9297 break;
9298 case llvm::Triple::x86:
9299 CmdArgs.push_back("--32");
9300 break;
9301 case llvm::Triple::x86_64:
9302 CmdArgs.push_back("--64");
9303 break;
9304 }
9305
9306 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9307
9308 CmdArgs.push_back("-o");
9309 CmdArgs.push_back(Output.getFilename());
9310
9311 for (const auto &Input : Inputs)
9312 CmdArgs.push_back(Input.getFilename());
9313
9314 const std::string Assembler = TC.GetProgramPath("as");
9315 Exec = Args.MakeArgString(Assembler);
9316
Justin Bognerd3371d82015-07-17 03:35:54 +00009317 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009318}
9319
Douglas Katzman95354292015-06-23 20:42:09 +00009320void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9321 const InputInfo &Output,
9322 const InputInfoList &Inputs,
9323 const ArgList &Args,
9324 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009325 const auto &TC =
9326 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9327 const llvm::Triple &T = TC.getTriple();
9328 const Driver &D = TC.getDriver();
9329 SmallString<128> EntryPoint;
9330 ArgStringList CmdArgs;
9331 const char *Exec;
9332
9333 // Silence warning for "clang -g foo.o -o foo"
9334 Args.ClaimAllArgs(options::OPT_g_Group);
9335 // and "clang -emit-llvm foo.o -o foo"
9336 Args.ClaimAllArgs(options::OPT_emit_llvm);
9337 // and for "clang -w foo.o -o foo"
9338 Args.ClaimAllArgs(options::OPT_w);
9339 // Other warning options are already handled somewhere else.
9340
9341 if (!D.SysRoot.empty())
9342 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9343
9344 if (Args.hasArg(options::OPT_pie))
9345 CmdArgs.push_back("-pie");
9346 if (Args.hasArg(options::OPT_rdynamic))
9347 CmdArgs.push_back("-export-dynamic");
9348 if (Args.hasArg(options::OPT_s))
9349 CmdArgs.push_back("--strip-all");
9350
9351 CmdArgs.push_back("-m");
9352 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009353 default:
9354 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009355 case llvm::Triple::arm:
9356 case llvm::Triple::thumb:
9357 // FIXME: this is incorrect for WinCE
9358 CmdArgs.push_back("thumb2pe");
9359 break;
9360 case llvm::Triple::x86:
9361 CmdArgs.push_back("i386pe");
9362 EntryPoint.append("_");
9363 break;
9364 case llvm::Triple::x86_64:
9365 CmdArgs.push_back("i386pep");
9366 break;
9367 }
9368
9369 if (Args.hasArg(options::OPT_shared)) {
9370 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009371 default:
9372 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009373 case llvm::Triple::arm:
9374 case llvm::Triple::thumb:
9375 case llvm::Triple::x86_64:
9376 EntryPoint.append("_DllMainCRTStartup");
9377 break;
9378 case llvm::Triple::x86:
9379 EntryPoint.append("_DllMainCRTStartup@12");
9380 break;
9381 }
9382
9383 CmdArgs.push_back("-shared");
9384 CmdArgs.push_back("-Bdynamic");
9385
9386 CmdArgs.push_back("--enable-auto-image-base");
9387
9388 CmdArgs.push_back("--entry");
9389 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9390 } else {
9391 EntryPoint.append("mainCRTStartup");
9392
9393 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9394 : "-Bdynamic");
9395
9396 if (!Args.hasArg(options::OPT_nostdlib) &&
9397 !Args.hasArg(options::OPT_nostartfiles)) {
9398 CmdArgs.push_back("--entry");
9399 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9400 }
9401
9402 // FIXME: handle subsystem
9403 }
9404
9405 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009406 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009407
9408 CmdArgs.push_back("-o");
9409 CmdArgs.push_back(Output.getFilename());
9410
9411 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9412 SmallString<261> ImpLib(Output.getFilename());
9413 llvm::sys::path::replace_extension(ImpLib, ".lib");
9414
9415 CmdArgs.push_back("--out-implib");
9416 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9417 }
9418
9419 if (!Args.hasArg(options::OPT_nostdlib) &&
9420 !Args.hasArg(options::OPT_nostartfiles)) {
9421 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9422 const char *CRTBegin;
9423
9424 CRTBegin =
9425 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9426 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9427 }
9428
9429 Args.AddAllArgs(CmdArgs, options::OPT_L);
9430
9431 const auto &Paths = TC.getFilePaths();
9432 for (const auto &Path : Paths)
9433 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9434
9435 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9436
9437 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9438 !Args.hasArg(options::OPT_nodefaultlibs)) {
9439 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9440 !Args.hasArg(options::OPT_static);
9441 if (StaticCXX)
9442 CmdArgs.push_back("-Bstatic");
9443 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9444 if (StaticCXX)
9445 CmdArgs.push_back("-Bdynamic");
9446 }
9447
9448 if (!Args.hasArg(options::OPT_nostdlib)) {
9449 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9450 // TODO handle /MT[d] /MD[d]
9451 CmdArgs.push_back("-lmsvcrt");
9452 AddRunTimeLibs(TC, D, CmdArgs, Args);
9453 }
9454 }
9455
9456 const std::string Linker = TC.GetProgramPath("ld");
9457 Exec = Args.MakeArgString(Linker);
9458
Justin Bognerd3371d82015-07-17 03:35:54 +00009459 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009460}
Douglas Katzman84a75642015-06-19 14:55:19 +00009461
Douglas Katzman95354292015-06-23 20:42:09 +00009462void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9463 const InputInfo &Output,
9464 const InputInfoList &Inputs,
9465 const ArgList &Args,
9466 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009467
9468 ArgStringList CmdArgs;
9469
9470 assert(Inputs.size() == 1);
9471 const InputInfo &II = Inputs[0];
9472 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9473 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9474
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009475 // Append all -I, -iquote, -isystem paths, and defines/undefines.
Douglas Katzman84a75642015-06-19 14:55:19 +00009476 // These are spelled the same way in clang and moviCompile.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009477 Args.AddAllArgs(CmdArgs,
9478 {options::OPT_clang_i_Group, options::OPT_D, options::OPT_U});
Douglas Katzman84a75642015-06-19 14:55:19 +00009479
9480 CmdArgs.push_back("-DMYRIAD2");
9481 CmdArgs.push_back("-mcpu=myriad2");
9482 CmdArgs.push_back("-S");
9483
9484 // Any -O option passes through without translation. What about -Ofast ?
9485 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9486 A->render(Args, CmdArgs);
9487
9488 if (Args.hasFlag(options::OPT_ffunction_sections,
9489 options::OPT_fno_function_sections)) {
9490 CmdArgs.push_back("-ffunction-sections");
9491 }
9492 if (Args.hasArg(options::OPT_fno_inline_functions))
9493 CmdArgs.push_back("-fno-inline-functions");
9494
9495 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9496
9497 CmdArgs.push_back(II.getFilename());
9498 CmdArgs.push_back("-o");
9499 CmdArgs.push_back(Output.getFilename());
9500
9501 std::string Exec =
9502 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009503 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9504 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009505}
9506
Douglas Katzman95354292015-06-23 20:42:09 +00009507void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9508 const InputInfo &Output,
9509 const InputInfoList &Inputs,
9510 const ArgList &Args,
9511 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009512 ArgStringList CmdArgs;
9513
9514 assert(Inputs.size() == 1);
9515 const InputInfo &II = Inputs[0];
9516 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9517 assert(Output.getType() == types::TY_Object);
9518
9519 CmdArgs.push_back("-no6thSlotCompression");
9520 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9521 CmdArgs.push_back("-noSPrefixing");
9522 CmdArgs.push_back("-a"); // Mystery option.
9523 for (auto Arg : Args.filtered(options::OPT_I)) {
9524 Arg->claim();
9525 CmdArgs.push_back(
9526 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9527 }
9528 CmdArgs.push_back("-elf"); // Output format.
9529 CmdArgs.push_back(II.getFilename());
9530 CmdArgs.push_back(
9531 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9532
9533 std::string Exec =
9534 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009535 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9536 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009537}