blob: 6947219e914aebf74b08179d22b0ee4a29558169 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
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"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.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"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000055static const char *getSparcAsmModeForCPU(StringRef Name,
56 const llvm::Triple &Triple) {
57 if (Triple.getArch() == llvm::Triple::sparcv9) {
58 return llvm::StringSwitch<const char *>(Name)
59 .Case("niagara", "-Av9b")
60 .Case("niagara2", "-Av9b")
61 .Case("niagara3", "-Av9d")
62 .Case("niagara4", "-Av9d")
63 .Default("-Av9");
64 } else {
65 return llvm::StringSwitch<const char *>(Name)
66 .Case("v8", "-Av8")
67 .Case("supersparc", "-Av8")
68 .Case("sparclite", "-Asparclite")
69 .Case("f934", "-Asparclite")
70 .Case("hypersparc", "-Av8")
71 .Case("sparclite86x", "-Asparclite")
72 .Case("sparclet", "-Asparclet")
73 .Case("tsc701", "-Asparclet")
74 .Case("v9", "-Av8plus")
75 .Case("ultrasparc", "-Av8plus")
76 .Case("ultrasparc3", "-Av8plus")
77 .Case("niagara", "-Av8plusb")
78 .Case("niagara2", "-Av8plusb")
79 .Case("niagara3", "-Av8plusd")
80 .Case("niagara4", "-Av8plusd")
81 .Default("-Av8");
82 }
83}
84
Daniel Dunbar64198ef2009-09-10 01:21:05 +000085/// CheckPreprocessingOptions - Perform some validation of preprocessing
86/// arguments that is shared with gcc.
87static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000088 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
89 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
90 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000091 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000092 << A->getBaseArg().getAsString(Args)
93 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
94 }
95 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000096}
97
Daniel Dunbar4eadb602009-09-10 01:21:12 +000098/// CheckCodeGenerationOptions - Perform some validation of code generation
99/// arguments that is shared with gcc.
100static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
101 // In gcc, only ARM checks this, but it seems reasonable to check universally.
102 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000103 if (const Arg *A =
104 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
105 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
106 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000107}
108
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000109// Add backslashes to escape spaces and other backslashes.
110// This is used for the space-separated argument list specified with
111// the -dwarf-debug-flags option.
112static void EscapeSpacesAndBackslashes(const char *Arg,
113 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000114 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000115 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000116 default:
117 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000118 case ' ':
119 case '\\':
120 Res.push_back('\\');
121 break;
122 }
123 Res.push_back(*Arg);
124 }
125}
126
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000127// Quote target names for inclusion in GNU Make dependency files.
128// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000129static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000130 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
131 switch (Target[i]) {
132 case ' ':
133 case '\t':
134 // Escape the preceding backslashes
135 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
136 Res.push_back('\\');
137
138 // Escape the space/tab
139 Res.push_back('\\');
140 break;
141 case '$':
142 Res.push_back('$');
143 break;
144 case '#':
145 Res.push_back('\\');
146 break;
147 default:
148 break;
149 }
150
151 Res.push_back(Target[i]);
152 }
153}
154
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000155static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
156 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000157 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 bool CombinedArg = false;
159
Bill Wendling281ca292012-03-12 21:22:35 +0000160 if (!DirList)
161 return; // Nothing to do.
162
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 StringRef Name(ArgName);
164 if (Name.equals("-I") || Name.equals("-L"))
165 CombinedArg = true;
166
Bill Wendling281ca292012-03-12 21:22:35 +0000167 StringRef Dirs(DirList);
168 if (Dirs.empty()) // Empty string should not add '.'.
169 return;
170
171 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000172 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000173 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000174 if (CombinedArg) {
175 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
176 } else {
177 CmdArgs.push_back(ArgName);
178 CmdArgs.push_back(".");
179 }
Bill Wendling281ca292012-03-12 21:22:35 +0000180 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000182 CmdArgs.push_back(
183 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 } else {
185 CmdArgs.push_back(ArgName);
186 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
187 }
Bill Wendling281ca292012-03-12 21:22:35 +0000188 }
Nico Weber89355782012-03-19 15:00:03 +0000189 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191
192 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000193 if (CombinedArg) {
194 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
195 } else {
196 CmdArgs.push_back(ArgName);
197 CmdArgs.push_back(".");
198 }
Bill Wendling281ca292012-03-12 21:22:35 +0000199 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000200 if (CombinedArg) {
201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
207}
208
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000209static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
210 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 const Driver &D = TC.getDriver();
212
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000213 // Add extra linker input arguments which are not treated as inputs
214 // (constructed via -Xarch_).
215 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
216
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000217 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000218 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000219 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000220 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000221
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000222 // Add filenames immediately.
223 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000224 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000225 continue;
226 }
227
228 // Otherwise, this is a linker input argument.
229 const Arg &A = II.getInputArg();
230
231 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000232 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000233 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000234 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000235 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000236 else if (A.getOption().matches(options::OPT_z)) {
237 // Pass -z prefix for gcc linker compatibility.
238 A.claim();
239 A.render(Args, CmdArgs);
240 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000241 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000242 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000243 }
Bill Wendling281ca292012-03-12 21:22:35 +0000244
245 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000246 // and only supported on native toolchains.
247 if (!TC.isCrossCompiling())
248 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000249}
250
John McCall31168b02011-06-15 23:02:42 +0000251/// \brief Determine whether Objective-C automated reference counting is
252/// enabled.
253static bool isObjCAutoRefCount(const ArgList &Args) {
254 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
255}
256
Ted Kremeneke65b0862012-03-06 20:05:56 +0000257/// \brief Determine whether we are linking the ObjC runtime.
258static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000259 if (isObjCAutoRefCount(Args)) {
260 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000261 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000262 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000263 return Args.hasArg(options::OPT_fobjc_link_runtime);
264}
265
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000266static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000267 // Don't forward inputs from the original command line. They are added from
268 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000269 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000270 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000271}
272
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000273void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
274 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 ArgStringList &CmdArgs,
276 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000277 const InputInfoList &Inputs,
278 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000279 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000280
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000281 CheckPreprocessingOptions(D, Args);
282
283 Args.AddLastArg(CmdArgs, options::OPT_C);
284 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000285
286 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000287 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 (A = Args.getLastArg(options::OPT_MD)) ||
289 (A = Args.getLastArg(options::OPT_MMD))) {
290 // Determine the output location.
291 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000292 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000293 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000294 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000295 } else if (Output.getType() == types::TY_Dependencies) {
296 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000297 } else if (A->getOption().matches(options::OPT_M) ||
298 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299 DepFile = "-";
300 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000301 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000302 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 }
304 CmdArgs.push_back("-dependency-file");
305 CmdArgs.push_back(DepFile);
306
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000307 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000308 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
309 const char *DepTarget;
310
311 // If user provided -o, that is the dependency target, except
312 // when we are only generating a dependency file.
313 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
314 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000315 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 } else {
317 // Otherwise derive from the base input.
318 //
319 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000321 llvm::sys::path::replace_extension(P, "o");
322 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
325 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000326 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000327 QuoteTarget(DepTarget, Quoted);
328 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000329 }
330
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000331 if (A->getOption().matches(options::OPT_M) ||
332 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000333 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000334 if ((isa<PrecompileJobAction>(JA) &&
335 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
336 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000337 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338 }
339
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000340 if (Args.hasArg(options::OPT_MG)) {
341 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000342 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000343 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000344 CmdArgs.push_back("-MG");
345 }
346
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000348 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349
350 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000351 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000352 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000353
Daniel Dunbara442fd52010-06-11 22:00:13 +0000354 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000356 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000357 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000358 CmdArgs.push_back(Args.MakeArgString(Quoted));
359
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000361 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000362 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000363 }
364 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 // Add -i* options, and automatically translate to
367 // -include-pch/-include-pth for transparent PCH support. It's
368 // wonky, but we include looking for .gch so we can support seamless
369 // replacement into a build system already set up to be generating
370 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000371 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000372 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000417 D.Diag(diag::warn_drv_pch_not_first_include) << P
418 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000428 Args.AddAllArgs(CmdArgs,
429 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
430 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000432 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Artem Belevichfa11ab52015-11-17 22:28:46 +0000470 // Optional AuxToolChain indicates that we need to include headers
471 // for more than one target. If that's the case, add include paths
472 // from AuxToolChain right after include paths of the same kind for
473 // the current target.
474
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000475 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000476 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000477 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000478 if (AuxToolChain)
479 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
480 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000481
482 // Add system include arguments.
483 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000484 if (AuxToolChain)
485 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
486
487 // Add CUDA include arguments, if needed.
488 if (types::isCuda(Inputs[0].getType()))
489 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000490}
491
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492// FIXME: Move to target hook.
493static bool isSignedCharDefault(const llvm::Triple &Triple) {
494 switch (Triple.getArch()) {
495 default:
496 return true;
497
Tim Northover9bb857a2013-01-31 12:13:10 +0000498 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000499 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000500 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000501 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000502 case llvm::Triple::thumb:
503 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000504 if (Triple.isOSDarwin() || Triple.isOSWindows())
505 return true;
506 return false;
507
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000508 case llvm::Triple::ppc:
509 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000510 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000511 return true;
512 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000513
David Majnemerdcecd932015-05-23 19:23:55 +0000514 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000515 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000516 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000517 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000518 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000519 }
520}
521
Robert Lytton0e076492013-08-13 09:43:10 +0000522static bool isNoCommonDefault(const llvm::Triple &Triple) {
523 switch (Triple.getArch()) {
524 default:
525 return false;
526
527 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000528 case llvm::Triple::wasm32:
529 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000530 return true;
531 }
532}
533
Renato Goline17c5802015-07-27 23:44:42 +0000534// ARM tools start.
535
536// Get SubArch (vN).
537static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
538 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000539 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000540}
541
542// True if M-profile.
543static bool isARMMProfile(const llvm::Triple &Triple) {
544 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000545 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000546 return Profile == llvm::ARM::PK_M;
547}
548
549// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000550static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
551 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000552 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
553 CPU = A->getValue();
554 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
555 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000556 if (!FromAs)
557 return;
558
559 for (const Arg *A :
560 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
561 StringRef Value = A->getValue();
562 if (Value.startswith("-mcpu="))
563 CPU = Value.substr(6);
564 if (Value.startswith("-march="))
565 Arch = Value.substr(7);
566 }
Renato Goline17c5802015-07-27 23:44:42 +0000567}
568
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000569// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000570// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000571static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000572 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000573 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000574 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
575 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000576 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
577}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000578
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000579// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000580static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000581 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000582 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000583 unsigned FPUID = llvm::ARM::parseFPU(FPU);
584 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000585 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
586}
587
Bradley Smithbbf5a002015-11-18 16:33:48 +0000588// Decode ARM features from string like +[no]featureA+[no]featureB+...
589static bool DecodeARMFeatures(const Driver &D, StringRef text,
590 std::vector<const char *> &Features) {
591 SmallVector<StringRef, 8> Split;
592 text.split(Split, StringRef("+"), -1, false);
593
594 for (StringRef Feature : Split) {
595 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
596 if (FeatureName)
597 Features.push_back(FeatureName);
598 else
599 return false;
600 }
601 return true;
602}
603
Renato Golin7c542b42015-07-27 23:44:45 +0000604// Check if -march is valid by checking if it can be canonicalised and parsed.
605// getARMArch is used here instead of just checking the -march value in order
606// to handle -march=native correctly.
607static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000608 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000609 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000610 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000611 std::pair<StringRef, StringRef> Split = ArchName.split("+");
612
Renato Goline17c5802015-07-27 23:44:42 +0000613 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000614 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
615 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000617}
618
Renato Golin7c542b42015-07-27 23:44:45 +0000619// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
620static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
621 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000622 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000623 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000624 std::pair<StringRef, StringRef> Split = CPUName.split("+");
625
Renato Goline17c5802015-07-27 23:44:42 +0000626 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
628 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000629 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000630}
631
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000632static bool useAAPCSForMachO(const llvm::Triple &T) {
633 // The backend is hardwired to assume AAPCS for M-class processors, ensure
634 // the frontend matches that.
635 return T.getEnvironment() == llvm::Triple::EABI ||
636 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
637}
638
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000639// Select the float ABI as determined by -msoft-float, -mhard-float, and
640// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000641arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
642 const Driver &D = TC.getDriver();
643 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000644 auto SubArch = getARMSubArchVersionNumber(Triple);
645 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000646 if (Arg *A =
647 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
648 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000649 if (A->getOption().matches(options::OPT_msoft_float)) {
650 ABI = FloatABI::Soft;
651 } else if (A->getOption().matches(options::OPT_mhard_float)) {
652 ABI = FloatABI::Hard;
653 } else {
654 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
655 .Case("soft", FloatABI::Soft)
656 .Case("softfp", FloatABI::SoftFP)
657 .Case("hard", FloatABI::Hard)
658 .Default(FloatABI::Invalid);
659 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000660 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000661 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 }
663 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000664
665 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
666 // "apcs-gnu".
667 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000668 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000669 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
670 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000671 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000672 }
673
674 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000675 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000676 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000677 case llvm::Triple::Darwin:
678 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000679 case llvm::Triple::IOS:
680 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000681 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000682 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000683 break;
684 }
Tim Northover756447a2015-10-30 16:30:36 +0000685 case llvm::Triple::WatchOS:
686 ABI = FloatABI::Hard;
687 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000688
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000689 // FIXME: this is invalid for WindowsCE
690 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000691 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000692 break;
693
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000694 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000695 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000696 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000697 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000698 break;
699 default:
700 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000701 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000702 break;
703 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000704 break;
705
Daniel Dunbar78485922009-09-10 23:00:09 +0000706 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000707 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000708 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 case llvm::Triple::EABIHF:
710 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000711 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000712 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000713 case llvm::Triple::EABI:
714 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000716 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000717 case llvm::Triple::Android:
718 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000719 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000720 default:
721 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000722 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000723 if (Triple.getOS() != llvm::Triple::UnknownOS ||
724 !Triple.isOSBinFormatMachO())
725 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000726 break;
727 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000728 }
729 }
730
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000731 assert(ABI != FloatABI::Invalid && "must select an ABI");
732 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000733}
734
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000735static void getARMTargetFeatures(const ToolChain &TC,
736 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000737 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000738 std::vector<const char *> &Features,
739 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000740 const Driver &D = TC.getDriver();
741
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000742 bool KernelOrKext =
743 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000744 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000745 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
746 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
747
Nico Weber6e0ebae2015-04-29 21:16:40 +0000748 if (!ForAS) {
749 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
750 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
751 // stripped out by the ARM target. We should probably pass this a new
752 // -target-option, which is handled by the -cc1/-cc1as invocation.
753 //
754 // FIXME2: For consistency, it would be ideal if we set up the target
755 // machine state the same when using the frontend or the assembler. We don't
756 // currently do that for the assembler, we pass the options directly to the
757 // backend and never even instantiate the frontend TargetInfo. If we did,
758 // and used its handleTargetFeatures hook, then we could ensure the
759 // assembler and the frontend behave the same.
760
761 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000762 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000763 Features.push_back("+soft-float");
764
765 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000766 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000768 } else {
769 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
770 // to the assembler correctly.
771 for (const Arg *A :
772 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
773 StringRef Value = A->getValue();
774 if (Value.startswith("-mfpu=")) {
775 WaFPU = A;
776 } else if (Value.startswith("-mcpu=")) {
777 WaCPU = A;
778 } else if (Value.startswith("-mhwdiv=")) {
779 WaHDiv = A;
780 } else if (Value.startswith("-march=")) {
781 WaArch = A;
782 }
783 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000784 }
785
Renato Golin7c542b42015-07-27 23:44:45 +0000786 // Check -march. ClangAs gives preference to -Wa,-march=.
787 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000788 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000789 if (WaArch) {
790 if (ArchArg)
791 D.Diag(clang::diag::warn_drv_unused_argument)
792 << ArchArg->getAsString(Args);
793 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000794 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000795 // FIXME: Set Arch.
796 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
797 } else if (ArchArg) {
798 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000799 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000800 }
801
Renato Golin7c542b42015-07-27 23:44:45 +0000802 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
803 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000804 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000805 if (WaCPU) {
806 if (CPUArg)
807 D.Diag(clang::diag::warn_drv_unused_argument)
808 << CPUArg->getAsString(Args);
809 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000810 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000811 } else if (CPUArg) {
812 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000813 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000814 }
John Brawna95c1a82015-05-08 12:52:18 +0000815
Renato Golin23459c62015-07-30 16:40:17 +0000816 // Add CPU features for generic CPUs
817 if (CPUName == "native") {
818 llvm::StringMap<bool> HostFeatures;
819 if (llvm::sys::getHostCPUFeatures(HostFeatures))
820 for (auto &F : HostFeatures)
821 Features.push_back(
822 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
823 }
824
825 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
826 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
827 if (WaFPU) {
828 if (FPUArg)
829 D.Diag(clang::diag::warn_drv_unused_argument)
830 << FPUArg->getAsString(Args);
831 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
832 Features);
833 } else if (FPUArg) {
834 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
835 }
836
837 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
838 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
839 if (WaHDiv) {
840 if (HDivArg)
841 D.Diag(clang::diag::warn_drv_unused_argument)
842 << HDivArg->getAsString(Args);
843 getARMHWDivFeatures(D, WaHDiv, Args,
844 StringRef(WaHDiv->getValue()).substr(8), Features);
845 } else if (HDivArg)
846 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
847
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000848 // Setting -msoft-float effectively disables NEON because of the GCC
849 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000850 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000851 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000852 // Also need to explicitly disable features which imply NEON.
853 Features.push_back("-crypto");
854 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000855
Eric Christopher269c2a22015-04-04 03:34:43 +0000856 // En/disable crc code generation.
857 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000858 if (A->getOption().matches(options::OPT_mcrc))
859 Features.push_back("+crc");
860 else
861 Features.push_back("-crc");
862 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000863
864 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
865 Features.insert(Features.begin(), "+v8.1a");
866 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000867
Akira Hatanakac2694822015-07-07 08:28:42 +0000868 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
869 // neither options are specified, see if we are compiling for kernel/kext and
870 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000871 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
872 options::OPT_mno_long_calls)) {
873 if (A->getOption().matches(options::OPT_mlong_calls))
874 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000875 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
876 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000877 Features.push_back("+long-calls");
878 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000879
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000880 // Kernel code has more strict alignment requirements.
881 if (KernelOrKext)
882 Features.push_back("+strict-align");
883 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
884 options::OPT_munaligned_access)) {
885 if (A->getOption().matches(options::OPT_munaligned_access)) {
886 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
887 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
888 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
889 } else
890 Features.push_back("+strict-align");
891 } else {
892 // Assume pre-ARMv6 doesn't support unaligned accesses.
893 //
894 // ARMv6 may or may not support unaligned accesses depending on the
895 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
896 // Darwin and NetBSD targets support unaligned accesses, and others don't.
897 //
898 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
899 // which raises an alignment fault on unaligned accesses. Linux
900 // defaults this bit to 0 and handles it as a system-wide (not
901 // per-process) setting. It is therefore safe to assume that ARMv7+
902 // Linux targets support unaligned accesses. The same goes for NaCl.
903 //
904 // The above behavior is consistent with GCC.
905 int VersionNum = getARMSubArchVersionNumber(Triple);
906 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000907 if (VersionNum < 6 ||
908 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000909 Features.push_back("+strict-align");
910 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
911 if (VersionNum < 7)
912 Features.push_back("+strict-align");
913 } else
914 Features.push_back("+strict-align");
915 }
916
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000917 // llvm does not support reserving registers in general. There is support
918 // for reserving r9 on ARM though (defined as a platform-specific register
919 // in ARM EABI).
920 if (Args.hasArg(options::OPT_ffixed_r9))
921 Features.push_back("+reserve-r9");
922
Akira Hatanaka580efb22015-07-16 00:43:00 +0000923 // The kext linker doesn't know how to deal with movw/movt.
924 if (KernelOrKext)
925 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000926}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000927
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000928void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
929 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000930 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000931 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000932 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000933 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000934 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000935 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000936 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000937 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000938 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000939 } else if (Triple.isWatchOS()) {
940 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000941 } else {
942 ABIName = "apcs-gnu";
943 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000944 } else if (Triple.isOSWindows()) {
945 // FIXME: this is invalid for WindowsCE
946 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000947 } else {
948 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000949 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000950 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000951 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000952 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000953 ABIName = "aapcs-linux";
954 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000955 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000956 case llvm::Triple::EABI:
957 ABIName = "aapcs";
958 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000959 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000960 if (Triple.getOS() == llvm::Triple::NetBSD)
961 ABIName = "apcs-gnu";
962 else
963 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000964 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 }
966 }
967 CmdArgs.push_back("-target-abi");
968 CmdArgs.push_back(ABIName);
969
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000970 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000971 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000972 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000973 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000974 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000975 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000976 CmdArgs.push_back("-mfloat-abi");
977 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000978 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000979 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000980 CmdArgs.push_back("-mfloat-abi");
981 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000982 } else {
983 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000984 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000985 CmdArgs.push_back("-mfloat-abi");
986 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000987 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000988
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000989 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000990 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
991 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000992 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000993 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000994 CmdArgs.push_back("-arm-global-merge=false");
995 else
996 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000997 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000998
Bob Wilson9c8af452013-04-11 18:53:25 +0000999 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001000 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001001 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001002}
Renato Goline17c5802015-07-27 23:44:42 +00001003// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001004
Tim Northover573cbee2014-05-24 12:52:07 +00001005/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1006/// targeting.
1007static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001008 Arg *A;
1009 std::string CPU;
1010 // If we have -mtune or -mcpu, use that.
1011 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001012 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001013 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001014 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001015 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001016 }
1017
Kevin Qin110db6f2014-07-18 07:03:22 +00001018 // Handle CPU name is 'native'.
1019 if (CPU == "native")
1020 return llvm::sys::getHostCPUName();
1021 else if (CPU.size())
1022 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001023
James Molloy9b1586b2014-04-17 12:51:17 +00001024 // Make sure we pick "cyclone" if -arch is used.
1025 // FIXME: Should this be picked by checking the target triple instead?
1026 if (Args.getLastArg(options::OPT_arch))
1027 return "cyclone";
1028
1029 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001030}
1031
Tim Northover573cbee2014-05-24 12:52:07 +00001032void Clang::AddAArch64TargetArgs(const ArgList &Args,
1033 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1035 llvm::Triple Triple(TripleStr);
1036
1037 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1038 Args.hasArg(options::OPT_mkernel) ||
1039 Args.hasArg(options::OPT_fapple_kext))
1040 CmdArgs.push_back("-disable-red-zone");
1041
1042 if (!Args.hasFlag(options::OPT_mimplicit_float,
1043 options::OPT_mno_implicit_float, true))
1044 CmdArgs.push_back("-no-implicit-float");
1045
Craig Topper92fc2df2014-05-17 16:56:41 +00001046 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001047 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1048 ABIName = A->getValue();
1049 else if (Triple.isOSDarwin())
1050 ABIName = "darwinpcs";
1051 else
1052 ABIName = "aapcs";
1053
1054 CmdArgs.push_back("-target-abi");
1055 CmdArgs.push_back(ABIName);
1056
Bradley Smith9ff64332014-10-13 10:16:06 +00001057 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1058 options::OPT_mno_fix_cortex_a53_835769)) {
1059 CmdArgs.push_back("-backend-option");
1060 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1061 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1062 else
1063 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001064 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001065 // Enabled A53 errata (835769) workaround by default on android
1066 CmdArgs.push_back("-backend-option");
1067 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001068 }
1069
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001070 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001071 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1072 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001074 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-aarch64-global-merge=false");
1076 else
1077 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001078 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001079}
1080
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001081// Get CPU and ABI names. They are not independent
1082// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1084 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001085 const char *DefMips32CPU = "mips32r2";
1086 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001087
Daniel Sanders2bf13662014-07-10 14:40:57 +00001088 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1089 // default for mips64(el)?-img-linux-gnu.
1090 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1091 Triple.getEnvironment() == llvm::Triple::GNU) {
1092 DefMips32CPU = "mips32r6";
1093 DefMips64CPU = "mips64r6";
1094 }
Renato Golin7c542b42015-07-27 23:44:45 +00001095
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001096 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001097 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001098 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001099
Brad Smithba26f582015-01-06 02:53:17 +00001100 // MIPS3 is the default for mips64*-unknown-openbsd.
1101 if (Triple.getOS() == llvm::Triple::OpenBSD)
1102 DefMips64CPU = "mips3";
1103
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001104 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001105 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001106
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001107 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001108 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001109 // Convert a GNU style Mips ABI name to the name
1110 // accepted by LLVM Mips backend.
1111 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001112 .Case("32", "o32")
1113 .Case("64", "n64")
1114 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001115 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001116
1117 // Setup default CPU and ABI names.
1118 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001119 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001120 default:
1121 llvm_unreachable("Unexpected triple arch name");
1122 case llvm::Triple::mips:
1123 case llvm::Triple::mipsel:
1124 CPUName = DefMips32CPU;
1125 break;
1126 case llvm::Triple::mips64:
1127 case llvm::Triple::mips64el:
1128 CPUName = DefMips64CPU;
1129 break;
1130 }
1131 }
1132
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001133 if (ABIName.empty()) {
1134 // Deduce ABI name from the target triple.
1135 if (Triple.getArch() == llvm::Triple::mips ||
1136 Triple.getArch() == llvm::Triple::mipsel)
1137 ABIName = "o32";
1138 else
1139 ABIName = "n64";
1140 }
1141
1142 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001143 // Deduce CPU name from ABI name.
1144 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001145 .Cases("o32", "eabi", DefMips32CPU)
1146 .Cases("n32", "n64", DefMips64CPU)
1147 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001148 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001149
1150 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001151}
1152
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001153std::string mips::getMipsABILibSuffix(const ArgList &Args,
1154 const llvm::Triple &Triple) {
1155 StringRef CPUName, ABIName;
1156 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1157 return llvm::StringSwitch<std::string>(ABIName)
1158 .Case("o32", "")
1159 .Case("n32", "32")
1160 .Case("n64", "64");
1161}
1162
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001163// Convert ABI name to the GNU tools acceptable variant.
1164static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1165 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001166 .Case("o32", "32")
1167 .Case("n64", "64")
1168 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001169}
1170
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001171// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1172// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001173static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1174 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001175 if (Arg *A =
1176 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1177 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001178 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001179 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001180 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001181 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001182 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001183 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1184 .Case("soft", mips::FloatABI::Soft)
1185 .Case("hard", mips::FloatABI::Hard)
1186 .Default(mips::FloatABI::Invalid);
1187 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001188 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001189 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001190 }
1191 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001192 }
1193
1194 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001195 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001196 // Assume "hard", because it's a default value used by gcc.
1197 // When we start to recognize specific target MIPS processors,
1198 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001200 }
1201
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001202 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1203 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001204}
1205
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001206static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001207 std::vector<const char *> &Features,
1208 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001209 StringRef FeatureName) {
1210 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001211 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001212 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001213 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001214 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001215 }
1216}
1217
Daniel Sanders379d44b2014-07-16 11:52:23 +00001218static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1219 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001220 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001221 StringRef CPUName;
1222 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001223 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001224 ABIName = getGnuCompatibleMipsABIName(ABIName);
1225
Daniel Sandersfeb61302014-08-08 15:47:17 +00001226 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1227 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001228
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001229 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1230 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001231 // FIXME: Note, this is a hack. We need to pass the selected float
1232 // mode to the MipsTargetInfoBase to define appropriate macros there.
1233 // Now it is the only method.
1234 Features.push_back("+soft-float");
1235 }
1236
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001237 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001238 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001239 if (Val == "2008") {
1240 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1241 Features.push_back("+nan2008");
1242 else {
1243 Features.push_back("-nan2008");
1244 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1245 }
1246 } else if (Val == "legacy") {
1247 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1248 Features.push_back("-nan2008");
1249 else {
1250 Features.push_back("+nan2008");
1251 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1252 }
1253 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001254 D.Diag(diag::err_drv_unsupported_option_argument)
1255 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001256 }
1257
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001258 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1259 options::OPT_mdouble_float, "single-float");
1260 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1261 "mips16");
1262 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1263 options::OPT_mno_micromips, "micromips");
1264 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1265 "dsp");
1266 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1267 "dspr2");
1268 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1269 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001270
1271 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1272 // pass -mfpxx
1273 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1274 options::OPT_mfp64)) {
1275 if (A->getOption().matches(options::OPT_mfp32))
1276 Features.push_back(Args.MakeArgString("-fp64"));
1277 else if (A->getOption().matches(options::OPT_mfpxx)) {
1278 Features.push_back(Args.MakeArgString("+fpxx"));
1279 Features.push_back(Args.MakeArgString("+nooddspreg"));
1280 } else
1281 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001282 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001283 Features.push_back(Args.MakeArgString("+fpxx"));
1284 Features.push_back(Args.MakeArgString("+nooddspreg"));
1285 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001286
Daniel Sanders28e5d392014-07-10 10:39:51 +00001287 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1288 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001289}
1290
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001291void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001292 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293 const Driver &D = getToolChain().getDriver();
1294 StringRef CPUName;
1295 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001296 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001297 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001298
1299 CmdArgs.push_back("-target-abi");
1300 CmdArgs.push_back(ABIName.data());
1301
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001302 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1303 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001304 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001305 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001306 CmdArgs.push_back("-mfloat-abi");
1307 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001308 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001309 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001310 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001311 CmdArgs.push_back("-mfloat-abi");
1312 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001313 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001314
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001315 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1316 if (A->getOption().matches(options::OPT_mxgot)) {
1317 CmdArgs.push_back("-mllvm");
1318 CmdArgs.push_back("-mxgot");
1319 }
1320 }
1321
Simon Atanasyanc580b322013-05-11 06:33:44 +00001322 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1323 options::OPT_mno_ldc1_sdc1)) {
1324 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1325 CmdArgs.push_back("-mllvm");
1326 CmdArgs.push_back("-mno-ldc1-sdc1");
1327 }
1328 }
1329
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001330 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1331 options::OPT_mno_check_zero_division)) {
1332 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1333 CmdArgs.push_back("-mllvm");
1334 CmdArgs.push_back("-mno-check-zero-division");
1335 }
1336 }
1337
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001338 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001339 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001340 CmdArgs.push_back("-mllvm");
1341 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1342 A->claim();
1343 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001344}
1345
Hal Finkel8eb59282012-06-11 22:35:19 +00001346/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1347static std::string getPPCTargetCPU(const ArgList &Args) {
1348 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001349 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001350
1351 if (CPUName == "native") {
1352 std::string CPU = llvm::sys::getHostCPUName();
1353 if (!CPU.empty() && CPU != "generic")
1354 return CPU;
1355 else
1356 return "";
1357 }
1358
1359 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001360 .Case("common", "generic")
1361 .Case("440", "440")
1362 .Case("440fp", "440")
1363 .Case("450", "450")
1364 .Case("601", "601")
1365 .Case("602", "602")
1366 .Case("603", "603")
1367 .Case("603e", "603e")
1368 .Case("603ev", "603ev")
1369 .Case("604", "604")
1370 .Case("604e", "604e")
1371 .Case("620", "620")
1372 .Case("630", "pwr3")
1373 .Case("G3", "g3")
1374 .Case("7400", "7400")
1375 .Case("G4", "g4")
1376 .Case("7450", "7450")
1377 .Case("G4+", "g4+")
1378 .Case("750", "750")
1379 .Case("970", "970")
1380 .Case("G5", "g5")
1381 .Case("a2", "a2")
1382 .Case("a2q", "a2q")
1383 .Case("e500mc", "e500mc")
1384 .Case("e5500", "e5500")
1385 .Case("power3", "pwr3")
1386 .Case("power4", "pwr4")
1387 .Case("power5", "pwr5")
1388 .Case("power5x", "pwr5x")
1389 .Case("power6", "pwr6")
1390 .Case("power6x", "pwr6x")
1391 .Case("power7", "pwr7")
1392 .Case("power8", "pwr8")
1393 .Case("pwr3", "pwr3")
1394 .Case("pwr4", "pwr4")
1395 .Case("pwr5", "pwr5")
1396 .Case("pwr5x", "pwr5x")
1397 .Case("pwr6", "pwr6")
1398 .Case("pwr6x", "pwr6x")
1399 .Case("pwr7", "pwr7")
1400 .Case("pwr8", "pwr8")
1401 .Case("powerpc", "ppc")
1402 .Case("powerpc64", "ppc64")
1403 .Case("powerpc64le", "ppc64le")
1404 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001405 }
1406
1407 return "";
1408}
1409
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001410static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1411 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001412 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001413 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1414 StringRef Name = A->getOption().getName();
1415 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001416
1417 // Skip over "-m".
1418 assert(Name.startswith("m") && "Invalid feature name.");
1419 Name = Name.substr(1);
1420
1421 bool IsNegative = Name.startswith("no-");
1422 if (IsNegative)
1423 Name = Name.substr(3);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001424 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1425 }
1426
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001427 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1428 if (FloatABI == ppc::FloatABI::Soft &&
1429 !(Triple.getArch() == llvm::Triple::ppc64 ||
1430 Triple.getArch() == llvm::Triple::ppc64le))
1431 Features.push_back("+soft-float");
1432 else if (FloatABI == ppc::FloatABI::Soft &&
1433 (Triple.getArch() == llvm::Triple::ppc64 ||
1434 Triple.getArch() == llvm::Triple::ppc64le))
1435 D.Diag(diag::err_drv_invalid_mfloat_abi)
1436 << "soft float is not supported for ppc64";
1437
Eric Christopher643bb6a2013-10-16 20:40:08 +00001438 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001439 AddTargetFeature(Args, Features, options::OPT_faltivec,
1440 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001441}
1442
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001443ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1444 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1445 if (Arg *A =
1446 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1447 options::OPT_mfloat_abi_EQ)) {
1448 if (A->getOption().matches(options::OPT_msoft_float))
1449 ABI = ppc::FloatABI::Soft;
1450 else if (A->getOption().matches(options::OPT_mhard_float))
1451 ABI = ppc::FloatABI::Hard;
1452 else {
1453 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1454 .Case("soft", ppc::FloatABI::Soft)
1455 .Case("hard", ppc::FloatABI::Hard)
1456 .Default(ppc::FloatABI::Invalid);
1457 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1458 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1459 ABI = ppc::FloatABI::Hard;
1460 }
1461 }
1462 }
1463
1464 // If unspecified, choose the default based on the platform.
1465 if (ABI == ppc::FloatABI::Invalid) {
1466 ABI = ppc::FloatABI::Hard;
1467 }
1468
1469 return ABI;
1470}
1471
Ulrich Weigand8afad612014-07-28 13:17:52 +00001472void Clang::AddPPCTargetArgs(const ArgList &Args,
1473 ArgStringList &CmdArgs) const {
1474 // Select the ABI to use.
1475 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001476 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001477 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001478 case llvm::Triple::ppc64: {
1479 // When targeting a processor that supports QPX, or if QPX is
1480 // specifically enabled, default to using the ABI that supports QPX (so
1481 // long as it is not specifically disabled).
1482 bool HasQPX = false;
1483 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1484 HasQPX = A->getValue() == StringRef("a2q");
1485 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1486 if (HasQPX) {
1487 ABIName = "elfv1-qpx";
1488 break;
1489 }
1490
Ulrich Weigand8afad612014-07-28 13:17:52 +00001491 ABIName = "elfv1";
1492 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001493 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001494 case llvm::Triple::ppc64le:
1495 ABIName = "elfv2";
1496 break;
1497 default:
1498 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001499 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001500
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001501 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1502 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1503 // the option if given as we don't have backend support for any targets
1504 // that don't use the altivec abi.
1505 if (StringRef(A->getValue()) != "altivec")
1506 ABIName = A->getValue();
1507
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001508 ppc::FloatABI FloatABI =
1509 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1510
1511 if (FloatABI == ppc::FloatABI::Soft) {
1512 // Floating point operations and argument passing are soft.
1513 CmdArgs.push_back("-msoft-float");
1514 CmdArgs.push_back("-mfloat-abi");
1515 CmdArgs.push_back("soft");
1516 } else {
1517 // Floating point operations and argument passing are hard.
1518 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1519 CmdArgs.push_back("-mfloat-abi");
1520 CmdArgs.push_back("hard");
1521 }
1522
Ulrich Weigand8afad612014-07-28 13:17:52 +00001523 if (ABIName) {
1524 CmdArgs.push_back("-target-abi");
1525 CmdArgs.push_back(ABIName);
1526 }
1527}
1528
1529bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1530 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1531 return A && (A->getValue() == StringRef(Value));
1532}
1533
Tom Stellard6674c702013-04-01 20:56:53 +00001534/// Get the (LLVM) name of the R600 gpu we are targeting.
1535static std::string getR600TargetGPU(const ArgList &Args) {
1536 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001537 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001538 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001539 .Cases("rv630", "rv635", "r600")
1540 .Cases("rv610", "rv620", "rs780", "rs880")
1541 .Case("rv740", "rv770")
1542 .Case("palm", "cedar")
1543 .Cases("sumo", "sumo2", "sumo")
1544 .Case("hemlock", "cypress")
1545 .Case("aruba", "cayman")
1546 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001547 }
1548 return "";
1549}
1550
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001551void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001552 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001553 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001554 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001555
James Y Knightb2406522015-06-15 20:51:24 +00001556 bool SoftFloatABI = false;
1557 if (Arg *A =
1558 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001560 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561 }
1562
James Y Knightb2406522015-06-15 20:51:24 +00001563 // Only the hard-float ABI on Sparc is standardized, and it is the
1564 // default. GCC also supports a nonstandard soft-float ABI mode, and
1565 // perhaps LLVM should implement that, too. However, since llvm
1566 // currently does not support Sparc soft-float, at all, display an
1567 // error if it's requested.
1568 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001569 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1570 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001571 }
1572}
1573
Richard Sandiford4652d892013-07-19 16:51:51 +00001574static const char *getSystemZTargetCPU(const ArgList &Args) {
1575 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1576 return A->getValue();
1577 return "z10";
1578}
1579
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001580static void getSystemZTargetFeatures(const ArgList &Args,
1581 std::vector<const char *> &Features) {
1582 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001583 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001584 if (A->getOption().matches(options::OPT_mhtm))
1585 Features.push_back("+transactional-execution");
1586 else
1587 Features.push_back("-transactional-execution");
1588 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001589 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001590 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001591 if (A->getOption().matches(options::OPT_mvx))
1592 Features.push_back("+vector");
1593 else
1594 Features.push_back("-vector");
1595 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001596}
1597
Chandler Carruth953fb082013-01-13 11:46:33 +00001598static const char *getX86TargetCPU(const ArgList &Args,
1599 const llvm::Triple &Triple) {
1600 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001601 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001602 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001603 return "core-avx2";
1604
Chandler Carruth953fb082013-01-13 11:46:33 +00001605 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001606 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001607
1608 // FIXME: Reject attempts to use -march=native unless the target matches
1609 // the host.
1610 //
1611 // FIXME: We should also incorporate the detected target features for use
1612 // with -native.
1613 std::string CPU = llvm::sys::getHostCPUName();
1614 if (!CPU.empty() && CPU != "generic")
1615 return Args.MakeArgString(CPU);
1616 }
1617
Reid Kleckner3123eff2015-06-30 16:32:04 +00001618 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1619 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1620 StringRef Arch = A->getValue();
1621 const char *CPU;
1622 if (Triple.getArch() == llvm::Triple::x86) {
1623 CPU = llvm::StringSwitch<const char *>(Arch)
1624 .Case("IA32", "i386")
1625 .Case("SSE", "pentium3")
1626 .Case("SSE2", "pentium4")
1627 .Case("AVX", "sandybridge")
1628 .Case("AVX2", "haswell")
1629 .Default(nullptr);
1630 } else {
1631 CPU = llvm::StringSwitch<const char *>(Arch)
1632 .Case("AVX", "sandybridge")
1633 .Case("AVX2", "haswell")
1634 .Default(nullptr);
1635 }
1636 if (CPU)
1637 return CPU;
1638 }
1639
Chandler Carruth953fb082013-01-13 11:46:33 +00001640 // Select the default CPU if none was given (or detection failed).
1641
1642 if (Triple.getArch() != llvm::Triple::x86_64 &&
1643 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001644 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001645
1646 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1647
1648 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001649 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001650 if (Triple.getArchName() == "x86_64h")
1651 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001652 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001653 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001654
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001655 // Set up default CPU name for PS4 compilers.
1656 if (Triple.isPS4CPU())
1657 return "btver2";
1658
Alexey Bataev286d1b92014-01-31 04:07:13 +00001659 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001660 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001661 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001662
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001663 // Everything else goes to x86-64 in 64-bit mode.
1664 if (Is64Bit)
1665 return "x86-64";
1666
1667 switch (Triple.getOS()) {
1668 case llvm::Triple::FreeBSD:
1669 case llvm::Triple::NetBSD:
1670 case llvm::Triple::OpenBSD:
1671 return "i486";
1672 case llvm::Triple::Haiku:
1673 return "i586";
1674 case llvm::Triple::Bitrig:
1675 return "i686";
1676 default:
1677 // Fallback to p4.
1678 return "pentium4";
1679 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001680}
1681
Dan Gohmanc2853072015-09-03 22:51:53 +00001682/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1683static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1684 // If we have -mcpu=, use that.
1685 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1686 StringRef CPU = A->getValue();
1687
1688#ifdef __wasm__
1689 // Handle "native" by examining the host. "native" isn't meaningful when
1690 // cross compiling, so only support this when the host is also WebAssembly.
1691 if (CPU == "native")
1692 return llvm::sys::getHostCPUName();
1693#endif
1694
1695 return CPU;
1696 }
1697
1698 return "generic";
1699}
1700
Renato Golin7c542b42015-07-27 23:44:45 +00001701static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1702 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001703 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001704 default:
1705 return "";
1706
Amara Emerson703da2e2013-10-31 09:32:33 +00001707 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001708 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001709 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001710
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001711 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001712 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001713 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001714 case llvm::Triple::thumbeb: {
1715 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001716 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001717 return arm::getARMTargetCPU(MCPU, MArch, T);
1718 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::mips:
1720 case llvm::Triple::mipsel:
1721 case llvm::Triple::mips64:
1722 case llvm::Triple::mips64el: {
1723 StringRef CPUName;
1724 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001725 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001726 return CPUName;
1727 }
1728
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001729 case llvm::Triple::nvptx:
1730 case llvm::Triple::nvptx64:
1731 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1732 return A->getValue();
1733 return "";
1734
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001735 case llvm::Triple::ppc:
1736 case llvm::Triple::ppc64:
1737 case llvm::Triple::ppc64le: {
1738 std::string TargetCPUName = getPPCTargetCPU(Args);
1739 // LLVM may default to generating code for the native CPU,
1740 // but, like gcc, we default to a more generic option for
1741 // each architecture. (except on Darwin)
1742 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1743 if (T.getArch() == llvm::Triple::ppc64)
1744 TargetCPUName = "ppc64";
1745 else if (T.getArch() == llvm::Triple::ppc64le)
1746 TargetCPUName = "ppc64le";
1747 else
1748 TargetCPUName = "ppc";
1749 }
1750 return TargetCPUName;
1751 }
1752
1753 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001754 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001755 case llvm::Triple::sparcv9:
1756 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001757 return A->getValue();
1758 return "";
1759
1760 case llvm::Triple::x86:
1761 case llvm::Triple::x86_64:
1762 return getX86TargetCPU(Args, T);
1763
1764 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001765 return "hexagon" +
1766 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001767
1768 case llvm::Triple::systemz:
1769 return getSystemZTargetCPU(Args);
1770
1771 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001772 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001774
1775 case llvm::Triple::wasm32:
1776 case llvm::Triple::wasm64:
1777 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001778 }
1779}
1780
Alp Tokerce365ca2013-12-02 12:43:03 +00001781static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001782 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001783 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1784 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1785 // forward.
1786 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001787 std::string Plugin =
1788 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001789 CmdArgs.push_back(Args.MakeArgString(Plugin));
1790
1791 // Try to pass driver level flags relevant to LTO code generation down to
1792 // the plugin.
1793
1794 // Handle flags for selecting CPU variants.
1795 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1796 if (!CPU.empty())
1797 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001798
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001799 if (IsThinLTO)
1800 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001801}
1802
Sanjay Patel2987c292015-06-11 14:53:41 +00001803/// This is a helper function for validating the optional refinement step
1804/// parameter in reciprocal argument strings. Return false if there is an error
1805/// parsing the refinement step. Otherwise, return true and set the Position
1806/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001807static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001808 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001809 const char RefinementStepToken = ':';
1810 Position = In.find(RefinementStepToken);
1811 if (Position != StringRef::npos) {
1812 StringRef Option = A.getOption().getName();
1813 StringRef RefStep = In.substr(Position + 1);
1814 // Allow exactly one numeric character for the additional refinement
1815 // step parameter. This is reasonable for all currently-supported
1816 // operations and architectures because we would expect that a larger value
1817 // of refinement steps would cause the estimate "optimization" to
1818 // under-perform the native operation. Also, if the estimate does not
1819 // converge quickly, it probably will not ever converge, so further
1820 // refinement steps will not produce a better answer.
1821 if (RefStep.size() != 1) {
1822 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1823 return false;
1824 }
1825 char RefStepChar = RefStep[0];
1826 if (RefStepChar < '0' || RefStepChar > '9') {
1827 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1828 return false;
1829 }
1830 }
1831 return true;
1832}
1833
1834/// The -mrecip flag requires processing of many optional parameters.
1835static void ParseMRecip(const Driver &D, const ArgList &Args,
1836 ArgStringList &OutStrings) {
1837 StringRef DisabledPrefixIn = "!";
1838 StringRef DisabledPrefixOut = "!";
1839 StringRef EnabledPrefixOut = "";
1840 StringRef Out = "-mrecip=";
1841
1842 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1843 if (!A)
1844 return;
1845
1846 unsigned NumOptions = A->getNumValues();
1847 if (NumOptions == 0) {
1848 // No option is the same as "all".
1849 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1850 return;
1851 }
1852
1853 // Pass through "all", "none", or "default" with an optional refinement step.
1854 if (NumOptions == 1) {
1855 StringRef Val = A->getValue(0);
1856 size_t RefStepLoc;
1857 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1858 return;
1859 StringRef ValBase = Val.slice(0, RefStepLoc);
1860 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1861 OutStrings.push_back(Args.MakeArgString(Out + Val));
1862 return;
1863 }
1864 }
1865
1866 // Each reciprocal type may be enabled or disabled individually.
1867 // Check each input value for validity, concatenate them all back together,
1868 // and pass through.
1869
1870 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001871 OptionStrings.insert(std::make_pair("divd", false));
1872 OptionStrings.insert(std::make_pair("divf", false));
1873 OptionStrings.insert(std::make_pair("vec-divd", false));
1874 OptionStrings.insert(std::make_pair("vec-divf", false));
1875 OptionStrings.insert(std::make_pair("sqrtd", false));
1876 OptionStrings.insert(std::make_pair("sqrtf", false));
1877 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1878 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001879
1880 for (unsigned i = 0; i != NumOptions; ++i) {
1881 StringRef Val = A->getValue(i);
1882
1883 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1884 // Ignore the disablement token for string matching.
1885 if (IsDisabled)
1886 Val = Val.substr(1);
1887
1888 size_t RefStep;
1889 if (!getRefinementStep(Val, D, *A, RefStep))
1890 return;
1891
1892 StringRef ValBase = Val.slice(0, RefStep);
1893 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1894 if (OptionIter == OptionStrings.end()) {
1895 // Try again specifying float suffix.
1896 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1897 if (OptionIter == OptionStrings.end()) {
1898 // The input name did not match any known option string.
1899 D.Diag(diag::err_drv_unknown_argument) << Val;
1900 return;
1901 }
1902 // The option was specified without a float or double suffix.
1903 // Make sure that the double entry was not already specified.
1904 // The float entry will be checked below.
1905 if (OptionStrings[ValBase.str() + 'd']) {
1906 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1907 return;
1908 }
1909 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001910
Sanjay Patel2987c292015-06-11 14:53:41 +00001911 if (OptionIter->second == true) {
1912 // Duplicate option specified.
1913 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1914 return;
1915 }
1916
1917 // Mark the matched option as found. Do not allow duplicate specifiers.
1918 OptionIter->second = true;
1919
1920 // If the precision was not specified, also mark the double entry as found.
1921 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1922 OptionStrings[ValBase.str() + 'd'] = true;
1923
1924 // Build the output string.
1925 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1926 Out = Args.MakeArgString(Out + Prefix + Val);
1927 if (i != NumOptions - 1)
1928 Out = Args.MakeArgString(Out + ",");
1929 }
1930
1931 OutStrings.push_back(Args.MakeArgString(Out));
1932}
1933
Eric Christopherc54920a2015-03-23 19:26:05 +00001934static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001935 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001936 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001937 // If -march=native, autodetect the feature list.
1938 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1939 if (StringRef(A->getValue()) == "native") {
1940 llvm::StringMap<bool> HostFeatures;
1941 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1942 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001943 Features.push_back(
1944 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001945 }
1946 }
1947
Jim Grosbach82eee262013-11-16 00:53:35 +00001948 if (Triple.getArchName() == "x86_64h") {
1949 // x86_64h implies quite a few of the more modern subtarget features
1950 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1951 Features.push_back("-rdrnd");
1952 Features.push_back("-aes");
1953 Features.push_back("-pclmul");
1954 Features.push_back("-rtm");
1955 Features.push_back("-hle");
1956 Features.push_back("-fsgsbase");
1957 }
1958
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001959 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001960 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001961 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001962 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001963 Features.push_back("+sse4.2");
1964 Features.push_back("+popcnt");
1965 } else
1966 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001967 }
1968
Eric Christopherc54920a2015-03-23 19:26:05 +00001969 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001970 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1971 StringRef Arch = A->getValue();
1972 bool ArchUsed = false;
1973 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001974 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001975 if (Arch == "AVX" || Arch == "AVX2") {
1976 ArchUsed = true;
1977 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1978 }
1979 }
1980 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001981 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001982 if (Arch == "IA32") {
1983 ArchUsed = true;
1984 } else if (Arch == "SSE" || Arch == "SSE2") {
1985 ArchUsed = true;
1986 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1987 }
1988 }
1989 if (!ArchUsed)
1990 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1991 }
1992
Jim Grosbach82eee262013-11-16 00:53:35 +00001993 // Now add any that the user explicitly requested on the command line,
1994 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001995 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1996 StringRef Name = A->getOption().getName();
1997 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001998
1999 // Skip over "-m".
2000 assert(Name.startswith("m") && "Invalid feature name.");
2001 Name = Name.substr(1);
2002
2003 bool IsNegative = Name.startswith("no-");
2004 if (IsNegative)
2005 Name = Name.substr(3);
2006
2007 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2008 }
2009}
2010
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002011void Clang::AddX86TargetArgs(const ArgList &Args,
2012 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002013 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002014 Args.hasArg(options::OPT_mkernel) ||
2015 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002016 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002017
Bob Wilson2616e2e2013-02-10 16:01:41 +00002018 // Default to avoid implicit floating-point for kernel/kext code, but allow
2019 // that to be overridden with -mno-soft-float.
2020 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2021 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002022 if (Arg *A = Args.getLastArg(
2023 options::OPT_msoft_float, options::OPT_mno_soft_float,
2024 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002025 const Option &O = A->getOption();
2026 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2027 O.matches(options::OPT_msoft_float));
2028 }
2029 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002030 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002031
2032 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2033 StringRef Value = A->getValue();
2034 if (Value == "intel" || Value == "att") {
2035 CmdArgs.push_back("-mllvm");
2036 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2037 } else {
2038 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2039 << A->getOption().getName() << Value;
2040 }
2041 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002042}
2043
Tony Linthicum76329bf2011-12-12 21:14:55 +00002044void Clang::AddHexagonTargetArgs(const ArgList &Args,
2045 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002046 CmdArgs.push_back("-mqdsp6-compat");
2047 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002048
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002049 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2050 std::string N = llvm::utostr(G.getValue());
2051 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002052 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002053 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002054 }
2055
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002056 if (!Args.hasArg(options::OPT_fno_short_enums))
2057 CmdArgs.push_back("-fshort-enums");
2058 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002059 CmdArgs.push_back("-mllvm");
2060 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002061 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002062 CmdArgs.push_back("-mllvm");
2063 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002064}
2065
Kevin Qin110db6f2014-07-18 07:03:22 +00002066// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002067static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002068 std::vector<const char *> &Features) {
2069 SmallVector<StringRef, 8> Split;
2070 text.split(Split, StringRef("+"), -1, false);
2071
Benjamin Kramer72e64312015-09-24 14:48:49 +00002072 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002073 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002074 .Case("fp", "+fp-armv8")
2075 .Case("simd", "+neon")
2076 .Case("crc", "+crc")
2077 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002078 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002079 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002080 .Case("nofp", "-fp-armv8")
2081 .Case("nosimd", "-neon")
2082 .Case("nocrc", "-crc")
2083 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002084 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002085 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002086 .Default(nullptr);
2087 if (result)
2088 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002089 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002090 D.Diag(diag::err_drv_no_neon_modifier);
2091 else
2092 return false;
2093 }
2094 return true;
2095}
2096
2097// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2098// decode CPU and feature.
2099static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2100 std::vector<const char *> &Features) {
2101 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2102 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002103 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Christof Doumaba13ad52015-12-02 12:03:42 +00002104 CPU == "cortex-a72" || CPU == "cortex-a35") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002105 Features.push_back("+neon");
2106 Features.push_back("+crc");
2107 Features.push_back("+crypto");
2108 } else if (CPU == "generic") {
2109 Features.push_back("+neon");
2110 } else {
2111 return false;
2112 }
2113
2114 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2115 return false;
2116
2117 return true;
2118}
2119
2120static bool
2121getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2122 const ArgList &Args,
2123 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002124 std::string MarchLowerCase = March.lower();
2125 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002127 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002128 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002129 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002130 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002131 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2132 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002133 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002134 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002135 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002136
2137 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2138 return false;
2139
2140 return true;
2141}
2142
2143static bool
2144getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2145 const ArgList &Args,
2146 std::vector<const char *> &Features) {
2147 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002148 std::string McpuLowerCase = Mcpu.lower();
2149 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002150 return false;
2151
2152 return true;
2153}
2154
2155static bool
2156getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2157 const ArgList &Args,
2158 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002159 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002160 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002161 if (MtuneLowerCase == "native")
2162 MtuneLowerCase = llvm::sys::getHostCPUName();
2163 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002164 Features.push_back("+zcm");
2165 Features.push_back("+zcz");
2166 }
2167 return true;
2168}
2169
2170static bool
2171getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2172 const ArgList &Args,
2173 std::vector<const char *> &Features) {
2174 StringRef CPU;
2175 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002176 std::string McpuLowerCase = Mcpu.lower();
2177 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002178 return false;
2179
2180 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2181}
2182
Justin Bognerf9052562015-11-13 23:07:31 +00002183static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002184 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002185 Arg *A;
2186 bool success = true;
2187 // Enable NEON by default.
2188 Features.push_back("+neon");
2189 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2190 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2191 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2192 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002193 else if (Args.hasArg(options::OPT_arch))
2194 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2195 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002196
2197 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2198 success =
2199 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2200 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2201 success =
2202 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002203 else if (Args.hasArg(options::OPT_arch))
2204 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2205 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002206
2207 if (!success)
2208 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002209
2210 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2211 Features.push_back("-fp-armv8");
2212 Features.push_back("-crypto");
2213 Features.push_back("-neon");
2214 }
Bradley Smith418c5932014-05-02 15:17:51 +00002215
2216 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002217 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002218 if (A->getOption().matches(options::OPT_mcrc))
2219 Features.push_back("+crc");
2220 else
2221 Features.push_back("-crc");
2222 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002223
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002224 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2225 options::OPT_munaligned_access))
2226 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2227 Features.push_back("+strict-align");
2228
Justin Bognerf9052562015-11-13 23:07:31 +00002229 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002230 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002231}
2232
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002233static void getHexagonTargetFeatures(const ArgList &Args,
2234 std::vector<const char *> &Features) {
2235 bool HasHVX = false, HasHVXD = false;
2236
2237 for (auto &A : Args) {
2238 auto &Opt = A->getOption();
2239 if (Opt.matches(options::OPT_mhexagon_hvx))
2240 HasHVX = true;
2241 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2242 HasHVXD = HasHVX = false;
2243 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2244 HasHVXD = HasHVX = true;
2245 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2246 HasHVXD = false;
2247 else
2248 continue;
2249 A->claim();
2250 }
2251
2252 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2253 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2254}
2255
Dan Gohmanc2853072015-09-03 22:51:53 +00002256static void getWebAssemblyTargetFeatures(const ArgList &Args,
2257 std::vector<const char *> &Features) {
2258 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2259 StringRef Name = A->getOption().getName();
2260 A->claim();
2261
2262 // Skip over "-m".
2263 assert(Name.startswith("m") && "Invalid feature name.");
2264 Name = Name.substr(1);
2265
2266 bool IsNegative = Name.startswith("no-");
2267 if (IsNegative)
2268 Name = Name.substr(3);
2269
2270 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2271 }
2272}
2273
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002274static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002275 const ArgList &Args, ArgStringList &CmdArgs,
2276 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002277 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002278 std::vector<const char *> Features;
2279 switch (Triple.getArch()) {
2280 default:
2281 break;
2282 case llvm::Triple::mips:
2283 case llvm::Triple::mipsel:
2284 case llvm::Triple::mips64:
2285 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002286 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002287 break;
2288
2289 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002290 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002291 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002292 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002293 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002294 break;
2295
2296 case llvm::Triple::ppc:
2297 case llvm::Triple::ppc64:
2298 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002299 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002300 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002301 case llvm::Triple::systemz:
2302 getSystemZTargetFeatures(Args, Features);
2303 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002304 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002305 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002306 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002307 break;
2308 case llvm::Triple::x86:
2309 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002310 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002311 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002312 case llvm::Triple::hexagon:
2313 getHexagonTargetFeatures(Args, Features);
2314 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002315 case llvm::Triple::wasm32:
2316 case llvm::Triple::wasm64:
2317 getWebAssemblyTargetFeatures(Args, Features);
2318 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002319 }
Rafael Espindola43964802013-08-21 17:34:32 +00002320
2321 // Find the last of each feature.
2322 llvm::StringMap<unsigned> LastOpt;
2323 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2324 const char *Name = Features[I];
2325 assert(Name[0] == '-' || Name[0] == '+');
2326 LastOpt[Name + 1] = I;
2327 }
2328
2329 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2330 // If this feature was overridden, ignore it.
2331 const char *Name = Features[I];
2332 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2333 assert(LastI != LastOpt.end());
2334 unsigned Last = LastI->second;
2335 if (Last != I)
2336 continue;
2337
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002338 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002339 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002340 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002341}
2342
David Majnemerae394812014-12-09 00:12:30 +00002343static bool
2344shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2345 const llvm::Triple &Triple) {
2346 // We use the zero-cost exception tables for Objective-C if the non-fragile
2347 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2348 // later.
2349 if (runtime.isNonFragile())
2350 return true;
2351
2352 if (!Triple.isMacOSX())
2353 return false;
2354
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002355 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002356 (Triple.getArch() == llvm::Triple::x86_64 ||
2357 Triple.getArch() == llvm::Triple::arm));
2358}
2359
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002360/// Adds exception related arguments to the driver command arguments. There's a
2361/// master flag, -fexceptions and also language specific flags to enable/disable
2362/// C++ and Objective-C exceptions. This makes it possible to for example
2363/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002364static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002365 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002366 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002367 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002368 const Driver &D = TC.getDriver();
2369 const llvm::Triple &Triple = TC.getTriple();
2370
Chad Rosier4fab82c2012-03-26 22:04:46 +00002371 if (KernelOrKext) {
2372 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2373 // arguments now to avoid warnings about unused arguments.
2374 Args.ClaimAllArgs(options::OPT_fexceptions);
2375 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2376 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2377 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2378 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2379 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002380 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002381 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002382
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002383 // See if the user explicitly enabled exceptions.
2384 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2385 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002386
David Majnemerae394812014-12-09 00:12:30 +00002387 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2388 // is not necessarily sensible, but follows GCC.
2389 if (types::isObjC(InputType) &&
2390 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002391 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002392 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002393
David Majnemerae394812014-12-09 00:12:30 +00002394 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002395 }
2396
2397 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002398 // Disable C++ EH by default on XCore, PS4, and MSVC.
2399 // FIXME: Remove MSVC from this list once things work.
2400 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2401 !Triple.isPS4CPU() &&
2402 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002403 Arg *ExceptionArg = Args.getLastArg(
2404 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2405 options::OPT_fexceptions, options::OPT_fno_exceptions);
2406 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002407 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002408 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2409 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002410
2411 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002412 if (Triple.isPS4CPU()) {
2413 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2414 assert(ExceptionArg &&
2415 "On the PS4 exceptions should only be enabled if passing "
2416 "an argument");
2417 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2418 const Arg *RTTIArg = TC.getRTTIArg();
2419 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2420 D.Diag(diag::err_drv_argument_not_allowed_with)
2421 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2422 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2423 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2424 } else
2425 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2426
Anders Carlssone96ab552011-02-28 02:27:16 +00002427 CmdArgs.push_back("-fcxx-exceptions");
2428
David Majnemer8de68642014-12-05 08:11:58 +00002429 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002430 }
2431 }
2432
David Majnemer8de68642014-12-05 08:11:58 +00002433 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002434 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002435}
2436
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002437static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002438 bool Default = true;
2439 if (TC.getTriple().isOSDarwin()) {
2440 // The native darwin assembler doesn't support the linker_option directives,
2441 // so we disable them if we think the .s file will be passed to it.
2442 Default = TC.useIntegratedAs();
2443 }
2444 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2445 Default);
2446}
2447
Ted Kremenek62093662013-03-12 17:02:12 +00002448static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2449 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002450 bool UseDwarfDirectory =
2451 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2452 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002453 return !UseDwarfDirectory;
2454}
2455
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002456/// \brief Check whether the given input tree contains any compilation actions.
2457static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002458 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002459 return true;
2460
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002461 for (const auto &Act : *A)
2462 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002463 return true;
2464
2465 return false;
2466}
2467
2468/// \brief Check if -relax-all should be passed to the internal assembler.
2469/// This is done by default when compiling non-assembler source with -O0.
2470static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2471 bool RelaxDefault = true;
2472
2473 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2474 RelaxDefault = A->getOption().matches(options::OPT_O0);
2475
2476 if (RelaxDefault) {
2477 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002478 for (const auto &Act : C.getActions()) {
2479 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002480 RelaxDefault = true;
2481 break;
2482 }
2483 }
2484 }
2485
2486 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002487 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002488}
2489
Paul Robinson0334a042015-12-19 19:41:48 +00002490// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2491// to the corresponding DebugInfoKind.
2492static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2493 assert(A.getOption().matches(options::OPT_gN_Group) &&
2494 "Not a -g option that specifies a debug-info level");
2495 if (A.getOption().matches(options::OPT_g0) ||
2496 A.getOption().matches(options::OPT_ggdb0))
2497 return CodeGenOptions::NoDebugInfo;
2498 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2499 A.getOption().matches(options::OPT_ggdb1))
2500 return CodeGenOptions::DebugLineTablesOnly;
2501 return CodeGenOptions::LimitedDebugInfo;
2502}
2503
Douglas Katzman3459ce22015-10-08 04:24:12 +00002504// Extract the integer N from a string spelled "-dwarf-N", returning 0
2505// on mismatch. The StringRef input (rather than an Arg) allows
2506// for use by the "-Xassembler" option parser.
2507static unsigned DwarfVersionNum(StringRef ArgValue) {
2508 return llvm::StringSwitch<unsigned>(ArgValue)
2509 .Case("-gdwarf-2", 2)
2510 .Case("-gdwarf-3", 3)
2511 .Case("-gdwarf-4", 4)
2512 .Default(0);
2513}
2514
2515static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2516 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002517 unsigned DwarfVersion,
2518 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002519 switch (DebugInfoKind) {
2520 case CodeGenOptions::DebugLineTablesOnly:
2521 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2522 break;
2523 case CodeGenOptions::LimitedDebugInfo:
2524 CmdArgs.push_back("-debug-info-kind=limited");
2525 break;
2526 case CodeGenOptions::FullDebugInfo:
2527 CmdArgs.push_back("-debug-info-kind=standalone");
2528 break;
2529 default:
2530 break;
2531 }
2532 if (DwarfVersion > 0)
2533 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002534 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002535 switch (DebuggerTuning) {
2536 case llvm::DebuggerKind::GDB:
2537 CmdArgs.push_back("-debugger-tuning=gdb");
2538 break;
2539 case llvm::DebuggerKind::LLDB:
2540 CmdArgs.push_back("-debugger-tuning=lldb");
2541 break;
2542 case llvm::DebuggerKind::SCE:
2543 CmdArgs.push_back("-debugger-tuning=sce");
2544 break;
2545 default:
2546 break;
2547 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002548}
2549
David Blaikie9260ed62013-07-25 21:19:01 +00002550static void CollectArgsForIntegratedAssembler(Compilation &C,
2551 const ArgList &Args,
2552 ArgStringList &CmdArgs,
2553 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002554 if (UseRelaxAll(C, Args))
2555 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002556
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002557 // When passing -I arguments to the assembler we sometimes need to
2558 // unconditionally take the next argument. For example, when parsing
2559 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2560 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2561 // arg after parsing the '-I' arg.
2562 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002563
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002564 // When using an integrated assembler, translate -Wa, and -Xassembler
2565 // options.
2566 bool CompressDebugSections = false;
2567 for (const Arg *A :
2568 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2569 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002570
Benjamin Kramer72e64312015-09-24 14:48:49 +00002571 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002572 if (TakeNextArg) {
2573 CmdArgs.push_back(Value.data());
2574 TakeNextArg = false;
2575 continue;
2576 }
David Blaikie9260ed62013-07-25 21:19:01 +00002577
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002578 switch (C.getDefaultToolChain().getArch()) {
2579 default:
2580 break;
2581 case llvm::Triple::mips:
2582 case llvm::Triple::mipsel:
2583 case llvm::Triple::mips64:
2584 case llvm::Triple::mips64el:
2585 if (Value == "--trap") {
2586 CmdArgs.push_back("-target-feature");
2587 CmdArgs.push_back("+use-tcc-in-div");
2588 continue;
2589 }
2590 if (Value == "--break") {
2591 CmdArgs.push_back("-target-feature");
2592 CmdArgs.push_back("-use-tcc-in-div");
2593 continue;
2594 }
2595 if (Value.startswith("-msoft-float")) {
2596 CmdArgs.push_back("-target-feature");
2597 CmdArgs.push_back("+soft-float");
2598 continue;
2599 }
2600 if (Value.startswith("-mhard-float")) {
2601 CmdArgs.push_back("-target-feature");
2602 CmdArgs.push_back("-soft-float");
2603 continue;
2604 }
2605 break;
2606 }
2607
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002608 if (Value == "-force_cpusubtype_ALL") {
2609 // Do nothing, this is the default and we don't support anything else.
2610 } else if (Value == "-L") {
2611 CmdArgs.push_back("-msave-temp-labels");
2612 } else if (Value == "--fatal-warnings") {
2613 CmdArgs.push_back("-massembler-fatal-warnings");
2614 } else if (Value == "--noexecstack") {
2615 CmdArgs.push_back("-mnoexecstack");
2616 } else if (Value == "-compress-debug-sections" ||
2617 Value == "--compress-debug-sections") {
2618 CompressDebugSections = true;
2619 } else if (Value == "-nocompress-debug-sections" ||
2620 Value == "--nocompress-debug-sections") {
2621 CompressDebugSections = false;
2622 } else if (Value.startswith("-I")) {
2623 CmdArgs.push_back(Value.data());
2624 // We need to consume the next argument if the current arg is a plain
2625 // -I. The next arg will be the include directory.
2626 if (Value == "-I")
2627 TakeNextArg = true;
2628 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002629 // "-gdwarf-N" options are not cc1as options.
2630 unsigned DwarfVersion = DwarfVersionNum(Value);
2631 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2632 CmdArgs.push_back(Value.data());
2633 } else {
2634 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002635 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2636 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002637 }
Renato Golin7c542b42015-07-27 23:44:45 +00002638 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2639 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2640 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002641 } else {
2642 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002643 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002644 }
2645 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002646 }
2647 if (CompressDebugSections) {
2648 if (llvm::zlib::isAvailable())
2649 CmdArgs.push_back("-compress-debug-sections");
2650 else
2651 D.Diag(diag::warn_debug_compression_unavailable);
2652 }
David Blaikie9260ed62013-07-25 21:19:01 +00002653}
2654
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002655// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002656// FIXME: Make sure we can also emit shared objects if they're requested
2657// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002658static void addClangRT(const ToolChain &TC, const ArgList &Args,
2659 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002660 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002661}
2662
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002663namespace {
2664enum OpenMPRuntimeKind {
2665 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2666 /// without knowing what runtime to target.
2667 OMPRT_Unknown,
2668
2669 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2670 /// the default for Clang.
2671 OMPRT_OMP,
2672
2673 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2674 /// this runtime but can swallow the pragmas, and find and link against the
2675 /// runtime library itself.
2676 OMPRT_GOMP,
2677
Chandler Carruthc6625c62015-05-28 21:10:31 +00002678 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002679 /// OpenMP runtime. We support this mode for users with existing dependencies
2680 /// on this runtime library name.
2681 OMPRT_IOMP5
2682};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002683}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002684
2685/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002686static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2687 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002688 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2689
2690 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2691 if (A)
2692 RuntimeName = A->getValue();
2693
2694 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002695 .Case("libomp", OMPRT_OMP)
2696 .Case("libgomp", OMPRT_GOMP)
2697 .Case("libiomp5", OMPRT_IOMP5)
2698 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002699
2700 if (RT == OMPRT_Unknown) {
2701 if (A)
2702 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002703 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002704 else
2705 // FIXME: We could use a nicer diagnostic here.
2706 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2707 }
2708
2709 return RT;
2710}
2711
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002712static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2713 const ArgList &Args) {
2714 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2715 options::OPT_fno_openmp, false))
2716 return;
2717
2718 switch (getOpenMPRuntime(TC, Args)) {
2719 case OMPRT_OMP:
2720 CmdArgs.push_back("-lomp");
2721 break;
2722 case OMPRT_GOMP:
2723 CmdArgs.push_back("-lgomp");
2724 break;
2725 case OMPRT_IOMP5:
2726 CmdArgs.push_back("-liomp5");
2727 break;
2728 case OMPRT_Unknown:
2729 // Already diagnosed.
2730 break;
2731 }
2732}
2733
Alexey Samsonov52550342014-09-15 19:58:40 +00002734static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2735 ArgStringList &CmdArgs, StringRef Sanitizer,
2736 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002737 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002738 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002739 if (!IsShared) CmdArgs.push_back("-whole-archive");
2740 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2741 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002742}
2743
Alexey Samsonov52550342014-09-15 19:58:40 +00002744// Tries to use a file with the list of dynamic symbols that need to be exported
2745// from the runtime library. Returns true if the file was found.
2746static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2747 ArgStringList &CmdArgs,
2748 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002749 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002750 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2751 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002752 return true;
2753 }
2754 return false;
2755}
2756
2757static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2758 ArgStringList &CmdArgs) {
2759 // Force linking against the system libraries sanitizers depends on
2760 // (see PR15823 why this is necessary).
2761 CmdArgs.push_back("--no-as-needed");
2762 CmdArgs.push_back("-lpthread");
2763 CmdArgs.push_back("-lrt");
2764 CmdArgs.push_back("-lm");
2765 // There's no libdl on FreeBSD.
2766 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2767 CmdArgs.push_back("-ldl");
2768}
2769
2770static void
2771collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2772 SmallVectorImpl<StringRef> &SharedRuntimes,
2773 SmallVectorImpl<StringRef> &StaticRuntimes,
2774 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2775 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2776 // Collect shared runtimes.
2777 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2778 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002779 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002780
Alexey Samsonov52550342014-09-15 19:58:40 +00002781 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002782 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002783 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002784 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002785 }
2786 if (SanArgs.needsAsanRt()) {
2787 if (SanArgs.needsSharedAsanRt()) {
2788 HelperStaticRuntimes.push_back("asan-preinit");
2789 } else {
2790 StaticRuntimes.push_back("asan");
2791 if (SanArgs.linkCXXRuntimes())
2792 StaticRuntimes.push_back("asan_cxx");
2793 }
2794 }
2795 if (SanArgs.needsDfsanRt())
2796 StaticRuntimes.push_back("dfsan");
2797 if (SanArgs.needsLsanRt())
2798 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002799 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002800 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002801 if (SanArgs.linkCXXRuntimes())
2802 StaticRuntimes.push_back("msan_cxx");
2803 }
2804 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002805 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002806 if (SanArgs.linkCXXRuntimes())
2807 StaticRuntimes.push_back("tsan_cxx");
2808 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002809 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002810 StaticRuntimes.push_back("ubsan_standalone");
2811 if (SanArgs.linkCXXRuntimes())
2812 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002813 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002814 if (SanArgs.needsSafeStackRt())
2815 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002816 if (SanArgs.needsCfiRt())
2817 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002818 if (SanArgs.needsCfiDiagRt())
2819 StaticRuntimes.push_back("cfi_diag");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002820}
2821
Alexey Samsonov52550342014-09-15 19:58:40 +00002822// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2823// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2824static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002825 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002826 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2827 HelperStaticRuntimes;
2828 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2829 HelperStaticRuntimes);
2830 for (auto RT : SharedRuntimes)
2831 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2832 for (auto RT : HelperStaticRuntimes)
2833 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2834 bool AddExportDynamic = false;
2835 for (auto RT : StaticRuntimes) {
2836 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2837 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2838 }
2839 // If there is a static runtime with no dynamic list, force all the symbols
2840 // to be dynamic to be sure we export sanitizer interface functions.
2841 if (AddExportDynamic)
2842 CmdArgs.push_back("-export-dynamic");
2843 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002844}
2845
Reid Kleckner86ea7702015-02-04 23:45:07 +00002846static bool areOptimizationsEnabled(const ArgList &Args) {
2847 // Find the last -O arg and see if it is non-zero.
2848 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2849 return !A->getOption().matches(options::OPT_O0);
2850 // Defaults to -O0.
2851 return false;
2852}
2853
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002854static bool shouldUseFramePointerForTarget(const ArgList &Args,
2855 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002856 switch (Triple.getArch()) {
2857 case llvm::Triple::xcore:
2858 case llvm::Triple::wasm32:
2859 case llvm::Triple::wasm64:
2860 // XCore never wants frame pointers, regardless of OS.
2861 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002862 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002863 default:
2864 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002865 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002866
2867 if (Triple.isOSLinux()) {
2868 switch (Triple.getArch()) {
2869 // Don't use a frame pointer on linux if optimizing for certain targets.
2870 case llvm::Triple::mips64:
2871 case llvm::Triple::mips64el:
2872 case llvm::Triple::mips:
2873 case llvm::Triple::mipsel:
2874 case llvm::Triple::systemz:
2875 case llvm::Triple::x86:
2876 case llvm::Triple::x86_64:
2877 return !areOptimizationsEnabled(Args);
2878 default:
2879 return true;
2880 }
2881 }
2882
2883 if (Triple.isOSWindows()) {
2884 switch (Triple.getArch()) {
2885 case llvm::Triple::x86:
2886 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002887 case llvm::Triple::arm:
2888 case llvm::Triple::thumb:
2889 // Windows on ARM builds with FPO disabled to aid fast stack walking
2890 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002891 default:
2892 // All other supported Windows ISAs use xdata unwind information, so frame
2893 // pointers are not generally useful.
2894 return false;
2895 }
2896 }
2897
2898 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002899}
2900
Rafael Espindola224dd632011-12-14 21:02:23 +00002901static bool shouldUseFramePointer(const ArgList &Args,
2902 const llvm::Triple &Triple) {
2903 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2904 options::OPT_fomit_frame_pointer))
2905 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002906 if (Args.hasArg(options::OPT_pg))
2907 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002908
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002909 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002910}
2911
Eric Christopherb7d97e92013-04-03 01:58:53 +00002912static bool shouldUseLeafFramePointer(const ArgList &Args,
2913 const llvm::Triple &Triple) {
2914 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2915 options::OPT_momit_leaf_frame_pointer))
2916 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002917 if (Args.hasArg(options::OPT_pg))
2918 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002919
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002920 if (Triple.isPS4CPU())
2921 return false;
2922
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002923 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002924}
2925
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002926/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002927static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002928 SmallString<128> cwd;
2929 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002930 CmdArgs.push_back("-fdebug-compilation-dir");
2931 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002932 }
2933}
2934
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002935static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002936 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2937 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2938 SmallString<128> T(FinalOutput->getValue());
2939 llvm::sys::path::replace_extension(T, "dwo");
2940 return Args.MakeArgString(T);
2941 } else {
2942 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002943 SmallString<128> T(
2944 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002945 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002946 llvm::sys::path::replace_extension(F, "dwo");
2947 T += F;
2948 return Args.MakeArgString(F);
2949 }
2950}
2951
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002952static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2953 const JobAction &JA, const ArgList &Args,
2954 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002955 ArgStringList ExtractArgs;
2956 ExtractArgs.push_back("--extract-dwo");
2957
2958 ArgStringList StripArgs;
2959 StripArgs.push_back("--strip-dwo");
2960
2961 // Grabbing the output of the earlier compile step.
2962 StripArgs.push_back(Output.getFilename());
2963 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002964 ExtractArgs.push_back(OutFile);
2965
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002966 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002967 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002968
2969 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002970 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002971
2972 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002973 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002974}
2975
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002976/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002977/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2978static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002979 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002980 if (A->getOption().matches(options::OPT_O4) ||
2981 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002982 return true;
2983
2984 if (A->getOption().matches(options::OPT_O0))
2985 return false;
2986
2987 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2988
Rafael Espindola91780de2013-08-26 14:05:41 +00002989 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002990 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002991 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002992 return true;
2993
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002994 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002995 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002996 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002997
2998 unsigned OptLevel = 0;
2999 if (S.getAsInteger(10, OptLevel))
3000 return false;
3001
3002 return OptLevel > 1;
3003 }
3004
3005 return false;
3006}
3007
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003008/// Add -x lang to \p CmdArgs for \p Input.
3009static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3010 ArgStringList &CmdArgs) {
3011 // When using -verify-pch, we don't want to provide the type
3012 // 'precompiled-header' if it was inferred from the file extension
3013 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3014 return;
3015
3016 CmdArgs.push_back("-x");
3017 if (Args.hasArg(options::OPT_rewrite_objc))
3018 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3019 else
3020 CmdArgs.push_back(types::getTypeName(Input.getType()));
3021}
3022
David Majnemerc371ff02015-03-22 08:39:22 +00003023static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003024 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003025 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003026
3027 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003028 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003029
3030 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003031 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003032 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003033 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003034}
3035
Rafael Espindola577637a2015-01-03 00:06:04 +00003036// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003037// options that build systems might add but are unused when assembling or only
3038// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003039static void claimNoWarnArgs(const ArgList &Args) {
3040 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003041 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003042 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003043 Args.ClaimAllArgs(options::OPT_flto);
3044 Args.ClaimAllArgs(options::OPT_fno_lto);
3045}
3046
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003047static void appendUserToPath(SmallVectorImpl<char> &Result) {
3048#ifdef LLVM_ON_UNIX
3049 const char *Username = getenv("LOGNAME");
3050#else
3051 const char *Username = getenv("USERNAME");
3052#endif
3053 if (Username) {
3054 // Validate that LoginName can be used in a path, and get its length.
3055 size_t Len = 0;
3056 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003057 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003058 Username = nullptr;
3059 break;
3060 }
3061 }
3062
3063 if (Username && Len > 0) {
3064 Result.append(Username, Username + Len);
3065 return;
3066 }
3067 }
3068
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003069// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003070#ifdef LLVM_ON_UNIX
3071 std::string UID = llvm::utostr(getuid());
3072#else
3073 // FIXME: Windows seems to have an 'SID' that might work.
3074 std::string UID = "9999";
3075#endif
3076 Result.append(UID.begin(), UID.end());
3077}
3078
David Majnemere11d3732015-06-08 00:22:46 +00003079VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3080 const llvm::Triple &Triple,
3081 const llvm::opt::ArgList &Args,
3082 bool IsWindowsMSVC) {
3083 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3084 IsWindowsMSVC) ||
3085 Args.hasArg(options::OPT_fmsc_version) ||
3086 Args.hasArg(options::OPT_fms_compatibility_version)) {
3087 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3088 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003089 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003090
3091 if (MSCVersion && MSCompatibilityVersion) {
3092 if (D)
3093 D->Diag(diag::err_drv_argument_not_allowed_with)
3094 << MSCVersion->getAsString(Args)
3095 << MSCompatibilityVersion->getAsString(Args);
3096 return VersionTuple();
3097 }
3098
3099 if (MSCompatibilityVersion) {
3100 VersionTuple MSVT;
3101 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3102 D->Diag(diag::err_drv_invalid_value)
3103 << MSCompatibilityVersion->getAsString(Args)
3104 << MSCompatibilityVersion->getValue();
3105 return MSVT;
3106 }
3107
3108 if (MSCVersion) {
3109 unsigned Version = 0;
3110 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3111 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3112 << MSCVersion->getValue();
3113 return getMSCompatibilityVersion(Version);
3114 }
3115
3116 unsigned Major, Minor, Micro;
3117 Triple.getEnvironmentVersion(Major, Minor, Micro);
3118 if (Major || Minor || Micro)
3119 return VersionTuple(Major, Minor, Micro);
3120
3121 return VersionTuple(18);
3122 }
3123 return VersionTuple();
3124}
3125
Diego Novilloa0545962015-07-10 18:00:07 +00003126static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3127 const InputInfo &Output, const ArgList &Args,
3128 ArgStringList &CmdArgs) {
3129 auto *ProfileGenerateArg = Args.getLastArg(
3130 options::OPT_fprofile_instr_generate,
3131 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003132 options::OPT_fprofile_generate_EQ,
3133 options::OPT_fno_profile_instr_generate);
3134 if (ProfileGenerateArg &&
3135 ProfileGenerateArg->getOption().matches(
3136 options::OPT_fno_profile_instr_generate))
3137 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003138
3139 auto *ProfileUseArg = Args.getLastArg(
3140 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003141 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3142 options::OPT_fno_profile_instr_use);
3143 if (ProfileUseArg &&
3144 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3145 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003146
3147 if (ProfileGenerateArg && ProfileUseArg)
3148 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003149 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003150
Diego Novillo758f3f52015-08-05 21:49:51 +00003151 if (ProfileGenerateArg) {
3152 if (ProfileGenerateArg->getOption().matches(
3153 options::OPT_fprofile_instr_generate_EQ))
3154 ProfileGenerateArg->render(Args, CmdArgs);
3155 else if (ProfileGenerateArg->getOption().matches(
3156 options::OPT_fprofile_generate_EQ)) {
3157 SmallString<128> Path(ProfileGenerateArg->getValue());
3158 llvm::sys::path::append(Path, "default.profraw");
3159 CmdArgs.push_back(
3160 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3161 } else
3162 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3163 }
Diego Novilloa0545962015-07-10 18:00:07 +00003164
Diego Novillo758f3f52015-08-05 21:49:51 +00003165 if (ProfileUseArg) {
3166 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3167 ProfileUseArg->render(Args, CmdArgs);
3168 else if ((ProfileUseArg->getOption().matches(
3169 options::OPT_fprofile_use_EQ) ||
3170 ProfileUseArg->getOption().matches(
3171 options::OPT_fprofile_instr_use))) {
3172 SmallString<128> Path(
3173 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3174 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3175 llvm::sys::path::append(Path, "default.profdata");
3176 CmdArgs.push_back(
3177 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3178 }
Diego Novilloa0545962015-07-10 18:00:07 +00003179 }
3180
3181 if (Args.hasArg(options::OPT_ftest_coverage) ||
3182 Args.hasArg(options::OPT_coverage))
3183 CmdArgs.push_back("-femit-coverage-notes");
3184 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3185 false) ||
3186 Args.hasArg(options::OPT_coverage))
3187 CmdArgs.push_back("-femit-coverage-data");
3188
Diego Novilloc4b94da2015-08-05 23:27:40 +00003189 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3190 options::OPT_fno_coverage_mapping, false) &&
3191 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003192 D.Diag(diag::err_drv_argument_only_allowed_with)
3193 << "-fcoverage-mapping"
3194 << "-fprofile-instr-generate";
3195
Diego Novilloc4b94da2015-08-05 23:27:40 +00003196 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3197 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003198 CmdArgs.push_back("-fcoverage-mapping");
3199
3200 if (C.getArgs().hasArg(options::OPT_c) ||
3201 C.getArgs().hasArg(options::OPT_S)) {
3202 if (Output.isFilename()) {
3203 CmdArgs.push_back("-coverage-file");
3204 SmallString<128> CoverageFilename;
3205 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3206 CoverageFilename = FinalOutput->getValue();
3207 } else {
3208 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3209 }
3210 if (llvm::sys::path::is_relative(CoverageFilename)) {
3211 SmallString<128> Pwd;
3212 if (!llvm::sys::fs::current_path(Pwd)) {
3213 llvm::sys::path::append(Pwd, CoverageFilename);
3214 CoverageFilename.swap(Pwd);
3215 }
3216 }
3217 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3218 }
3219 }
3220}
3221
Paul Robinsond083b9a2015-12-16 17:25:27 +00003222static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3223 ArgStringList &CmdArgs) {
3224 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3225 false) ||
3226 Args.hasFlag(options::OPT_fprofile_generate,
3227 options::OPT_fno_profile_instr_generate, false) ||
3228 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3229 options::OPT_fno_profile_instr_generate, false) ||
3230 Args.hasFlag(options::OPT_fprofile_instr_generate,
3231 options::OPT_fno_profile_instr_generate, false) ||
3232 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3233 options::OPT_fno_profile_instr_generate, false) ||
3234 Args.hasArg(options::OPT_fcreate_profile) ||
3235 Args.hasArg(options::OPT_coverage)))
3236 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3237}
3238
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003239/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3240/// smooshes them together with platform defaults, to decide whether
3241/// this compile should be using PIC mode or not. Returns a tuple of
3242/// (RelocationModel, PICLevel, IsPIE).
3243static std::tuple<llvm::Reloc::Model, unsigned, bool>
3244ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3245 const ArgList &Args) {
3246 // FIXME: why does this code...and so much everywhere else, use both
3247 // ToolChain.getTriple() and Triple?
3248 bool PIE = ToolChain.isPIEDefault();
3249 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003250 // The Darwin default to use PIC does not apply when using -static.
3251 if (ToolChain.getTriple().isOSDarwin() && Args.hasArg(options::OPT_static))
3252 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003253 bool IsPICLevelTwo = PIC;
3254
3255 bool KernelOrKext =
3256 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3257
3258 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003259 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003260 switch (ToolChain.getArch()) {
3261 case llvm::Triple::arm:
3262 case llvm::Triple::armeb:
3263 case llvm::Triple::thumb:
3264 case llvm::Triple::thumbeb:
3265 case llvm::Triple::aarch64:
3266 case llvm::Triple::mips:
3267 case llvm::Triple::mipsel:
3268 case llvm::Triple::mips64:
3269 case llvm::Triple::mips64el:
3270 PIC = true; // "-fpic"
3271 break;
3272
3273 case llvm::Triple::x86:
3274 case llvm::Triple::x86_64:
3275 PIC = true; // "-fPIC"
3276 IsPICLevelTwo = true;
3277 break;
3278
3279 default:
3280 break;
3281 }
3282 }
3283
3284 // OpenBSD-specific defaults for PIE
3285 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3286 switch (ToolChain.getArch()) {
3287 case llvm::Triple::mips64:
3288 case llvm::Triple::mips64el:
3289 case llvm::Triple::sparcel:
3290 case llvm::Triple::x86:
3291 case llvm::Triple::x86_64:
3292 IsPICLevelTwo = false; // "-fpie"
3293 break;
3294
3295 case llvm::Triple::ppc:
3296 case llvm::Triple::sparc:
3297 case llvm::Triple::sparcv9:
3298 IsPICLevelTwo = true; // "-fPIE"
3299 break;
3300
3301 default:
3302 break;
3303 }
3304 }
3305
3306 // The last argument relating to either PIC or PIE wins, and no
3307 // other argument is used. If the last argument is any flavor of the
3308 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3309 // option implicitly enables PIC at the same level.
3310 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3311 options::OPT_fpic, options::OPT_fno_pic,
3312 options::OPT_fPIE, options::OPT_fno_PIE,
3313 options::OPT_fpie, options::OPT_fno_pie);
3314 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3315 // is forced, then neither PIC nor PIE flags will have no effect.
3316 if (!ToolChain.isPICDefaultForced()) {
3317 if (LastPICArg) {
3318 Option O = LastPICArg->getOption();
3319 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3320 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3321 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3322 PIC =
3323 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3324 IsPICLevelTwo =
3325 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3326 } else {
3327 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003328 if (Triple.isPS4CPU()) {
3329 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3330 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3331 if (Model != "kernel") {
3332 PIC = true;
3333 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3334 << LastPICArg->getSpelling();
3335 }
3336 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003337 }
3338 }
3339 }
3340
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003341 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3342 // PIC level would've been set to level 1, force it back to level 2 PIC
3343 // instead.
3344 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003345 IsPICLevelTwo |= ToolChain.isPICDefault();
3346
James Y Knightc4015d32015-08-21 04:14:55 +00003347 // This kernel flags are a trump-card: they will disable PIC/PIE
3348 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003349 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3350 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003351 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003352
3353 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3354 // This is a very special mode. It trumps the other modes, almost no one
3355 // uses it, and it isn't even valid on any OS but Darwin.
3356 if (!ToolChain.getTriple().isOSDarwin())
3357 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3358 << A->getSpelling() << ToolChain.getTriple().str();
3359
3360 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3361
3362 // Only a forced PIC mode can cause the actual compile to have PIC defines
3363 // etc., no flags are sufficient. This behavior was selected to closely
3364 // match that of llvm-gcc and Apple GCC before that.
3365 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3366
3367 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3368 }
3369
3370 if (PIC)
3371 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3372
3373 return std::make_tuple(llvm::Reloc::Static, 0, false);
3374}
3375
3376static const char *RelocationModelName(llvm::Reloc::Model Model) {
3377 switch (Model) {
3378 case llvm::Reloc::Default:
3379 return nullptr;
3380 case llvm::Reloc::Static:
3381 return "static";
3382 case llvm::Reloc::PIC_:
3383 return "pic";
3384 case llvm::Reloc::DynamicNoPIC:
3385 return "dynamic-no-pic";
3386 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003387 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003388}
3389
3390static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3391 ArgStringList &CmdArgs) {
3392 llvm::Reloc::Model RelocationModel;
3393 unsigned PICLevel;
3394 bool IsPIE;
3395 std::tie(RelocationModel, PICLevel, IsPIE) =
3396 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3397
3398 if (RelocationModel != llvm::Reloc::Static)
3399 CmdArgs.push_back("-KPIC");
3400}
3401
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003402void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003403 const InputInfo &Output, const InputInfoList &Inputs,
3404 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003405 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3406 const llvm::Triple Triple(TripleStr);
3407
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003408 bool KernelOrKext =
3409 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003410 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003411 ArgStringList CmdArgs;
3412
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003413 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003414 bool IsWindowsCygnus =
3415 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003416 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003417 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003418
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003419 // Check number of inputs for sanity. We need at least one input.
3420 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003421 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003422 // CUDA compilation may have multiple inputs (source file + results of
3423 // device-side compilations). All other jobs are expected to have exactly one
3424 // input.
3425 bool IsCuda = types::isCuda(Input.getType());
3426 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003427
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003428 // Invoke ourselves in -cc1 mode.
3429 //
3430 // FIXME: Implement custom jobs for internal actions.
3431 CmdArgs.push_back("-cc1");
3432
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003433 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003434 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003435 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003436
Artem Belevichfa11ab52015-11-17 22:28:46 +00003437 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003438 if (IsCuda) {
3439 // FIXME: We need a (better) way to pass information about
3440 // particular compilation pass we're constructing here. For now we
3441 // can check which toolchain we're using and pick the other one to
3442 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003443 if (&getToolChain() == C.getCudaDeviceToolChain())
3444 AuxToolChain = C.getCudaHostToolChain();
3445 else if (&getToolChain() == C.getCudaHostToolChain())
3446 AuxToolChain = C.getCudaDeviceToolChain();
3447 else
3448 llvm_unreachable("Can't figure out CUDA compilation mode.");
3449 assert(AuxToolChain != nullptr && "No aux toolchain.");
3450 CmdArgs.push_back("-aux-triple");
3451 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003452 CmdArgs.push_back("-fcuda-target-overloads");
3453 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003454 }
3455
James Y Knight2db38f32015-08-15 03:45:25 +00003456 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3457 Triple.getArch() == llvm::Triple::thumb)) {
3458 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003459 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003460 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003461 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003462 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003463 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003464 }
3465
Tim Northover336f1892014-03-29 13:16:12 +00003466 // Push all default warning arguments that are specific to
3467 // the given target. These come before user provided warning options
3468 // are provided.
3469 getToolChain().addClangWarningOptions(CmdArgs);
3470
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003471 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003472 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003473
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003474 if (isa<AnalyzeJobAction>(JA)) {
3475 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3476 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003477 } else if (isa<MigrateJobAction>(JA)) {
3478 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003479 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003480 if (Output.getType() == types::TY_Dependencies)
3481 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003482 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003483 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003484 if (Args.hasArg(options::OPT_rewrite_objc) &&
3485 !Args.hasArg(options::OPT_g_Group))
3486 CmdArgs.push_back("-P");
3487 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003488 } else if (isa<AssembleJobAction>(JA)) {
3489 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003490
David Blaikie9260ed62013-07-25 21:19:01 +00003491 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003492
3493 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003494 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003495 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003496 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003497 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003498
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003499 if (JA.getType() == types::TY_Nothing)
3500 CmdArgs.push_back("-fsyntax-only");
3501 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003502 CmdArgs.push_back("-emit-pch");
3503 else
3504 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003505 } else if (isa<VerifyPCHJobAction>(JA)) {
3506 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003507 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003508 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3509 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003510 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003511 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003512 } else if (JA.getType() == types::TY_LLVM_IR ||
3513 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003514 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003515 } else if (JA.getType() == types::TY_LLVM_BC ||
3516 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003517 CmdArgs.push_back("-emit-llvm-bc");
3518 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003519 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003520 } else if (JA.getType() == types::TY_AST) {
3521 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003522 } else if (JA.getType() == types::TY_ModuleFile) {
3523 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003524 } else if (JA.getType() == types::TY_RewrittenObjC) {
3525 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003526 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003527 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3528 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003529 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003530 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003531 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003532 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003533
3534 // Preserve use-list order by default when emitting bitcode, so that
3535 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3536 // same result as running passes here. For LTO, we don't need to preserve
3537 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003538 if (JA.getType() == types::TY_LLVM_BC)
3539 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003540
3541 if (D.isUsingLTO())
3542 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003543 }
3544
Teresa Johnsonaff22322015-12-07 19:21:34 +00003545 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3546 if (!types::isLLVMIR(Input.getType()))
3547 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3548 << "-x ir";
3549 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3550 }
3551
Justin Bognera88f0122014-06-20 22:59:50 +00003552 // We normally speed up the clang process a bit by skipping destructors at
3553 // exit, but when we're generating diagnostics we can rely on some of the
3554 // cleanup.
3555 if (!C.isForDiagnostics())
3556 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003557
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003558// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003559#ifdef NDEBUG
3560 CmdArgs.push_back("-disable-llvm-verifier");
3561#endif
3562
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003563 // Set the main file name, so that debug info works even with
3564 // -save-temps.
3565 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003566 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003567
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003568 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003569 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003570 if (Args.hasArg(options::OPT_static))
3571 CmdArgs.push_back("-static-define");
3572
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003573 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003574 // Enable region store model by default.
3575 CmdArgs.push_back("-analyzer-store=region");
3576
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003577 // Treat blocks as analysis entry points.
3578 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3579
Ted Kremenek49c79792011-03-24 00:28:47 +00003580 CmdArgs.push_back("-analyzer-eagerly-assume");
3581
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003582 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003583 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003584 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003585
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003586 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003587 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003588
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003589 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003590 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003591
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003592 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003593
Artem Belevichba558952015-05-06 18:20:23 +00003594 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003595 CmdArgs.push_back("-analyzer-checker=cplusplus");
3596
Nico Webere8e53112014-05-11 01:04:02 +00003597 // Enable the following experimental checkers for testing.
3598 CmdArgs.push_back(
3599 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003600 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3601 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003602 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003603 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3604 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003605
3606 // Default nullability checks.
3607 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3608 CmdArgs.push_back(
3609 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003610 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003611
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003612 // Set the output format. The default is plist, for (lame) historical
3613 // reasons.
3614 CmdArgs.push_back("-analyzer-output");
3615 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003616 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003617 else
3618 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003619
Ted Kremenekfe449a22010-03-22 22:32:05 +00003620 // Disable the presentation of standard compiler warnings when
3621 // using --analyze. We only want to show static analyzer diagnostics
3622 // or frontend errors.
3623 CmdArgs.push_back("-w");
3624
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003625 // Add -Xanalyzer arguments when running as analyzer.
3626 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003627 }
3628
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003629 CheckCodeGenerationOptions(D, Args);
3630
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003631 llvm::Reloc::Model RelocationModel;
3632 unsigned PICLevel;
3633 bool IsPIE;
3634 std::tie(RelocationModel, PICLevel, IsPIE) =
3635 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003636
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003637 const char *RMName = RelocationModelName(RelocationModel);
3638 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003639 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003640 CmdArgs.push_back(RMName);
3641 }
3642 if (PICLevel > 0) {
3643 CmdArgs.push_back("-pic-level");
3644 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3645 if (IsPIE) {
3646 CmdArgs.push_back("-pie-level");
3647 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003648 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003649 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003650
Renato Golin4854d802015-11-09 12:40:41 +00003651 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3652 CmdArgs.push_back("-meabi");
3653 CmdArgs.push_back(A->getValue());
3654 }
3655
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003656 CmdArgs.push_back("-mthread-model");
3657 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3658 CmdArgs.push_back(A->getValue());
3659 else
3660 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3661
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003662 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3663
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003664 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3665 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003666 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003667
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003668 // LLVM Code Generator Options.
3669
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003670 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3671 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003672 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3673 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003674 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003675 CmdArgs.push_back(A->getValue());
3676 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003677 }
3678 }
3679
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003680 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3681 StringRef v = A->getValue();
3682 CmdArgs.push_back("-mllvm");
3683 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3684 A->claim();
3685 }
3686
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003687 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3688 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003689 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003690 }
3691
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003692 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3693 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003694 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003695 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003696 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003697 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3698 CmdArgs.push_back("-fpcc-struct-return");
3699 } else {
3700 assert(A->getOption().matches(options::OPT_freg_struct_return));
3701 CmdArgs.push_back("-freg-struct-return");
3702 }
3703 }
3704
Roman Divacky65b88cd2011-03-01 17:40:53 +00003705 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3706 CmdArgs.push_back("-mrtd");
3707
Rafael Espindola224dd632011-12-14 21:02:23 +00003708 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003709 CmdArgs.push_back("-mdisable-fp-elim");
3710 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3711 options::OPT_fno_zero_initialized_in_bss))
3712 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003713
3714 bool OFastEnabled = isOptimizationLevelFast(Args);
3715 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3716 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003717 OptSpecifier StrictAliasingAliasOption =
3718 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003719 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3720 // doesn't do any TBAA.
3721 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003722 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003723 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003724 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003725 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3726 options::OPT_fno_struct_path_tbaa))
3727 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003728 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3729 false))
3730 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003731 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3732 options::OPT_fno_strict_vtable_pointers,
3733 false))
3734 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003735 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3736 options::OPT_fno_optimize_sibling_calls))
3737 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003738
Eric Christopher006208c2013-04-04 06:29:47 +00003739 // Handle segmented stacks.
3740 if (Args.hasArg(options::OPT_fsplit_stack))
3741 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003742
3743 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3744 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003745 OptSpecifier FastMathAliasOption =
3746 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3747
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003748 // Handle various floating point optimization flags, mapping them to the
3749 // appropriate LLVM code generation flags. The pattern for all of these is to
3750 // default off the codegen optimizations, and if any flag enables them and no
3751 // flag disables them after the flag enabling them, enable the codegen
3752 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003753 if (Arg *A = Args.getLastArg(
3754 options::OPT_ffast_math, FastMathAliasOption,
3755 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3756 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3757 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003758 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3759 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003760 A->getOption().getID() != options::OPT_fhonor_infinities)
3761 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003762 if (Arg *A = Args.getLastArg(
3763 options::OPT_ffast_math, FastMathAliasOption,
3764 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3765 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3766 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003767 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3768 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003769 A->getOption().getID() != options::OPT_fhonor_nans)
3770 CmdArgs.push_back("-menable-no-nans");
3771
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003772 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3773 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003774 if (Arg *A =
3775 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3776 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3777 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003778 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3779 // However, turning *off* -ffast_math merely restores the toolchain default
3780 // (which may be false).
3781 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3782 A->getOption().getID() == options::OPT_ffast_math ||
3783 A->getOption().getID() == options::OPT_Ofast)
3784 MathErrno = false;
3785 else if (A->getOption().getID() == options::OPT_fmath_errno)
3786 MathErrno = true;
3787 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003788 if (MathErrno)
3789 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003790
3791 // There are several flags which require disabling very specific
3792 // optimizations. Any of these being disabled forces us to turn off the
3793 // entire set of LLVM optimizations, so collect them through all the flag
3794 // madness.
3795 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003796 if (Arg *A = Args.getLastArg(
3797 options::OPT_ffast_math, FastMathAliasOption,
3798 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3799 options::OPT_fno_unsafe_math_optimizations,
3800 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003801 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3802 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003803 A->getOption().getID() != options::OPT_fno_associative_math)
3804 AssociativeMath = true;
3805 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003806 if (Arg *A = Args.getLastArg(
3807 options::OPT_ffast_math, FastMathAliasOption,
3808 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3809 options::OPT_fno_unsafe_math_optimizations,
3810 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003811 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3812 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003813 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3814 ReciprocalMath = true;
3815 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003816 if (Arg *A = Args.getLastArg(
3817 options::OPT_ffast_math, FastMathAliasOption,
3818 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3819 options::OPT_fno_unsafe_math_optimizations,
3820 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003821 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3822 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003823 A->getOption().getID() != options::OPT_fsigned_zeros)
3824 SignedZeros = false;
3825 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003826 if (Arg *A = Args.getLastArg(
3827 options::OPT_ffast_math, FastMathAliasOption,
3828 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3829 options::OPT_fno_unsafe_math_optimizations,
3830 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003831 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3832 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003833 A->getOption().getID() != options::OPT_ftrapping_math)
3834 TrappingMath = false;
3835 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3836 !TrappingMath)
3837 CmdArgs.push_back("-menable-unsafe-fp-math");
3838
Sanjay Patel76c9e092015-01-23 16:40:50 +00003839 if (!SignedZeros)
3840 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003841
Sanjay Patel359b1052015-04-09 15:03:23 +00003842 if (ReciprocalMath)
3843 CmdArgs.push_back("-freciprocal-math");
3844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003845 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003846 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003847 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003848 options::OPT_ffp_contract)) {
3849 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003850 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003851 if (Val == "fast" || Val == "on" || Val == "off") {
3852 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3853 } else {
3854 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003855 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003856 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003857 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3858 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003859 // If fast-math is set then set the fp-contract mode to fast.
3860 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3861 }
3862 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003863
Sanjay Patel2987c292015-06-11 14:53:41 +00003864 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003865
Bob Wilson6a039162012-07-19 03:52:53 +00003866 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3867 // and if we find them, tell the frontend to provide the appropriate
3868 // preprocessor macros. This is distinct from enabling any optimizations as
3869 // these options induce language changes which must survive serialization
3870 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003871 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3872 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003873 if (!A->getOption().matches(options::OPT_fno_fast_math))
3874 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003875 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3876 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003877 if (A->getOption().matches(options::OPT_ffinite_math_only))
3878 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003879
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003880 // Decide whether to use verbose asm. Verbose assembly is the default on
3881 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003882 bool IsIntegratedAssemblerDefault =
3883 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003884 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003885 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003886 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003887 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003888
Rafael Espindolab8a12932015-05-22 20:44:03 +00003889 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3890 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003891 CmdArgs.push_back("-no-integrated-as");
3892
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003893 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3894 CmdArgs.push_back("-mdebug-pass");
3895 CmdArgs.push_back("Structure");
3896 }
3897 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3898 CmdArgs.push_back("-mdebug-pass");
3899 CmdArgs.push_back("Arguments");
3900 }
3901
John McCall8517abc2010-02-19 02:45:38 +00003902 // Enable -mconstructor-aliases except on darwin, where we have to
3903 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003904 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003905 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003906
John McCall7ef5cb32011-03-18 02:56:14 +00003907 // Darwin's kernel doesn't support guard variables; just die if we
3908 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003909 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003910 CmdArgs.push_back("-fforbid-guard-variables");
3911
Akira Hatanaka02028482015-11-12 17:21:22 +00003912 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3913 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003914 CmdArgs.push_back("-mms-bitfields");
3915 }
John McCall8517abc2010-02-19 02:45:38 +00003916
Daniel Dunbar306945d2009-09-16 06:17:29 +00003917 // This is a coarse approximation of what llvm-gcc actually does, both
3918 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3919 // complicated ways.
3920 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003921 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3922 options::OPT_fno_asynchronous_unwind_tables,
3923 (getToolChain().IsUnwindTablesDefault() ||
3924 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3925 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003926 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3927 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003928 CmdArgs.push_back("-munwind-tables");
3929
Chandler Carruth05fb5852012-11-21 23:40:23 +00003930 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003931
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003932 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3933 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003934 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003935 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003936
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003937 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003938 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003939
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003940 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003941 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003942 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003943 }
3944
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003945 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003946 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003947 if (!CPU.empty()) {
3948 CmdArgs.push_back("-target-cpu");
3949 CmdArgs.push_back(Args.MakeArgString(CPU));
3950 }
3951
Rafael Espindolaeb265472013-08-21 21:59:03 +00003952 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3953 CmdArgs.push_back("-mfpmath");
3954 CmdArgs.push_back(A->getValue());
3955 }
3956
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003957 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003958 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003959
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003960 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003961 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003962 default:
3963 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003964
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003965 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003966 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003967 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003968 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003969 // Use the effective triple, which takes into account the deployment target.
3970 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003971 break;
3972
Tim Northover573cbee2014-05-24 12:52:07 +00003973 case llvm::Triple::aarch64:
3974 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003975 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003976 break;
3977
Eric Christopher0b26a612010-03-02 02:41:08 +00003978 case llvm::Triple::mips:
3979 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003980 case llvm::Triple::mips64:
3981 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003982 AddMIPSTargetArgs(Args, CmdArgs);
3983 break;
3984
Ulrich Weigand8afad612014-07-28 13:17:52 +00003985 case llvm::Triple::ppc:
3986 case llvm::Triple::ppc64:
3987 case llvm::Triple::ppc64le:
3988 AddPPCTargetArgs(Args, CmdArgs);
3989 break;
3990
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003991 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003992 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003993 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003994 AddSparcTargetArgs(Args, CmdArgs);
3995 break;
3996
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003997 case llvm::Triple::x86:
3998 case llvm::Triple::x86_64:
3999 AddX86TargetArgs(Args, CmdArgs);
4000 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004001
4002 case llvm::Triple::hexagon:
4003 AddHexagonTargetArgs(Args, CmdArgs);
4004 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004005 }
4006
Douglas Katzman3459ce22015-10-08 04:24:12 +00004007 // The 'g' groups options involve a somewhat intricate sequence of decisions
4008 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004009 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004010 // * what level of debug info to generate
4011 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004012 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004013 // This avoids having to monkey around further in cc1 other than to disable
4014 // codeview if not running in a Windows environment. Perhaps even that
4015 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004016 unsigned DwarfVersion = 0;
4017 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4018 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004019 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4020 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004021 bool EmitCodeView = false;
4022
Hans Wennborg75958c42013-08-08 00:17:41 +00004023 // Add clang-cl arguments.
4024 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004025 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004026
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004027 // Pass the linker version in use.
4028 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4029 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004030 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004031 }
4032
Eric Christopherb7d97e92013-04-03 01:58:53 +00004033 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004034 CmdArgs.push_back("-momit-leaf-frame-pointer");
4035
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004036 // Explicitly error on some things we know we don't support and can't just
4037 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004038 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004039 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4040 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004041 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004042 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004043 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4044 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004045 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004046 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004047 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004048 }
4049
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004050 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004051 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004052 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004053 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004054 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4055 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004056 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004057 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004058 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004059
Chad Rosierbe10f982011-08-02 17:58:04 +00004060 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004061 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004062 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4063 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004064 }
4065
Rafael Espindola08a692a2010-03-07 04:46:18 +00004066 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004067 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004068 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004069 // If the last option explicitly specified a debug-info level, use it.
4070 if (A->getOption().matches(options::OPT_gN_Group)) {
4071 DebugInfoKind = DebugLevelToInfoKind(*A);
4072 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4073 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4074 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4075 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4076 A->getIndex() > SplitDwarfArg->getIndex())
4077 SplitDwarfArg = nullptr;
4078 } else
4079 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004080 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004081 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004082
Paul Robinson0334a042015-12-19 19:41:48 +00004083 // If a debugger tuning argument appeared, remember it.
4084 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4085 options::OPT_ggdbN_Group)) {
4086 if (A->getOption().matches(options::OPT_glldb))
4087 DebuggerTuning = llvm::DebuggerKind::LLDB;
4088 else if (A->getOption().matches(options::OPT_gsce))
4089 DebuggerTuning = llvm::DebuggerKind::SCE;
4090 else
4091 DebuggerTuning = llvm::DebuggerKind::GDB;
4092 }
4093
4094 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004095 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
4096 options::OPT_gdwarf_4))
4097 DwarfVersion = DwarfVersionNum(A->getSpelling());
4098
Reid Kleckner124955a2015-08-05 18:51:13 +00004099 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004100 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4101 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4102 // DwarfVersion remains at 0 if no explicit choice was made.
4103 CmdArgs.push_back("-gcodeview");
4104 } else if (DwarfVersion == 0 &&
4105 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4106 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4107 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004108
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004109 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4110 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004111
4112 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004113 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004114 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004115 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004116
Eric Christopher138c32b2013-09-13 22:37:55 +00004117 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004118 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004119 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004120 CmdArgs.push_back("-dwarf-ext-refs");
4121 CmdArgs.push_back("-fmodule-format=obj");
4122 }
4123
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004124 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4125 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004126 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004127 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004128 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004129 CmdArgs.push_back("-backend-option");
4130 CmdArgs.push_back("-split-dwarf=Enable");
4131 }
4132
Douglas Katzman3459ce22015-10-08 04:24:12 +00004133 // After we've dealt with all combinations of things that could
4134 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4135 // figure out if we need to "upgrade" it to standalone debug info.
4136 // We parse these two '-f' options whether or not they will be used,
4137 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4138 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4139 options::OPT_fno_standalone_debug,
4140 getToolChain().GetDefaultStandaloneDebug());
4141 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4142 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004143 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4144 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004145
Eric Christopher138c32b2013-09-13 22:37:55 +00004146 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4147 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4148 CmdArgs.push_back("-backend-option");
4149 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4150 }
Eric Christophereec89c22013-06-18 00:03:50 +00004151
Eric Christopher0d403d22014-02-14 01:27:03 +00004152 // -gdwarf-aranges turns on the emission of the aranges section in the
4153 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004154 // Always enabled on the PS4.
4155 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004156 CmdArgs.push_back("-backend-option");
4157 CmdArgs.push_back("-generate-arange-section");
4158 }
4159
David Blaikief36d9ba2014-01-27 18:52:43 +00004160 if (Args.hasFlag(options::OPT_fdebug_types_section,
4161 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004162 CmdArgs.push_back("-backend-option");
4163 CmdArgs.push_back("-generate-type-units");
4164 }
Eric Christophereec89c22013-06-18 00:03:50 +00004165
Ed Schouten6e576152015-03-26 17:50:28 +00004166 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4167 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4168
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004169 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004170 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004171 CmdArgs.push_back("-ffunction-sections");
4172 }
4173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004174 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4175 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004176 CmdArgs.push_back("-fdata-sections");
4177 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004178
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004179 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004180 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004181 CmdArgs.push_back("-fno-unique-section-names");
4182
Chris Lattner3c77a352010-06-22 00:03:40 +00004183 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4184
Diego Novilloa0545962015-07-10 18:00:07 +00004185 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004186
Paul Robinsond083b9a2015-12-16 17:25:27 +00004187 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4188 if (getToolChain().getTriple().isPS4CPU())
4189 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4190
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004191 // Pass options for controlling the default header search paths.
4192 if (Args.hasArg(options::OPT_nostdinc)) {
4193 CmdArgs.push_back("-nostdsysteminc");
4194 CmdArgs.push_back("-nobuiltininc");
4195 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004196 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004197 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004198 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4199 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4200 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004201
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004202 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004203 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004204 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004205
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004206 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4207
Ted Kremenekf7639e12012-03-06 20:06:33 +00004208 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004209 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004210 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004211 options::OPT_ccc_arcmt_modify,
4212 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004213 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004214 switch (A->getOption().getID()) {
4215 default:
4216 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004217 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004218 CmdArgs.push_back("-arcmt-check");
4219 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004220 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004221 CmdArgs.push_back("-arcmt-modify");
4222 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004223 case options::OPT_ccc_arcmt_migrate:
4224 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004225 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004226 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004227
4228 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4229 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004230 break;
John McCalld70fb982011-06-15 23:25:17 +00004231 }
4232 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004233 } else {
4234 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4235 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4236 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004237 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004238
Ted Kremenekf7639e12012-03-06 20:06:33 +00004239 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4240 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004241 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4242 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004243 }
4244 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004245 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004246
4247 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004248 options::OPT_objcmt_migrate_subscripting,
4249 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004250 // None specified, means enable them all.
4251 CmdArgs.push_back("-objcmt-migrate-literals");
4252 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004253 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004254 } else {
4255 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4256 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004257 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004258 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004259 } else {
4260 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4261 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4262 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4263 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4264 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4265 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004266 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004267 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4268 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4269 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4270 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4271 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4272 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4273 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004274 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004275 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004276 }
4277
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004278 // Add preprocessing options like -I, -D, etc. if we are using the
4279 // preprocessor.
4280 //
4281 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004282 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004283 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4284 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004285
Rafael Espindolaa7431922011-07-21 23:40:37 +00004286 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4287 // that "The compiler can only warn and ignore the option if not recognized".
4288 // When building with ccache, it will pass -D options to clang even on
4289 // preprocessed inputs and configure concludes that -fPIC is not supported.
4290 Args.ClaimAllArgs(options::OPT_D);
4291
Alp Toker7874bdc2013-11-15 20:40:58 +00004292 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004293 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4294 if (A->getOption().matches(options::OPT_O4)) {
4295 CmdArgs.push_back("-O3");
4296 D.Diag(diag::warn_O4_is_O3);
4297 } else {
4298 A->render(Args, CmdArgs);
4299 }
4300 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004301
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004302 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004303 for (const Arg *A :
4304 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4305 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004306 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004307 }
4308
Rafael Espindola577637a2015-01-03 00:06:04 +00004309 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004310
Richard Smith3be1cb22014-08-07 00:24:21 +00004311 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004312 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004313 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4314 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004315 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004316 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004317
4318 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004319 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004320 //
4321 // If a std is supplied, only add -trigraphs if it follows the
4322 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004323 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004324 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4325 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004326 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004327 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004328 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004329 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004330 else
4331 Std->render(Args, CmdArgs);
4332
Nico Weber00721502014-12-23 22:32:37 +00004333 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004334 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004335 options::OPT_ftrigraphs,
4336 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004337 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004338 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004339 } else {
4340 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004341 //
4342 // FIXME: Clang doesn't correctly handle -std= when the input language
4343 // doesn't match. For the time being just ignore this for C++ inputs;
4344 // eventually we want to do all the standard defaulting here instead of
4345 // splitting it between the driver and clang -cc1.
4346 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004347 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4348 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004349 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004350 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004351
Nico Weber00721502014-12-23 22:32:37 +00004352 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4353 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004354 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004355
Richard Smith282b4492013-09-04 22:50:31 +00004356 // GCC's behavior for -Wwrite-strings is a bit strange:
4357 // * In C, this "warning flag" changes the types of string literals from
4358 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4359 // for the discarded qualifier.
4360 // * In C++, this is just a normal warning flag.
4361 //
4362 // Implementing this warning correctly in C is hard, so we follow GCC's
4363 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4364 // a non-const char* in C, rather than using this crude hack.
4365 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004366 // FIXME: This should behave just like a warning flag, and thus should also
4367 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4368 Arg *WriteStrings =
4369 Args.getLastArg(options::OPT_Wwrite_strings,
4370 options::OPT_Wno_write_strings, options::OPT_w);
4371 if (WriteStrings &&
4372 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004373 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004374 }
4375
Chandler Carruth61fbf622011-04-23 09:27:53 +00004376 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004377 // during C++ compilation, which it is by default. GCC keeps this define even
4378 // in the presence of '-w', match this behavior bug-for-bug.
4379 if (types::isCXX(InputType) &&
4380 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4381 true)) {
4382 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004383 }
4384
Chandler Carruthe0391482010-05-22 02:21:53 +00004385 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4386 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4387 if (Asm->getOption().matches(options::OPT_fasm))
4388 CmdArgs.push_back("-fgnu-keywords");
4389 else
4390 CmdArgs.push_back("-fno-gnu-keywords");
4391 }
4392
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004393 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4394 CmdArgs.push_back("-fno-dwarf-directory-asm");
4395
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004396 if (ShouldDisableAutolink(Args, getToolChain()))
4397 CmdArgs.push_back("-fno-autolink");
4398
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004399 // Add in -fdebug-compilation-dir if necessary.
4400 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004401
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004402 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4403 StringRef Map = A->getValue();
4404 if (Map.find('=') == StringRef::npos)
4405 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4406 else
4407 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4408 A->claim();
4409 }
4410
Richard Smith9a568822011-11-21 19:36:32 +00004411 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4412 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004413 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004414 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004415 }
4416
Richard Smith79c927b2013-11-06 19:31:51 +00004417 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4418 CmdArgs.push_back("-foperator-arrow-depth");
4419 CmdArgs.push_back(A->getValue());
4420 }
4421
Richard Smith9a568822011-11-21 19:36:32 +00004422 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4423 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004424 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004425 }
4426
Richard Smitha3d3bd22013-05-08 02:12:03 +00004427 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4428 CmdArgs.push_back("-fconstexpr-steps");
4429 CmdArgs.push_back(A->getValue());
4430 }
4431
Richard Smithb3a14522013-02-22 01:59:51 +00004432 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4433 CmdArgs.push_back("-fbracket-depth");
4434 CmdArgs.push_back(A->getValue());
4435 }
4436
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004437 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4438 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004439 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004440 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004441 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4442 } else
4443 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004444 }
4445
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004446 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004447 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004448
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004449 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4450 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004451 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004452 }
David Chisnall5778fce2009-08-31 16:41:57 +00004453
Chris Lattnere23003d2010-01-09 21:54:33 +00004454 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4455 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004456 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004457 }
4458
Chris Lattnerb35583d2010-04-07 20:49:23 +00004459 CmdArgs.push_back("-ferror-limit");
4460 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004461 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004462 else
4463 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004464
Chandler Carrutha77a7272010-05-06 04:55:18 +00004465 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4466 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004467 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004468 }
4469
4470 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4471 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004472 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004473 }
4474
Richard Smithf6f003a2011-12-16 19:06:07 +00004475 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4476 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004477 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004478 }
4479
Nick Lewycky24653262014-12-16 21:39:02 +00004480 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4481 CmdArgs.push_back("-fspell-checking-limit");
4482 CmdArgs.push_back(A->getValue());
4483 }
4484
Daniel Dunbar2c978472009-11-04 06:24:47 +00004485 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004486 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004487 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004488 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004489 } else {
4490 // If -fmessage-length=N was not specified, determine whether this is a
4491 // terminal and, if so, implicitly define -fmessage-length appropriately.
4492 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004493 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004494 }
4495
John McCallb4a99d32013-02-19 01:57:35 +00004496 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4497 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4498 options::OPT_fvisibility_ms_compat)) {
4499 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4500 CmdArgs.push_back("-fvisibility");
4501 CmdArgs.push_back(A->getValue());
4502 } else {
4503 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4504 CmdArgs.push_back("-fvisibility");
4505 CmdArgs.push_back("hidden");
4506 CmdArgs.push_back("-ftype-visibility");
4507 CmdArgs.push_back("default");
4508 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004509 }
4510
Douglas Gregor08329632010-06-15 17:05:35 +00004511 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004512
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004513 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4514
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004515 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004516 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4517 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004518 CmdArgs.push_back("-ffreestanding");
4519
Daniel Dunbare357d562009-12-03 18:42:11 +00004520 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004521 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004522 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004523 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004524 // Emulated TLS is enabled by default on Android, and can be enabled manually
4525 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004526 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004527 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4528 EmulatedTLSDefault))
4529 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004530 // AltiVec-like language extensions aren't relevant for assembling.
4531 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004532 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004533 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4534 }
Richard Trieu91844232012-06-26 18:18:47 +00004535 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4536 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004537
Alexey Bataevdb390212015-05-20 04:24:19 +00004538 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004539 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4540 options::OPT_fno_openmp, false))
4541 switch (getOpenMPRuntime(getToolChain(), Args)) {
4542 case OMPRT_OMP:
4543 case OMPRT_IOMP5:
4544 // Clang can generate useful OpenMP code for these two runtime libraries.
4545 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004546
4547 // If no option regarding the use of TLS in OpenMP codegeneration is
4548 // given, decide a default based on the target. Otherwise rely on the
4549 // options and pass the right information to the frontend.
4550 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004551 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004552 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004553 break;
4554 default:
4555 // By default, if Clang doesn't know how to generate useful OpenMP code
4556 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4557 // down to the actual compilation.
4558 // FIXME: It would be better to have a mode which *only* omits IR
4559 // generation based on the OpenMP support so that we get consistent
4560 // semantic analysis, etc.
4561 break;
4562 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004563
Peter Collingbourne32701642013-11-01 18:16:25 +00004564 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004565 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004566
Eric Christopher459d2712013-02-19 06:16:53 +00004567 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004568 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4569 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4570 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4571 Arch == llvm::Triple::ppc64le))
4572 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4573 << "ppc/ppc64/ppc64le";
4574 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004575
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004576 // -fzvector is incompatible with -faltivec.
4577 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4578 if (Args.hasArg(options::OPT_faltivec))
4579 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4580 << "-faltivec";
4581
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004582 if (getToolChain().SupportsProfiling())
4583 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004584
4585 // -flax-vector-conversions is default.
4586 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4587 options::OPT_fno_lax_vector_conversions))
4588 CmdArgs.push_back("-fno-lax-vector-conversions");
4589
John Brawna7b4ec02015-08-10 11:11:28 +00004590 if (Args.getLastArg(options::OPT_fapple_kext) ||
4591 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004592 CmdArgs.push_back("-fapple-kext");
4593
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004594 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004595 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004596 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004597 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4598 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004599
4600 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4601 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004602 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004603 }
4604
Bob Wilson14adb362012-02-03 06:27:22 +00004605 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004606
Chandler Carruth6e501032011-03-27 00:04:55 +00004607 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4608 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004609 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004610 if (A->getOption().matches(options::OPT_fwrapv))
4611 CmdArgs.push_back("-fwrapv");
4612 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4613 options::OPT_fno_strict_overflow)) {
4614 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4615 CmdArgs.push_back("-fwrapv");
4616 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004617
4618 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4619 options::OPT_fno_reroll_loops))
4620 if (A->getOption().matches(options::OPT_freroll_loops))
4621 CmdArgs.push_back("-freroll-loops");
4622
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004623 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004624 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4625 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004626
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004627 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4628
Daniel Dunbar4930e332009-11-17 08:07:36 +00004629 // -stack-protector=0 is default.
4630 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004631 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4632 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4633 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4634 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4635 Args.ClaimAllArgs(options::OPT_fstack_protector);
4636 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004637 options::OPT_fstack_protector_all,
4638 options::OPT_fstack_protector_strong,
4639 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004640 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004641 StackProtectorLevel = std::max<unsigned>(
4642 LangOptions::SSPOn,
4643 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004644 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004645 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004646 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004647 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004648 } else {
4649 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004650 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004651 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004652 if (StackProtectorLevel) {
4653 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004654 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004655 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004656
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004657 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004658 for (const Arg *A : Args.filtered(options::OPT__param)) {
4659 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004660 if (Str.startswith("ssp-buffer-size=")) {
4661 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004662 CmdArgs.push_back("-stack-protector-buffer-size");
4663 // FIXME: Verify the argument is a valid integer.
4664 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004665 }
Sean Silva14facf32015-06-09 01:57:17 +00004666 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004667 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004668 }
4669
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004670 // Translate -mstackrealign
4671 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004672 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004673 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004674
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004675 if (Args.hasArg(options::OPT_mstack_alignment)) {
4676 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4677 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004678 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004679
Hans Wennborg77dc2362015-01-20 19:45:50 +00004680 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4681 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4682
4683 if (!Size.empty())
4684 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4685 else
4686 CmdArgs.push_back("-mstack-probe-size=0");
4687 }
4688
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004689 switch (getToolChain().getArch()) {
4690 case llvm::Triple::aarch64:
4691 case llvm::Triple::aarch64_be:
4692 case llvm::Triple::arm:
4693 case llvm::Triple::armeb:
4694 case llvm::Triple::thumb:
4695 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004696 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004697 break;
4698
4699 default:
4700 break;
4701 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004702
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004703 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4704 options::OPT_mno_restrict_it)) {
4705 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4706 CmdArgs.push_back("-backend-option");
4707 CmdArgs.push_back("-arm-restrict-it");
4708 } else {
4709 CmdArgs.push_back("-backend-option");
4710 CmdArgs.push_back("-arm-no-restrict-it");
4711 }
James Y Knight2db38f32015-08-15 03:45:25 +00004712 } else if (Triple.isOSWindows() &&
4713 (Triple.getArch() == llvm::Triple::arm ||
4714 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004715 // Windows on ARM expects restricted IT blocks
4716 CmdArgs.push_back("-backend-option");
4717 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004718 }
4719
Daniel Dunbard18049a2009-04-07 21:16:11 +00004720 // Forward -f options with positive and negative forms; we translate
4721 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004722 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4723 StringRef fname = A->getValue();
4724 if (!llvm::sys::fs::exists(fname))
4725 D.Diag(diag::err_drv_no_such_file) << fname;
4726 else
4727 A->render(Args, CmdArgs);
4728 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004729
John Brawna7b4ec02015-08-10 11:11:28 +00004730 // -fbuiltin is default unless -mkernel is used
4731 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4732 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004733 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004734
Nuno Lopes13c88c72009-12-16 16:59:22 +00004735 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4736 options::OPT_fno_assume_sane_operator_new))
4737 CmdArgs.push_back("-fno-assume-sane-operator-new");
4738
Daniel Dunbar4930e332009-11-17 08:07:36 +00004739 // -fblocks=0 is default.
4740 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004741 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004742 (Args.hasArg(options::OPT_fgnu_runtime) &&
4743 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4744 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004745 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004746
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004747 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004748 !getToolChain().hasBlocksRuntime())
4749 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004750 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004751
Richard Smith47972af2015-06-16 00:08:24 +00004752 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004753 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004754 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004755 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004756 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004757 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4758 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004759 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004760 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004761 HaveModules = true;
4762 }
4763 }
4764
Richard Smith47972af2015-06-16 00:08:24 +00004765 // -fmodule-maps enables implicit reading of module map files. By default,
4766 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004767 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4768 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004769 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004770 }
4771
Daniel Jasperac42b752013-10-21 06:34:34 +00004772 // -fmodules-decluse checks that modules used are declared so (off by
4773 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004774 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004775 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004776 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004777 }
4778
Daniel Jasper962b38e2014-04-11 11:47:45 +00004779 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4780 // all #included headers are part of modules.
4781 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004782 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004783 CmdArgs.push_back("-fmodules-strict-decluse");
4784 }
4785
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004786 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4787 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4788 options::OPT_fno_implicit_modules)) {
4789 CmdArgs.push_back("-fno-implicit-modules");
4790 }
4791
Daniel Jasperac42b752013-10-21 06:34:34 +00004792 // -fmodule-name specifies the module that is currently being built (or
4793 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004794 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004795
Richard Smith9887d792014-10-17 01:42:53 +00004796 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004797 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004798 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004799
Richard Smithe842a472014-10-22 02:05:46 +00004800 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004801 if (HaveModules)
4802 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4803 else
4804 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004805
4806 // -fmodule-cache-path specifies where our implicitly-built module files
4807 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004808 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004809 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004810 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004811 if (HaveModules) {
4812 if (C.isForDiagnostics()) {
4813 // When generating crash reports, we want to emit the modules along with
4814 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004815 Path = Output.getFilename();
4816 llvm::sys::path::replace_extension(Path, ".cache");
4817 llvm::sys::path::append(Path, "modules");
4818 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004819 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004820 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004821 llvm::sys::path::append(Path, "org.llvm.clang.");
4822 appendUserToPath(Path);
4823 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004824 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004825 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004826 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4827 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004828 }
4829
4830 // When building modules and generating crashdumps, we need to dump a module
4831 // dependency VFS alongside the output.
4832 if (HaveModules && C.isForDiagnostics()) {
4833 SmallString<128> VFSDir(Output.getFilename());
4834 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004835 // Add the cache directory as a temp so the crash diagnostics pick it up.
4836 C.addTempFile(Args.MakeArgString(VFSDir));
4837
Justin Bognera88f0122014-06-20 22:59:50 +00004838 llvm::sys::path::append(VFSDir, "vfs");
4839 CmdArgs.push_back("-module-dependency-dir");
4840 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004841 }
4842
Richard Smith9887d792014-10-17 01:42:53 +00004843 if (HaveModules)
4844 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004845
Douglas Gregor35b04d62013-02-07 19:01:24 +00004846 // Pass through all -fmodules-ignore-macro arguments.
4847 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004848 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4849 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004850
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004851 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4852
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004853 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4854 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4855 D.Diag(diag::err_drv_argument_not_allowed_with)
4856 << A->getAsString(Args) << "-fbuild-session-timestamp";
4857
4858 llvm::sys::fs::file_status Status;
4859 if (llvm::sys::fs::status(A->getValue(), Status))
4860 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004861 CmdArgs.push_back(Args.MakeArgString(
4862 "-fbuild-session-timestamp=" +
4863 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004864 }
4865
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004866 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004867 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4868 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004869 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4870
4871 Args.AddLastArg(CmdArgs,
4872 options::OPT_fmodules_validate_once_per_build_session);
4873 }
4874
Ben Langmuirdcf73862014-03-12 00:06:17 +00004875 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4876
John McCalldfea9982010-04-09 19:12:06 +00004877 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004878 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004879 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004880 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004881
Anders Carlssond470fef2010-11-21 00:09:52 +00004882 // -felide-constructors is the default.
4883 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004885 CmdArgs.push_back("-fno-elide-constructors");
4886
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004887 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004888
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004889 if (KernelOrKext || (types::isCXX(InputType) &&
4890 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4891 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004892 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004893
Tony Linthicum76329bf2011-12-12 21:14:55 +00004894 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004895 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4896 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004897 CmdArgs.push_back("-fshort-enums");
4898
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004899 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004900 if (Arg *A = Args.getLastArg(
4901 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4902 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4903 if (A->getOption().matches(options::OPT_funsigned_char) ||
4904 A->getOption().matches(options::OPT_fno_signed_char)) {
4905 CmdArgs.push_back("-fno-signed-char");
4906 }
4907 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004908 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004909 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004910
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004911 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004912 if (!Args.hasFlag(
4913 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4914 !IsWindowsCygnus && !IsWindowsGNU &&
4915 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4916 getToolChain().getArch() != llvm::Triple::hexagon &&
4917 getToolChain().getArch() != llvm::Triple::xcore &&
4918 ((getToolChain().getTriple().getVendor() !=
4919 llvm::Triple::MipsTechnologies) ||
4920 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004921 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004922 CmdArgs.push_back("-fno-use-cxa-atexit");
4923
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004924 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004925 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004926 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004927 CmdArgs.push_back("-fms-extensions");
4928
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004929 // -fno-use-line-directives is default.
4930 if (Args.hasFlag(options::OPT_fuse_line_directives,
4931 options::OPT_fno_use_line_directives, false))
4932 CmdArgs.push_back("-fuse-line-directives");
4933
Francois Pichet1b4f1632011-09-17 04:32:15 +00004934 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004935 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004936 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004937 (IsWindowsMSVC &&
4938 Args.hasFlag(options::OPT_fms_extensions,
4939 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004940 CmdArgs.push_back("-fms-compatibility");
4941
David Majnemerc371ff02015-03-22 08:39:22 +00004942 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004943 VersionTuple MSVT = visualstudio::getMSVCVersion(
4944 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4945 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004946 CmdArgs.push_back(
4947 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004948
David Majnemer8db91762015-05-18 04:49:30 +00004949 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4950 if (ImplyVCPPCXXVer) {
4951 if (IsMSVC2015Compatible)
4952 CmdArgs.push_back("-std=c++14");
4953 else
4954 CmdArgs.push_back("-std=c++11");
4955 }
4956
Eric Christopher5ecce122013-02-18 00:38:31 +00004957 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004958 if (Args.hasFlag(options::OPT_fborland_extensions,
4959 options::OPT_fno_borland_extensions, false))
4960 CmdArgs.push_back("-fborland-extensions");
4961
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004962 // -fno-declspec is default, except for PS4.
4963 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4964 getToolChain().getTriple().isPS4()))
4965 CmdArgs.push_back("-fdeclspec");
4966 else if (Args.hasArg(options::OPT_fno_declspec))
4967 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4968
David Majnemerc371ff02015-03-22 08:39:22 +00004969 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4970 // than 19.
4971 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4972 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004973 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004974 CmdArgs.push_back("-fno-threadsafe-statics");
4975
Francois Pichet02744872011-09-01 16:38:08 +00004976 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4977 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004978 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004979 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004980 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004981
Chandler Carruthe03aa552010-04-17 20:17:31 +00004982 // -fgnu-keywords default varies depending on language; only pass if
4983 // specified.
4984 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004985 options::OPT_fno_gnu_keywords))
4986 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004987
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004988 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004989 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004990 CmdArgs.push_back("-fgnu89-inline");
4991
Chad Rosier9c76d242012-03-15 22:31:42 +00004992 if (Args.hasArg(options::OPT_fno_inline))
4993 CmdArgs.push_back("-fno-inline");
4994
Chad Rosier64d6be92012-03-06 21:17:19 +00004995 if (Args.hasArg(options::OPT_fno_inline_functions))
4996 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004997
John McCall5fb5df92012-06-20 06:18:46 +00004998 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004999
John McCall5fb5df92012-06-20 06:18:46 +00005000 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005001 // legacy is the default. Except for deployment taget of 10.5,
5002 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5003 // gets ignored silently.
5004 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005005 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5006 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005007 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005008 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005009 if (getToolChain().UseObjCMixedDispatch())
5010 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5011 else
5012 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5013 }
5014 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005015
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005016 // When ObjectiveC legacy runtime is in effect on MacOSX,
5017 // turn on the option to do Array/Dictionary subscripting
5018 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005019 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005020 getToolChain().getTriple().isMacOSX() &&
5021 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5022 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005023 objcRuntime.isNeXTFamily())
5024 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005025
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005026 // -fencode-extended-block-signature=1 is default.
5027 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5028 CmdArgs.push_back("-fencode-extended-block-signature");
5029 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005030
John McCall24fc0de2011-07-06 00:26:06 +00005031 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5032 // NOTE: This logic is duplicated in ToolChains.cpp.
5033 bool ARC = isObjCAutoRefCount(Args);
5034 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005035 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005036
John McCall24fc0de2011-07-06 00:26:06 +00005037 CmdArgs.push_back("-fobjc-arc");
5038
Chandler Carruth491db322011-11-04 07:34:47 +00005039 // FIXME: It seems like this entire block, and several around it should be
5040 // wrapped in isObjC, but for now we just use it here as this is where it
5041 // was being used previously.
5042 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5043 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5044 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5045 else
5046 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5047 }
5048
John McCall24fc0de2011-07-06 00:26:06 +00005049 // Allow the user to enable full exceptions code emission.
5050 // We define off for Objective-CC, on for Objective-C++.
5051 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5052 options::OPT_fno_objc_arc_exceptions,
5053 /*default*/ types::isCXX(InputType)))
5054 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005055
John McCall24fc0de2011-07-06 00:26:06 +00005056 }
5057
5058 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5059 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005060 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005061 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005062
John McCall24fc0de2011-07-06 00:26:06 +00005063 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5064 // takes precedence.
5065 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5066 if (!GCArg)
5067 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5068 if (GCArg) {
5069 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005070 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005071 } else if (getToolChain().SupportsObjCGC()) {
5072 GCArg->render(Args, CmdArgs);
5073 } else {
5074 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005075 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005076 }
5077 }
5078
John McCallfbe5ed72015-11-05 19:19:56 +00005079 // Pass down -fobjc-weak or -fno-objc-weak if present.
5080 if (types::isObjC(InputType)) {
5081 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5082 options::OPT_fno_objc_weak);
5083 if (!WeakArg) {
5084 // nothing to do
5085 } else if (GCArg) {
5086 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5087 D.Diag(diag::err_objc_weak_with_gc);
5088 } else if (!objcRuntime.allowsWeak()) {
5089 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5090 D.Diag(diag::err_objc_weak_unsupported);
5091 } else {
5092 WeakArg->render(Args, CmdArgs);
5093 }
5094 }
5095
Bob Wilsonb111ec92015-03-02 19:01:14 +00005096 if (Args.hasFlag(options::OPT_fapplication_extension,
5097 options::OPT_fno_application_extension, false))
5098 CmdArgs.push_back("-fapplication-extension");
5099
Reid Klecknerc542d372014-06-27 17:02:02 +00005100 // Handle GCC-style exception args.
5101 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005102 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5103 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005104
Tim Northovere931f9f2015-10-30 16:30:41 +00005105 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005106 CmdArgs.push_back("-fsjlj-exceptions");
5107
5108 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005109 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5110 options::OPT_fno_assume_sane_operator_new))
5111 CmdArgs.push_back("-fno-assume-sane-operator-new");
5112
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005113 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5114 // most platforms.
5115 if (Args.hasFlag(options::OPT_fsized_deallocation,
5116 options::OPT_fno_sized_deallocation, false))
5117 CmdArgs.push_back("-fsized-deallocation");
5118
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005119 // -fconstant-cfstrings is default, and may be subject to argument translation
5120 // on Darwin.
5121 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5122 options::OPT_fno_constant_cfstrings) ||
5123 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5124 options::OPT_mno_constant_cfstrings))
5125 CmdArgs.push_back("-fno-constant-cfstrings");
5126
John Thompsoned4e2952009-11-05 20:14:16 +00005127 // -fshort-wchar default varies depending on platform; only
5128 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005129 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5130 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005131 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005132
Hans Wennborg28c96312013-07-31 23:39:13 +00005133 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005134 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005135 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005136 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005137
Daniel Dunbar096ed292011-10-05 21:04:55 +00005138 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5139 // -fno-pack-struct doesn't apply to -fpack-struct=.
5140 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005141 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005142 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005143 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005144 } else if (Args.hasFlag(options::OPT_fpack_struct,
5145 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005146 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005147 }
5148
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005149 // Handle -fmax-type-align=N and -fno-type-align
5150 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5151 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5152 if (!SkipMaxTypeAlign) {
5153 std::string MaxTypeAlignStr = "-fmax-type-align=";
5154 MaxTypeAlignStr += A->getValue();
5155 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5156 }
5157 } else if (getToolChain().getTriple().isOSDarwin()) {
5158 if (!SkipMaxTypeAlign) {
5159 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5160 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5161 }
5162 }
5163
John Brawna7b4ec02015-08-10 11:11:28 +00005164 // -fcommon is the default unless compiling kernel code or the target says so
5165 bool NoCommonDefault =
5166 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5167 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5168 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005169 CmdArgs.push_back("-fno-common");
5170
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005171 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005172 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005173 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005174 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005175 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005176 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005177
Daniel Dunbar6358d682010-10-15 22:30:42 +00005178 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005179 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005180 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005181 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005182
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005183 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005184 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5185 StringRef value = inputCharset->getValue();
5186 if (value != "UTF-8")
5187 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5188 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005189 }
5190
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005191 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005192 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5193 StringRef value = execCharset->getValue();
5194 if (value != "UTF-8")
5195 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5196 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005197 }
5198
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005199 // -fcaret-diagnostics is default.
5200 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5201 options::OPT_fno_caret_diagnostics, true))
5202 CmdArgs.push_back("-fno-caret-diagnostics");
5203
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005204 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005205 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005206 options::OPT_fno_diagnostics_fixit_info))
5207 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005208
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005209 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005210 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005211 options::OPT_fno_diagnostics_show_option))
5212 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005213
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005214 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005215 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005216 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005217 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005218 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005219
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005221 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005222 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005223 }
5224
Chandler Carruthb6766f02011-03-27 01:50:55 +00005225 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005226 options::OPT_fdiagnostics_show_note_include_stack,
5227 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005228 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005229 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005230 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5231 else
5232 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5233 }
5234
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005235 // Color diagnostics are the default, unless the terminal doesn't support
5236 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005237 // Support both clang's -f[no-]color-diagnostics and gcc's
5238 // -f[no-]diagnostics-colors[=never|always|auto].
5239 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005240 for (const auto &Arg : Args) {
5241 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005242 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5243 !O.matches(options::OPT_fdiagnostics_color) &&
5244 !O.matches(options::OPT_fno_color_diagnostics) &&
5245 !O.matches(options::OPT_fno_diagnostics_color) &&
5246 !O.matches(options::OPT_fdiagnostics_color_EQ))
5247 continue;
5248
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005249 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005250 if (O.matches(options::OPT_fcolor_diagnostics) ||
5251 O.matches(options::OPT_fdiagnostics_color)) {
5252 ShowColors = Colors_On;
5253 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5254 O.matches(options::OPT_fno_diagnostics_color)) {
5255 ShowColors = Colors_Off;
5256 } else {
5257 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005258 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005259 if (value == "always")
5260 ShowColors = Colors_On;
5261 else if (value == "never")
5262 ShowColors = Colors_Off;
5263 else if (value == "auto")
5264 ShowColors = Colors_Auto;
5265 else
5266 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005267 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005268 }
5269 }
5270 if (ShowColors == Colors_On ||
5271 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005272 CmdArgs.push_back("-fcolor-diagnostics");
5273
Nico Rieck7857d462013-09-11 00:38:02 +00005274 if (Args.hasArg(options::OPT_fansi_escape_codes))
5275 CmdArgs.push_back("-fansi-escape-codes");
5276
Daniel Dunbardb097022009-06-08 21:13:54 +00005277 if (!Args.hasFlag(options::OPT_fshow_source_location,
5278 options::OPT_fno_show_source_location))
5279 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005280
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005281 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005282 true))
5283 CmdArgs.push_back("-fno-show-column");
5284
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005285 if (!Args.hasFlag(options::OPT_fspell_checking,
5286 options::OPT_fno_spell_checking))
5287 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005288
Chad Rosierc8e56e82012-12-05 21:08:21 +00005289 // -fno-asm-blocks is default.
5290 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5291 false))
5292 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005293
Steven Wucb0d13f2015-01-16 23:05:28 +00005294 // -fgnu-inline-asm is default.
5295 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5296 options::OPT_fno_gnu_inline_asm, true))
5297 CmdArgs.push_back("-fno-gnu-inline-asm");
5298
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005299 // Enable vectorization per default according to the optimization level
5300 // selected. For optimization levels that want vectorization we use the alias
5301 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005302 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005303 OptSpecifier VectorizeAliasOption =
5304 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005305 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005306 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005307 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005308
Chad Rosier136d67d2014-04-28 19:30:57 +00005309 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005310 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005311 OptSpecifier SLPVectAliasOption =
5312 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005313 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005314 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005315 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005316
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005317 // -fno-slp-vectorize-aggressive is default.
5318 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005319 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005320 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005321
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005322 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5323 A->render(Args, CmdArgs);
5324
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005325 // -fdollars-in-identifiers default varies depending on platform and
5326 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005327 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005328 options::OPT_fno_dollars_in_identifiers)) {
5329 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005330 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005331 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005332 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005333 }
5334
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005335 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5336 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005337 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005338 options::OPT_fno_unit_at_a_time)) {
5339 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005340 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005341 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005342
Eli Friedman055c9702011-11-02 01:53:16 +00005343 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5344 options::OPT_fno_apple_pragma_pack, false))
5345 CmdArgs.push_back("-fapple-pragma-pack");
5346
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005348 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5349 // by default.
5350 if (getToolChain().getArch() == llvm::Triple::le32) {
5351 CmdArgs.push_back("-fno-math-builtin");
5352 }
5353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005354// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5355//
5356// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005357#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005358 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005359 (getToolChain().getArch() == llvm::Triple::arm ||
5360 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005361 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5362 CmdArgs.push_back("-fno-builtin-strcat");
5363 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5364 CmdArgs.push_back("-fno-builtin-strcpy");
5365 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005366#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005367
Justin Bognera88f0122014-06-20 22:59:50 +00005368 // Enable rewrite includes if the user's asked for it or if we're generating
5369 // diagnostics.
5370 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5371 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005372 if (Args.hasFlag(options::OPT_frewrite_includes,
5373 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005374 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005375 CmdArgs.push_back("-frewrite-includes");
5376
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005377 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005378 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005379 options::OPT_traditional_cpp)) {
5380 if (isa<PreprocessJobAction>(JA))
5381 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005382 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005383 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005384 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005385
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005386 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005387 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005388
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005389 // Handle serialized diagnostics.
5390 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5391 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005392 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005393 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005394
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005395 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5396 CmdArgs.push_back("-fretain-comments-from-system-headers");
5397
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005398 // Forward -fcomment-block-commands to -cc1.
5399 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005400 // Forward -fparse-all-comments to -cc1.
5401 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005402
John Brawnad31ace2015-09-23 13:55:40 +00005403 // Turn -fplugin=name.so into -load name.so
5404 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5405 CmdArgs.push_back("-load");
5406 CmdArgs.push_back(A->getValue());
5407 A->claim();
5408 }
5409
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005410 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5411 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005412 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005413 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5414 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005415
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005416 // We translate this by hand to the -cc1 argument, since nightly test uses
5417 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005418 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005419 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005420 } else
Sean Silva14facf32015-06-09 01:57:17 +00005421 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005422 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005423
Bob Wilson23a55f12014-12-21 07:00:00 +00005424 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005425 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5426 // by the frontend.
5427 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5428 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005429
Daniel Dunbard67a3222009-03-30 06:36:42 +00005430 if (Output.getType() == types::TY_Dependencies) {
5431 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005432 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005433 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005434 CmdArgs.push_back(Output.getFilename());
5435 } else {
5436 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005437 }
5438
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005439 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005440
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005441 if (Input.isFilename())
5442 CmdArgs.push_back(Input.getFilename());
5443 else
5444 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005445
Chris Lattnere9d7d782009-11-03 19:50:27 +00005446 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5447
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005448 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005449
5450 // Optionally embed the -cc1 level arguments into the debug info, for build
5451 // analysis.
5452 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005453 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005454 for (const auto &Arg : Args)
5455 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005456
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005457 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005458 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005459 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005460 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005461 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005462 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005463 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005464 }
5465 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005466 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005467 }
5468
Eric Christopherd3804002013-02-22 20:12:52 +00005469 // Add the split debug info name to the command lines here so we
5470 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005471 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005472 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5473 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005474 const char *SplitDwarfOut;
5475 if (SplitDwarf) {
5476 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005477 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005478 CmdArgs.push_back(SplitDwarfOut);
5479 }
5480
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005481 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5482 // Include them with -fcuda-include-gpubinary.
5483 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005484 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005485 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005486 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005487 }
5488
Eric Christopherd3804002013-02-22 20:12:52 +00005489 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005490 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005491 Output.getType() == types::TY_Object &&
5492 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005493 auto CLCommand =
5494 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005495 C.addCommand(llvm::make_unique<FallbackCommand>(
5496 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005497 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005498 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005499 }
5500
Eric Christopherf1545832013-02-22 23:50:16 +00005501 // Handle the debug info splitting at object creation time if we're
5502 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005503 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005504 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005505 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005506
Roman Divacky178e01602011-02-10 16:52:03 +00005507 if (Arg *A = Args.getLastArg(options::OPT_pg))
5508 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005509 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5510 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005511
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005512 // Claim some arguments which clang supports automatically.
5513
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005514 // -fpch-preprocess is used with gcc to add a special marker in the output to
5515 // include the PCH file. Clang's PTH solution is completely transparent, so we
5516 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005517 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005518
Daniel Dunbar17731772009-03-23 19:03:36 +00005519 // Claim some arguments which clang doesn't support, but we don't
5520 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005521 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5522 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005523
Rafael Espindolab0092d72013-09-04 19:37:35 +00005524 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005525 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005526}
5527
John McCall5fb5df92012-06-20 06:18:46 +00005528/// Add options related to the Objective-C runtime/ABI.
5529///
5530/// Returns true if the runtime is non-fragile.
5531ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5532 ArgStringList &cmdArgs,
5533 RewriteKind rewriteKind) const {
5534 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005535 Arg *runtimeArg =
5536 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5537 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005538
5539 // Just forward -fobjc-runtime= to the frontend. This supercedes
5540 // options about fragility.
5541 if (runtimeArg &&
5542 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5543 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005544 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005545 if (runtime.tryParse(value)) {
5546 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005547 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005548 }
5549
5550 runtimeArg->render(args, cmdArgs);
5551 return runtime;
5552 }
5553
5554 // Otherwise, we'll need the ABI "version". Version numbers are
5555 // slightly confusing for historical reasons:
5556 // 1 - Traditional "fragile" ABI
5557 // 2 - Non-fragile ABI, version 1
5558 // 3 - Non-fragile ABI, version 2
5559 unsigned objcABIVersion = 1;
5560 // If -fobjc-abi-version= is present, use that to set the version.
5561 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005562 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005563 if (value == "1")
5564 objcABIVersion = 1;
5565 else if (value == "2")
5566 objcABIVersion = 2;
5567 else if (value == "3")
5568 objcABIVersion = 3;
5569 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005571 } else {
5572 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005573 bool nonFragileABIIsDefault =
5574 (rewriteKind == RK_NonFragile ||
5575 (rewriteKind == RK_None &&
5576 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005577 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5578 options::OPT_fno_objc_nonfragile_abi,
5579 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005580// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005581#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5582 unsigned nonFragileABIVersion = 1;
5583#else
5584 unsigned nonFragileABIVersion = 2;
5585#endif
5586
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005587 if (Arg *abiArg =
5588 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005589 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005590 if (value == "1")
5591 nonFragileABIVersion = 1;
5592 else if (value == "2")
5593 nonFragileABIVersion = 2;
5594 else
5595 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005596 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005597 }
5598
5599 objcABIVersion = 1 + nonFragileABIVersion;
5600 } else {
5601 objcABIVersion = 1;
5602 }
5603 }
5604
5605 // We don't actually care about the ABI version other than whether
5606 // it's non-fragile.
5607 bool isNonFragile = objcABIVersion != 1;
5608
5609 // If we have no runtime argument, ask the toolchain for its default runtime.
5610 // However, the rewriter only really supports the Mac runtime, so assume that.
5611 ObjCRuntime runtime;
5612 if (!runtimeArg) {
5613 switch (rewriteKind) {
5614 case RK_None:
5615 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5616 break;
5617 case RK_Fragile:
5618 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5619 break;
5620 case RK_NonFragile:
5621 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5622 break;
5623 }
5624
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005625 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005626 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5627 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005628 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005629 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5630
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005631 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005632 } else {
5633 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5634 }
5635
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005636 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005637 } else {
5638 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005639 // Legacy behaviour is to target the gnustep runtime if we are i
5640 // non-fragile mode or the GCC runtime in fragile mode.
5641 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005642 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005643 else
5644 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005645 }
5646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005647 cmdArgs.push_back(
5648 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005649 return runtime;
5650}
5651
Reid Klecknerc542d372014-06-27 17:02:02 +00005652static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5653 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5654 I += HaveDash;
5655 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005656}
Reid Klecknerc542d372014-06-27 17:02:02 +00005657
Benjamin Kramere003ca22015-10-28 13:54:16 +00005658namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005659struct EHFlags {
5660 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5661 bool Synch;
5662 bool Asynch;
5663 bool NoExceptC;
5664};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005665} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005666
5667/// /EH controls whether to run destructor cleanups when exceptions are
5668/// thrown. There are three modifiers:
5669/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5670/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5671/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5672/// - c: Assume that extern "C" functions are implicitly noexcept. This
5673/// modifier is an optimization, so we ignore it for now.
5674/// The default is /EHs-c-, meaning cleanups are disabled.
5675static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5676 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005677
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005678 std::vector<std::string> EHArgs =
5679 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005680 for (auto EHVal : EHArgs) {
5681 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5682 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005683 case 'a':
5684 EH.Asynch = maybeConsumeDash(EHVal, I);
5685 continue;
5686 case 'c':
5687 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5688 continue;
5689 case 's':
5690 EH.Synch = maybeConsumeDash(EHVal, I);
5691 continue;
5692 default:
5693 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005694 }
5695 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5696 break;
5697 }
5698 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005699
Reid Klecknerc542d372014-06-27 17:02:02 +00005700 return EH;
5701}
5702
Douglas Katzman3459ce22015-10-08 04:24:12 +00005703void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5704 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5705 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005706 unsigned RTOptionID = options::OPT__SLASH_MT;
5707
Hans Wennborgf1a74252013-09-10 20:18:04 +00005708 if (Args.hasArg(options::OPT__SLASH_LDd))
5709 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5710 // but defining _DEBUG is sticky.
5711 RTOptionID = options::OPT__SLASH_MTd;
5712
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005713 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005714 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005715
David Majnemere2afb472015-07-24 06:49:13 +00005716 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005717 switch (RTOptionID) {
5718 case options::OPT__SLASH_MD:
5719 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005720 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005721 CmdArgs.push_back("-D_MT");
5722 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005723 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005724 break;
5725 case options::OPT__SLASH_MDd:
5726 CmdArgs.push_back("-D_DEBUG");
5727 CmdArgs.push_back("-D_MT");
5728 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005729 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005730 break;
5731 case options::OPT__SLASH_MT:
5732 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005733 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005734 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005735 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736 break;
5737 case options::OPT__SLASH_MTd:
5738 CmdArgs.push_back("-D_DEBUG");
5739 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005740 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005741 break;
5742 default:
5743 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005744 }
5745
David Majnemere2afb472015-07-24 06:49:13 +00005746 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5747 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5748 } else {
5749 CmdArgs.push_back(FlagForCRT.data());
5750
5751 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5752 // users want. The /Za flag to cl.exe turns this off, but it's not
5753 // implemented in clang.
5754 CmdArgs.push_back("--dependent-lib=oldnames");
5755 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005756
Hans Wennborg8858a032014-07-21 23:42:07 +00005757 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5758 // would produce interleaved output, so ignore /showIncludes in such cases.
5759 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5760 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5761 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005762
David Majnemerf6072342014-07-01 22:24:56 +00005763 // This controls whether or not we emit RTTI data for polymorphic types.
5764 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5765 /*default=*/false))
5766 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005767
Reid Kleckner124955a2015-08-05 18:51:13 +00005768 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005769 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005770 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5771 // If we are emitting CV but not DWARF, don't build information that LLVM
5772 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005773 if (*EmitCodeView && !EmitDwarf)
5774 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5775 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005776 CmdArgs.push_back("-gcodeview");
5777
Reid Klecknerc542d372014-06-27 17:02:02 +00005778 const Driver &D = getToolChain().getDriver();
5779 EHFlags EH = parseClangCLEHFlags(D, Args);
5780 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005781 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005782 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005783 CmdArgs.push_back("-fexceptions");
5784 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005785
Hans Wennborge50cec32014-06-13 20:59:54 +00005786 // /EP should expand to -E -P.
5787 if (Args.hasArg(options::OPT__SLASH_EP)) {
5788 CmdArgs.push_back("-E");
5789 CmdArgs.push_back("-P");
5790 }
5791
David Majnemera5b195a2015-02-14 01:35:12 +00005792 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005793 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5794 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005795 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5796 else
5797 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5798
5799 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5800 VolatileOptionID = A->getOption().getID();
5801
5802 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5803 CmdArgs.push_back("-fms-volatile");
5804
David Majnemer86c318f2014-02-11 21:05:00 +00005805 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5806 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5807 if (MostGeneralArg && BestCaseArg)
5808 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5809 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5810
5811 if (MostGeneralArg) {
5812 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5813 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5814 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5815
5816 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5817 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5818 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5819 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5820 << FirstConflict->getAsString(Args)
5821 << SecondConflict->getAsString(Args);
5822
5823 if (SingleArg)
5824 CmdArgs.push_back("-fms-memptr-rep=single");
5825 else if (MultipleArg)
5826 CmdArgs.push_back("-fms-memptr-rep=multiple");
5827 else
5828 CmdArgs.push_back("-fms-memptr-rep=virtual");
5829 }
5830
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005831 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5832 A->render(Args, CmdArgs);
5833
Hans Wennborg81f74482013-09-10 01:07:07 +00005834 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5835 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005836 if (Args.hasArg(options::OPT__SLASH_fallback))
5837 CmdArgs.push_back("msvc-fallback");
5838 else
5839 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005840 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005841}
5842
Douglas Katzman95354292015-06-23 20:42:09 +00005843visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005844 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005845 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005846 return CLFallback.get();
5847}
5848
Daniel Sanders7f933f42015-01-30 17:35:23 +00005849void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5850 ArgStringList &CmdArgs) const {
5851 StringRef CPUName;
5852 StringRef ABIName;
5853 const llvm::Triple &Triple = getToolChain().getTriple();
5854 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5855
5856 CmdArgs.push_back("-target-abi");
5857 CmdArgs.push_back(ABIName.data());
5858}
5859
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005860void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005861 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005862 const ArgList &Args,
5863 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005864 ArgStringList CmdArgs;
5865
5866 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5867 const InputInfo &Input = Inputs[0];
5868
James Y Knight2db38f32015-08-15 03:45:25 +00005869 std::string TripleStr =
5870 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5871 const llvm::Triple Triple(TripleStr);
5872
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005873 // Don't warn about "clang -w -c foo.s"
5874 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005875 // and "clang -emit-llvm -c foo.s"
5876 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005877
Rafael Espindola577637a2015-01-03 00:06:04 +00005878 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005879
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005880 // Invoke ourselves in -cc1as mode.
5881 //
5882 // FIXME: Implement custom jobs for internal actions.
5883 CmdArgs.push_back("-cc1as");
5884
5885 // Add the "effective" target triple.
5886 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005887 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5888
5889 // Set the output mode, we currently only expect to be used as a real
5890 // assembler.
5891 CmdArgs.push_back("-filetype");
5892 CmdArgs.push_back("obj");
5893
Eric Christopher45f2e712012-12-18 00:31:10 +00005894 // Set the main file name, so that debug info works even with
5895 // -save-temps or preprocessed assembly.
5896 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005897 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005898
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005899 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005900 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005901 if (!CPU.empty()) {
5902 CmdArgs.push_back("-target-cpu");
5903 CmdArgs.push_back(Args.MakeArgString(CPU));
5904 }
5905
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005906 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005907 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005908
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005909 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005910 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005911
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005912 // Pass along any -I options so we get proper .include search paths.
5913 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5914
Eric Christopherfc3ee562012-01-10 00:38:01 +00005915 // Determine the original source input.
5916 const Action *SourceAction = &JA;
5917 while (SourceAction->getKind() != Action::InputClass) {
5918 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5919 SourceAction = SourceAction->getInputs()[0];
5920 }
5921
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005922 // Forward -g and handle debug info related flags, assuming we are dealing
5923 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005924 if (SourceAction->getType() == types::TY_Asm ||
5925 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005926 bool WantDebug = false;
5927 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005928 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005929 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00005930 WantDebug = !A->getOption().matches(options::OPT_g0) &&
5931 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005932 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005933 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005934 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005935 if (DwarfVersion == 0)
5936 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005937 RenderDebugEnablingArgs(Args, CmdArgs,
5938 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5939 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00005940 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005941
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005942 // Add the -fdebug-compilation-dir flag if needed.
5943 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005944
5945 // Set the AT_producer to the clang version when using the integrated
5946 // assembler on assembly source files.
5947 CmdArgs.push_back("-dwarf-debug-producer");
5948 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005949
5950 // And pass along -I options
5951 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005952 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005953
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005954 // Handle -fPIC et al -- the relocation-model affects the assembler
5955 // for some targets.
5956 llvm::Reloc::Model RelocationModel;
5957 unsigned PICLevel;
5958 bool IsPIE;
5959 std::tie(RelocationModel, PICLevel, IsPIE) =
5960 ParsePICArgs(getToolChain(), Triple, Args);
5961
5962 const char *RMName = RelocationModelName(RelocationModel);
5963 if (RMName) {
5964 CmdArgs.push_back("-mrelocation-model");
5965 CmdArgs.push_back(RMName);
5966 }
5967
Kevin Enderby292dc082011-12-22 19:31:58 +00005968 // Optionally embed the -cc1as level arguments into the debug info, for build
5969 // analysis.
5970 if (getToolChain().UseDwarfDebugFlags()) {
5971 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005972 for (const auto &Arg : Args)
5973 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005974
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005975 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005976 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5977 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005978 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005979 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005980 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005981 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005982 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005983 }
5984 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005985 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005986 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005987
5988 // FIXME: Add -static support, once we have it.
5989
Daniel Sanders7f933f42015-01-30 17:35:23 +00005990 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005991 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005992 default:
5993 break;
5994
5995 case llvm::Triple::mips:
5996 case llvm::Triple::mipsel:
5997 case llvm::Triple::mips64:
5998 case llvm::Triple::mips64el:
5999 AddMIPSTargetArgs(Args, CmdArgs);
6000 break;
6001 }
6002
David Blaikie372d9502014-01-17 03:17:40 +00006003 // Consume all the warning flags. Usually this would be handled more
6004 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6005 // doesn't handle that so rather than warning about unused flags that are
6006 // actually used, we'll lie by omission instead.
6007 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00006008 for (const Arg *A : Args.filtered(options::OPT_W_Group))
6009 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00006010
David Blaikie9260ed62013-07-25 21:19:01 +00006011 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6012 getToolChain().getDriver());
6013
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006014 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006015
6016 assert(Output.isFilename() && "Unexpected lipo output.");
6017 CmdArgs.push_back("-o");
6018 CmdArgs.push_back(Output.getFilename());
6019
Daniel Dunbarb440f562010-08-02 02:38:21 +00006020 assert(Input.isFilename() && "Invalid input.");
6021 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006022
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006023 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006024 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006025
6026 // Handle the debug info splitting at object creation time if we're
6027 // creating an object.
6028 // TODO: Currently only works on linux with newer objcopy.
6029 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006030 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006031 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006032 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006033}
6034
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006035void GnuTool::anchor() {}
6036
Daniel Dunbara3246a02009-03-18 08:07:30 +00006037void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006038 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006039 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006040 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006041 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006042 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006043
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006044 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006045 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00006046 // Don't forward any -g arguments to assembly steps.
6047 if (isa<AssembleJobAction>(JA) &&
6048 A->getOption().matches(options::OPT_g_Group))
6049 continue;
6050
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006051 // Don't forward any -W arguments to assembly and link steps.
6052 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6053 A->getOption().matches(options::OPT_W_Group))
6054 continue;
6055
Daniel Dunbar2da02722009-03-19 07:55:12 +00006056 // It is unfortunate that we have to claim here, as this means
6057 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00006058 // platforms using a generic gcc, even if we are just using gcc
6059 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006060 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006061 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006062 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006063 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006064
Daniel Dunbar4e295052010-01-25 22:35:08 +00006065 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006066
6067 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006068 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006069 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006070 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006071 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006072 }
6073
Daniel Dunbar5716d872009-05-02 21:41:52 +00006074 // Try to force gcc to match the tool chain we want, if we recognize
6075 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006076 //
6077 // FIXME: The triple class should directly provide the information we want
6078 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006079 switch (getToolChain().getArch()) {
6080 default:
6081 break;
6082 case llvm::Triple::x86:
6083 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006084 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006085 break;
6086 case llvm::Triple::x86_64:
6087 case llvm::Triple::ppc64:
6088 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006089 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006090 break;
6091 case llvm::Triple::sparcel:
6092 CmdArgs.push_back("-EL");
6093 break;
6094 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006095
Daniel Dunbarb440f562010-08-02 02:38:21 +00006096 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006097 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006098 CmdArgs.push_back(Output.getFilename());
6099 } else {
6100 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006101 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006102 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006103
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006104 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006105
6106 // Only pass -x if gcc will understand it; otherwise hope gcc
6107 // understands the suffix correctly. The main use case this would go
6108 // wrong in is for linker inputs if they happened to have an odd
6109 // suffix; really the only way to get this to happen is a command
6110 // like '-x foobar a.c' which will treat a.c like a linker input.
6111 //
6112 // FIXME: For the linker case specifically, can we safely convert
6113 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006114 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006115 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006116 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006117 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006118 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006119 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006120 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006121 else if (II.getType() == types::TY_ModuleFile)
6122 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006123 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006124
Daniel Dunbara3246a02009-03-18 08:07:30 +00006125 if (types::canTypeBeUserSpecified(II.getType())) {
6126 CmdArgs.push_back("-x");
6127 CmdArgs.push_back(types::getTypeName(II.getType()));
6128 }
6129
Daniel Dunbarb440f562010-08-02 02:38:21 +00006130 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006131 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006132 else {
6133 const Arg &A = II.getInputArg();
6134
6135 // Reverse translate some rewritten options.
6136 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6137 CmdArgs.push_back("-lstdc++");
6138 continue;
6139 }
6140
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006141 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006142 A.render(Args, CmdArgs);
6143 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006144 }
6145
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006146 const std::string customGCCName = D.getCCCGenericGCCName();
6147 const char *GCCName;
6148 if (!customGCCName.empty())
6149 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006150 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006151 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006152 } else
6153 GCCName = "gcc";
6154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006155 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006156 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006157}
6158
Douglas Katzman95354292015-06-23 20:42:09 +00006159void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6160 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006161 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006162}
6163
Douglas Katzman95354292015-06-23 20:42:09 +00006164void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6165 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006166 const Driver &D = getToolChain().getDriver();
6167
Eric Christophercc7ff502015-01-29 00:56:17 +00006168 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006169 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006170 case types::TY_LLVM_IR:
6171 case types::TY_LTO_IR:
6172 case types::TY_LLVM_BC:
6173 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006174 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006175 break;
6176 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006177 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006178 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006179 case types::TY_Nothing:
6180 CmdArgs.push_back("-fsyntax-only");
6181 break;
6182 default:
6183 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006184 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006185}
6186
Douglas Katzman95354292015-06-23 20:42:09 +00006187void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6188 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006189 // The types are (hopefully) good enough.
6190}
6191
Tony Linthicum76329bf2011-12-12 21:14:55 +00006192// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006193void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006194 ArgStringList &CmdArgs) const {
6195}
6196
Douglas Katzman95354292015-06-23 20:42:09 +00006197void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6198 const InputInfo &Output,
6199 const InputInfoList &Inputs,
6200 const ArgList &Args,
6201 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006202 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006203
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006204 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6205 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006206 ArgStringList CmdArgs;
6207
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006208 std::string MArchString = "-march=hexagon";
6209 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006210
6211 RenderExtraToolArgs(JA, CmdArgs);
6212
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006213 std::string AsName = "hexagon-llvm-mc";
6214 std::string MCpuString = "-mcpu=hexagon" +
6215 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6216 CmdArgs.push_back("-filetype=obj");
6217 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6218
Tony Linthicum76329bf2011-12-12 21:14:55 +00006219 if (Output.isFilename()) {
6220 CmdArgs.push_back("-o");
6221 CmdArgs.push_back(Output.getFilename());
6222 } else {
6223 assert(Output.isNothing() && "Unexpected output");
6224 CmdArgs.push_back("-fsyntax-only");
6225 }
6226
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006227 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6228 std::string N = llvm::utostr(G.getValue());
6229 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6230 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006231
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006232 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006233
Tony Linthicum76329bf2011-12-12 21:14:55 +00006234 // Only pass -x if gcc will understand it; otherwise hope gcc
6235 // understands the suffix correctly. The main use case this would go
6236 // wrong in is for linker inputs if they happened to have an odd
6237 // suffix; really the only way to get this to happen is a command
6238 // like '-x foobar a.c' which will treat a.c like a linker input.
6239 //
6240 // FIXME: For the linker case specifically, can we safely convert
6241 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006242 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006243 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006244 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006245 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006246 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006247 else if (II.getType() == types::TY_AST)
6248 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006249 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006250 else if (II.getType() == types::TY_ModuleFile)
6251 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006252 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253
6254 if (II.isFilename())
6255 CmdArgs.push_back(II.getFilename());
6256 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006257 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006258 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006259 II.getInputArg().render(Args, CmdArgs);
6260 }
6261
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006262 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006263 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006264}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006265
Douglas Katzman95354292015-06-23 20:42:09 +00006266void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6267 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006268}
6269
Douglas Katzman54366072015-07-27 16:53:08 +00006270static void
6271constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006272 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006273 const InputInfo &Output, const InputInfoList &Inputs,
6274 const ArgList &Args, ArgStringList &CmdArgs,
6275 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006276
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006277 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006278
Matthew Curtise689b052012-12-06 15:46:07 +00006279 //----------------------------------------------------------------------------
6280 //
6281 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006282 bool IsStatic = Args.hasArg(options::OPT_static);
6283 bool IsShared = Args.hasArg(options::OPT_shared);
6284 bool IsPIE = Args.hasArg(options::OPT_pie);
6285 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6286 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6287 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6288 bool UseG0 = false;
6289 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006290
Matthew Curtise689b052012-12-06 15:46:07 +00006291 //----------------------------------------------------------------------------
6292 // Silence warnings for various options
6293 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006294 Args.ClaimAllArgs(options::OPT_g_Group);
6295 Args.ClaimAllArgs(options::OPT_emit_llvm);
6296 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6297 // handled somewhere else.
6298 Args.ClaimAllArgs(options::OPT_static_libgcc);
6299
6300 //----------------------------------------------------------------------------
6301 //
6302 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006303 if (Args.hasArg(options::OPT_s))
6304 CmdArgs.push_back("-s");
6305
6306 if (Args.hasArg(options::OPT_r))
6307 CmdArgs.push_back("-r");
6308
6309 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006310 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006311
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006312 CmdArgs.push_back("-march=hexagon");
6313 std::string CpuVer =
6314 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6315 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6316 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006317
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006318 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006319 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006320 // The following should be the default, but doing as hexagon-gcc does.
6321 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006322 }
6323
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006324 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006325 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006326
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006327 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006328 CmdArgs.push_back("-pie");
6329
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006330 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6331 std::string N = llvm::utostr(G.getValue());
6332 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6333 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006334 }
6335
Matthew Curtise689b052012-12-06 15:46:07 +00006336 //----------------------------------------------------------------------------
6337 //
6338 //----------------------------------------------------------------------------
6339 CmdArgs.push_back("-o");
6340 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006341
Matthew Curtise689b052012-12-06 15:46:07 +00006342 //----------------------------------------------------------------------------
6343 // moslib
6344 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006345 std::vector<std::string> OsLibs;
6346 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006347
Sean Silva14facf32015-06-09 01:57:17 +00006348 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6349 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350 OsLibs.emplace_back(A->getValue());
6351 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006352 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006353 if (OsLibs.empty()) {
6354 OsLibs.push_back("standalone");
6355 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006356 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006357
Matthew Curtise689b052012-12-06 15:46:07 +00006358 //----------------------------------------------------------------------------
6359 // Start Files
6360 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006361 const std::string MCpuSuffix = "/" + CpuVer;
6362 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6363 const std::string RootDir =
6364 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6365 const std::string StartSubDir =
6366 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006367
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006368 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6369 const char *Name) -> std::string {
6370 std::string RelName = SubDir + Name;
6371 std::string P = HTC.GetFilePath(RelName.c_str());
6372 if (llvm::sys::fs::exists(P))
6373 return P;
6374 return RootDir + RelName;
6375 };
6376
6377 if (IncStdLib && IncStartFiles) {
6378 if (!IsShared) {
6379 if (HasStandalone) {
6380 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6381 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006382 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006383 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6384 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006385 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006386 std::string Init = UseShared
6387 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6388 : Find(RootDir, StartSubDir, "/init.o");
6389 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006390 }
6391
6392 //----------------------------------------------------------------------------
6393 // Library Search Paths
6394 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006395 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6396 for (const auto &LibPath : LibPaths)
6397 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006398
6399 //----------------------------------------------------------------------------
6400 //
6401 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006402 Args.AddAllArgs(CmdArgs,
6403 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6404 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006405
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006406 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006407
6408 //----------------------------------------------------------------------------
6409 // Libraries
6410 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006411 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006412 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006413 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006414 CmdArgs.push_back("-lm");
6415 }
6416
6417 CmdArgs.push_back("--start-group");
6418
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006419 if (!IsShared) {
6420 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006421 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006422 CmdArgs.push_back("-lc");
6423 }
6424 CmdArgs.push_back("-lgcc");
6425
6426 CmdArgs.push_back("--end-group");
6427 }
6428
6429 //----------------------------------------------------------------------------
6430 // End files
6431 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006432 if (IncStdLib && IncStartFiles) {
6433 std::string Fini = UseShared
6434 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6435 : Find(RootDir, StartSubDir, "/fini.o");
6436 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006437 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006438}
6439
Douglas Katzman95354292015-06-23 20:42:09 +00006440void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6441 const InputInfo &Output,
6442 const InputInfoList &Inputs,
6443 const ArgList &Args,
6444 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006445 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006446
6447 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006448 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006449 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006450
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006452 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006453 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454}
6455// Hexagon tools end.
6456
Tom Stellard8fa33092015-07-18 01:49:05 +00006457void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6458 const InputInfo &Output,
6459 const InputInfoList &Inputs,
6460 const ArgList &Args,
6461 const char *LinkingOutput) const {
6462
6463 std::string Linker = getToolChain().GetProgramPath(getShortName());
6464 ArgStringList CmdArgs;
6465 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006466 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006467 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006468 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006469 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6470 CmdArgs.push_back("-o");
6471 CmdArgs.push_back(Output.getFilename());
6472 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6473 CmdArgs, Inputs));
6474}
6475// AMDGPU tools end.
6476
Dan Gohman52816862015-12-16 23:30:41 +00006477wasm::Linker::Linker(const ToolChain &TC)
6478 : GnuTool("wasm::Linker", "lld", TC) {}
6479
6480bool wasm::Linker::isLinkJob() const {
6481 return true;
6482}
6483
6484bool wasm::Linker::hasIntegratedCPP() const {
6485 return false;
6486}
6487
6488void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6489 const InputInfo &Output,
6490 const InputInfoList &Inputs,
6491 const ArgList &Args,
6492 const char *LinkingOutput) const {
6493 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6494 ArgStringList CmdArgs;
6495 CmdArgs.push_back("-flavor");
6496 CmdArgs.push_back("ld");
6497 CmdArgs.push_back("-target");
6498 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
6499 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6500 CmdArgs.push_back("-o");
6501 CmdArgs.push_back(Output.getFilename());
6502 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6503}
6504
Renato Golin7c542b42015-07-27 23:44:45 +00006505const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006506 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006507 if (!Arch.empty())
6508 MArch = Arch;
6509 else
Bernard Ogden31561762013-12-12 13:27:11 +00006510 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006511 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006512
6513 // Handle -march=native.
6514 if (MArch == "native") {
6515 std::string CPU = llvm::sys::getHostCPUName();
6516 if (CPU != "generic") {
6517 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006518 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006519 // If there is no valid architecture suffix for this CPU we don't know how
6520 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006521 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006522 MArch = "";
6523 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006524 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006525 }
6526 }
6527
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006528 return MArch;
6529}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006530
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006531/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006532StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006533 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006534 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6535 // here means an -march=native that we can't handle, so instead return no CPU.
6536 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006537 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006538
John Brawna95c1a82015-05-08 12:52:18 +00006539 // We need to return an empty string here on invalid MArch values as the
6540 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006541 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006542}
6543
6544/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006545std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006546 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006547 // FIXME: Warn on inconsistent use of -mcpu and -march.
6548 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006549 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006550 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006551 // Handle -mcpu=native.
6552 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006553 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006554 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006555 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006556 }
6557
Renato Goline17c5802015-07-27 23:44:42 +00006558 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006559}
6560
6561/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006562/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006563// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006564StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6565 const llvm::Triple &Triple) {
6566 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006567 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006568 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006569 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006570 if (ArchKind == llvm::ARM::AK_INVALID)
6571 // In case of generic Arch, i.e. "arm",
6572 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006573 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006574 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006575 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6576 // armv7k triple if it's actually been specified via "-arch armv7k".
6577 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006578 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006579 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006580 }
Renato Golin3c007252015-05-28 15:05:53 +00006581 if (ArchKind == llvm::ARM::AK_INVALID)
6582 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006583 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006584}
6585
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006586void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006587 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006588 if (Args.hasArg(options::OPT_r))
6589 return;
6590
John Brawn94fd9632015-05-21 12:19:49 +00006591 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6592 // to generate BE-8 executables.
6593 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6594 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006595}
6596
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006597mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006598 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6599 // was first introduced in Release 3. However, other compilers have
6600 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006601 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6602 .Case("mips1", NanLegacy)
6603 .Case("mips2", NanLegacy)
6604 .Case("mips3", NanLegacy)
6605 .Case("mips4", NanLegacy)
6606 .Case("mips5", NanLegacy)
6607 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006608 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006609 .Case("mips32r3", NanLegacy | Nan2008)
6610 .Case("mips32r5", NanLegacy | Nan2008)
6611 .Case("mips32r6", Nan2008)
6612 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006613 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006614 .Case("mips64r3", NanLegacy | Nan2008)
6615 .Case("mips64r5", NanLegacy | Nan2008)
6616 .Case("mips64r6", Nan2008)
6617 .Default(NanLegacy);
6618}
6619
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006620bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6621 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6622 return A && (A->getValue() == StringRef(Value));
6623}
6624
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006625bool mips::isUCLibc(const ArgList &Args) {
6626 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006627 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006628}
6629
Daniel Sanders2bf13662014-07-10 14:40:57 +00006630bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006631 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6632 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006633 .Case("2008", true)
6634 .Case("legacy", false)
6635 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006636
6637 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006638 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006639 .Cases("mips32r6", "mips64r6", true)
6640 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006641
6642 return false;
6643}
6644
Daniel Sanders379d44b2014-07-16 11:52:23 +00006645bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006646 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006647 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006648 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006649 return false;
6650
6651 if (ABIName != "32")
6652 return false;
6653
Toma Tabacu94ea6862015-06-16 13:54:13 +00006654 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6655 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006656 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006657 return false;
6658
Daniel Sanders379d44b2014-07-16 11:52:23 +00006659 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006660 .Cases("mips2", "mips3", "mips4", "mips5", true)
6661 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6662 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6663 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006664}
6665
Toma Tabacu94ea6862015-06-16 13:54:13 +00006666bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6667 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006668 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006669 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6670
6671 // FPXX shouldn't be used if -msingle-float is present.
6672 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6673 options::OPT_mdouble_float))
6674 if (A->getOption().matches(options::OPT_msingle_float))
6675 UseFPXX = false;
6676
6677 return UseFPXX;
6678}
6679
Tim Northover157d9112014-01-16 08:48:16 +00006680llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006681 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6682 // archs which Darwin doesn't use.
6683
6684 // The matching this routine does is fairly pointless, since it is neither the
6685 // complete architecture list, nor a reasonable subset. The problem is that
6686 // historically the driver driver accepts this and also ties its -march=
6687 // handling to the architecture name, so we need to be careful before removing
6688 // support for it.
6689
6690 // This code must be kept in sync with Clang's Darwin specific argument
6691 // translation.
6692
6693 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006694 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6695 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6696 .Case("ppc64", llvm::Triple::ppc64)
6697 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6698 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6699 llvm::Triple::x86)
6700 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6701 // This is derived from the driver driver.
6702 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6703 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6704 .Cases("armv7s", "xscale", llvm::Triple::arm)
6705 .Case("arm64", llvm::Triple::aarch64)
6706 .Case("r600", llvm::Triple::r600)
6707 .Case("amdgcn", llvm::Triple::amdgcn)
6708 .Case("nvptx", llvm::Triple::nvptx)
6709 .Case("nvptx64", llvm::Triple::nvptx64)
6710 .Case("amdil", llvm::Triple::amdil)
6711 .Case("spir", llvm::Triple::spir)
6712 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006713}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006714
Tim Northover157d9112014-01-16 08:48:16 +00006715void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006716 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006717 T.setArch(Arch);
6718
6719 if (Str == "x86_64h")
6720 T.setArchName(Str);
6721 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6722 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006723 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006724 }
6725}
6726
Bob Wilsondecc03e2012-11-23 06:14:39 +00006727const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006728 const InputInfo &Input) {
6729 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006730}
6731
Bob Wilsondecc03e2012-11-23 06:14:39 +00006732const char *Clang::getBaseInputStem(const ArgList &Args,
6733 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006734 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006735
Chris Lattner906bb902011-01-16 08:14:11 +00006736 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006737 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006738
6739 return Str;
6740}
6741
Bob Wilsondecc03e2012-11-23 06:14:39 +00006742const char *Clang::getDependencyFileName(const ArgList &Args,
6743 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006744 // FIXME: Think about this more.
6745 std::string Res;
6746
6747 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006748 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006749 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006750 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006751 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006752 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006753 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006754}
6755
Douglas Katzman95354292015-06-23 20:42:09 +00006756void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6757 const InputInfo &Output,
6758 const InputInfoList &Inputs,
6759 const ArgList &Args,
6760 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006761 const ToolChain &ToolChain = getToolChain();
6762 const Driver &D = ToolChain.getDriver();
6763 ArgStringList CmdArgs;
6764
6765 // Silence warning for "clang -g foo.o -o foo"
6766 Args.ClaimAllArgs(options::OPT_g_Group);
6767 // and "clang -emit-llvm foo.o -o foo"
6768 Args.ClaimAllArgs(options::OPT_emit_llvm);
6769 // and for "clang -w foo.o -o foo". Other warning options are already
6770 // handled somewhere else.
6771 Args.ClaimAllArgs(options::OPT_w);
6772
6773 if (!D.SysRoot.empty())
6774 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6775
6776 // CloudABI only supports static linkage.
6777 CmdArgs.push_back("-Bstatic");
6778 CmdArgs.push_back("--eh-frame-hdr");
6779 CmdArgs.push_back("--gc-sections");
6780
6781 if (Output.isFilename()) {
6782 CmdArgs.push_back("-o");
6783 CmdArgs.push_back(Output.getFilename());
6784 } else {
6785 assert(Output.isNothing() && "Invalid output.");
6786 }
6787
Douglas Katzman78b37b02015-11-17 20:28:07 +00006788 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006789 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6790 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6791 }
6792
6793 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006794 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006795 Args.AddAllArgs(CmdArgs,
6796 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6797 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006798
Teresa Johnson945bc502015-10-15 20:35:53 +00006799 if (D.isUsingLTO())
6800 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006801
6802 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6803
Douglas Katzman78b37b02015-11-17 20:28:07 +00006804 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006805 if (D.CCCIsCXX())
6806 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6807 CmdArgs.push_back("-lc");
6808 CmdArgs.push_back("-lcompiler_rt");
6809 }
6810
Douglas Katzman78b37b02015-11-17 20:28:07 +00006811 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006812 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6813
6814 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006815 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006816}
6817
Douglas Katzman95354292015-06-23 20:42:09 +00006818void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6819 const InputInfo &Output,
6820 const InputInfoList &Inputs,
6821 const ArgList &Args,
6822 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006823 ArgStringList CmdArgs;
6824
6825 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6826 const InputInfo &Input = Inputs[0];
6827
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006828 // Determine the original source input.
6829 const Action *SourceAction = &JA;
6830 while (SourceAction->getKind() != Action::InputClass) {
6831 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6832 SourceAction = SourceAction->getInputs()[0];
6833 }
6834
Eric Christopherf5a8f492015-12-08 00:10:10 +00006835 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006836 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006837 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6838 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006839 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006840 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006841 const llvm::Triple &T(getToolChain().getTriple());
6842 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006843 CmdArgs.push_back("-Q");
6844 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006845
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006846 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006847 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006848 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006849 if (Args.hasArg(options::OPT_gstabs))
6850 CmdArgs.push_back("--gstabs");
6851 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006852 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006853 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006854
Daniel Dunbarbe220842009-03-20 16:06:39 +00006855 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006856 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006857
Daniel Dunbar6d484762010-07-22 01:47:22 +00006858 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006859 if (getToolChain().getArch() == llvm::Triple::x86 ||
6860 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006861 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6862 CmdArgs.push_back("-force_cpusubtype_ALL");
6863
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006864 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006865 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006866 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006867 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006868 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006869 CmdArgs.push_back("-static");
6870
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006871 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006872
6873 assert(Output.isFilename() && "Unexpected lipo output.");
6874 CmdArgs.push_back("-o");
6875 CmdArgs.push_back(Output.getFilename());
6876
Daniel Dunbarb440f562010-08-02 02:38:21 +00006877 assert(Input.isFilename() && "Invalid input.");
6878 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006879
6880 // asm_final spec is empty.
6881
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006882 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006883 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006884}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006885
Tim Northover157d9112014-01-16 08:48:16 +00006886void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006887
Tim Northover157d9112014-01-16 08:48:16 +00006888void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6889 ArgStringList &CmdArgs) const {
6890 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006891
Daniel Dunbarc1964212009-03-26 16:23:12 +00006892 // Derived from darwin_arch spec.
6893 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006894 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006895
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006896 // FIXME: Is this needed anymore?
6897 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006898 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006899}
6900
Douglas Katzman95354292015-06-23 20:42:09 +00006901bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006902 // We only need to generate a temp path for LTO if we aren't compiling object
6903 // files. When compiling source files, we run 'dsymutil' after linking. We
6904 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006905 for (const auto &Input : Inputs)
6906 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006907 return true;
6908
6909 return false;
6910}
6911
Douglas Katzman95354292015-06-23 20:42:09 +00006912void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6913 ArgStringList &CmdArgs,
6914 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006915 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006916 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006917
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006918 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006919 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6920 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006921 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6922 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006923 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006924 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006925 }
6926
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006927 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006928 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006929 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6930 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006931
Bob Wilson3d27dad2013-08-02 22:25:34 +00006932 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6933 CmdArgs.push_back("-export_dynamic");
6934
Bob Wilsonb111ec92015-03-02 19:01:14 +00006935 // If we are using App Extension restrictions, pass a flag to the linker
6936 // telling it that the compiled code has been audited.
6937 if (Args.hasFlag(options::OPT_fapplication_extension,
6938 options::OPT_fno_application_extension, false))
6939 CmdArgs.push_back("-application_extension");
6940
Teresa Johnson945bc502015-10-15 20:35:53 +00006941 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006942 // If we are using LTO, then automatically create a temporary file path for
6943 // the linker to use, so that it's lifetime will extend past a possible
6944 // dsymutil step.
6945 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6946 const char *TmpPath = C.getArgs().MakeArgString(
6947 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6948 C.addTempFile(TmpPath);
6949 CmdArgs.push_back("-object_path_lto");
6950 CmdArgs.push_back(TmpPath);
6951 }
6952
6953 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6954 // it in clang installed libraries. If not found, the option is not used
6955 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6956 if (Version[0] >= 133) {
6957 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6958 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6959 SmallString<128> LibLTOPath(P);
6960 llvm::sys::path::append(LibLTOPath, "lib");
6961 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6962 if (llvm::sys::fs::exists(LibLTOPath)) {
6963 CmdArgs.push_back("-lto_library");
6964 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6965 } else {
6966 D.Diag(diag::warn_drv_lto_libpath);
6967 }
6968 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006969 }
6970
Daniel Dunbarc1964212009-03-26 16:23:12 +00006971 // Derived from the "link" spec.
6972 Args.AddAllArgs(CmdArgs, options::OPT_static);
6973 if (!Args.hasArg(options::OPT_static))
6974 CmdArgs.push_back("-dynamic");
6975 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6976 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6977 // here. How do we wish to handle such things?
6978 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006979
Daniel Dunbarc1964212009-03-26 16:23:12 +00006980 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006981 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006982 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006983 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006984
6985 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6986 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6987 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6988
6989 Arg *A;
6990 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6991 (A = Args.getLastArg(options::OPT_current__version)) ||
6992 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006993 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6994 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006995
6996 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6997 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6998 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6999 } else {
7000 CmdArgs.push_back("-dylib");
7001
7002 Arg *A;
7003 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7004 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7005 (A = Args.getLastArg(options::OPT_client__name)) ||
7006 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7007 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7008 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007009 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7010 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007011
Daniel Dunbarc1964212009-03-26 16:23:12 +00007012 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7013 "-dylib_compatibility_version");
7014 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7015 "-dylib_current_version");
7016
Tim Northover157d9112014-01-16 08:48:16 +00007017 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007018
7019 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7020 "-dylib_install_name");
7021 }
7022
7023 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7024 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7025 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007026 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007027 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007028 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7029 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7030 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7031 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7032 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7033 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007034 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007035 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7036 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7037 Args.AddAllArgs(CmdArgs, options::OPT_init);
7038
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007039 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007040 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007041
Daniel Dunbarc1964212009-03-26 16:23:12 +00007042 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7043 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7044 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7045 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7046 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007048 if (const Arg *A =
7049 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7050 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007051 if (A->getOption().matches(options::OPT_fpie) ||
7052 A->getOption().matches(options::OPT_fPIE))
7053 CmdArgs.push_back("-pie");
7054 else
7055 CmdArgs.push_back("-no_pie");
7056 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007057
7058 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7059 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7060 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7061 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7062 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7063 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7064 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7065 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7066 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7067 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7068 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7069 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7070 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7071 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7072 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7073 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007074
Daniel Dunbar84384642011-05-02 21:03:47 +00007075 // Give --sysroot= preference, over the Apple specific behavior to also use
7076 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007077 StringRef sysroot = C.getSysRoot();
7078 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007079 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007080 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007081 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7082 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007083 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007084 }
7085
Daniel Dunbarc1964212009-03-26 16:23:12 +00007086 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7087 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7088 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7089 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7090 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007091 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007092 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7093 Args.AddAllArgs(CmdArgs, options::OPT_y);
7094 Args.AddLastArg(CmdArgs, options::OPT_w);
7095 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7096 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7097 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7098 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7099 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7100 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7101 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7102 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7103 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7104 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7105 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7106 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7107}
7108
Douglas Katzman95354292015-06-23 20:42:09 +00007109void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7110 const InputInfo &Output,
7111 const InputInfoList &Inputs,
7112 const ArgList &Args,
7113 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007114 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007115
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007116 // If the number of arguments surpasses the system limits, we will encode the
7117 // input files in a separate file, shortening the command line. To this end,
7118 // build a list of input file names that can be passed via a file with the
7119 // -filelist linker option.
7120 llvm::opt::ArgStringList InputFileList;
7121
Daniel Dunbarc1964212009-03-26 16:23:12 +00007122 // The logic here is derived from gcc's behavior; most of which
7123 // comes from specs (starting with link_command). Consult gcc for
7124 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007125 ArgStringList CmdArgs;
7126
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007127 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7128 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7129 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007130 for (const auto &Arg : Args)
7131 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007132 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007133 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007134 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007135 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007136 return;
7137 }
7138
Daniel Dunbarc1964212009-03-26 16:23:12 +00007139 // I'm not sure why this particular decomposition exists in gcc, but
7140 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007141 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007142
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007143 // It seems that the 'e' option is completely ignored for dynamic executables
7144 // (the default), and with static executables, the last one wins, as expected.
7145 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7146 options::OPT_Z_Flag, options::OPT_u_Group,
7147 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007148
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007149 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7150 // members of static archive libraries which implement Objective-C classes or
7151 // categories.
7152 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7153 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007154
Daniel Dunbarc1964212009-03-26 16:23:12 +00007155 CmdArgs.push_back("-o");
7156 CmdArgs.push_back(Output.getFilename());
7157
Douglas Katzman78b37b02015-11-17 20:28:07 +00007158 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007159 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007160
Peter Collingbournec4122c12015-06-15 21:08:13 +00007161 // SafeStack requires its own runtime libraries
7162 // These libraries should be linked first, to make sure the
7163 // __safestack_init constructor executes before everything else
7164 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7165 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7166 "libclang_rt.safestack_osx.a",
7167 /*AlwaysLink=*/true);
7168 }
7169
Daniel Dunbarc1964212009-03-26 16:23:12 +00007170 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007171
Douglas Gregor9295df02012-05-15 21:00:27 +00007172 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007173 // Build the input file for -filelist (list of linker input files) in case we
7174 // need it later
7175 for (const auto &II : Inputs) {
7176 if (!II.isFilename()) {
7177 // This is a linker input argument.
7178 // We cannot mix input arguments and file names in a -filelist input, thus
7179 // we prematurely stop our list (remaining files shall be passed as
7180 // arguments).
7181 if (InputFileList.size() > 0)
7182 break;
7183
7184 continue;
7185 }
7186
7187 InputFileList.push_back(II.getFilename());
7188 }
7189
Douglas Katzman78b37b02015-11-17 20:28:07 +00007190 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007191 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7192
Douglas Katzman78b37b02015-11-17 20:28:07 +00007193 if (isObjCRuntimeLinked(Args) &&
7194 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007195 // We use arclite library for both ARC and subscripting support.
7196 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7197
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007198 CmdArgs.push_back("-framework");
7199 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007200 // Link libobj.
7201 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007202 }
John McCall31168b02011-06-15 23:02:42 +00007203
Daniel Dunbarc1964212009-03-26 16:23:12 +00007204 if (LinkingOutput) {
7205 CmdArgs.push_back("-arch_multiple");
7206 CmdArgs.push_back("-final_output");
7207 CmdArgs.push_back(LinkingOutput);
7208 }
7209
Daniel Dunbarc1964212009-03-26 16:23:12 +00007210 if (Args.hasArg(options::OPT_fnested_functions))
7211 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007212
Justin Bognerc7701242015-05-12 05:44:36 +00007213 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7214
Douglas Katzman78b37b02015-11-17 20:28:07 +00007215 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007216 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007217 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007218
Daniel Dunbarc1964212009-03-26 16:23:12 +00007219 // link_ssp spec is empty.
7220
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007221 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007222 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007223 }
7224
Douglas Katzman78b37b02015-11-17 20:28:07 +00007225 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007226 // endfile_spec is empty.
7227 }
7228
7229 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7230 Args.AddAllArgs(CmdArgs, options::OPT_F);
7231
Steven Wu3ffb61b2015-02-06 18:08:29 +00007232 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007233 for (const Arg *A : Args.filtered(options::OPT_iframework))
7234 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007235
Douglas Katzman78b37b02015-11-17 20:28:07 +00007236 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007237 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7238 if (A->getValue() == StringRef("Accelerate")) {
7239 CmdArgs.push_back("-framework");
7240 CmdArgs.push_back("Accelerate");
7241 }
7242 }
7243 }
7244
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007245 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007246 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007247 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007248 Cmd->setInputFileList(std::move(InputFileList));
7249 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007250}
7251
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007252void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007253 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007254 const InputInfoList &Inputs,
7255 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007256 const char *LinkingOutput) const {
7257 ArgStringList CmdArgs;
7258
7259 CmdArgs.push_back("-create");
7260 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007261
7262 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007263 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007264
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007265 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007266 assert(II.isFilename() && "Unexpected lipo input.");
7267 CmdArgs.push_back(II.getFilename());
7268 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007269
7270 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007271 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007272}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007273
Daniel Dunbar88299622010-06-04 18:28:36 +00007274void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007275 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007276 const InputInfoList &Inputs,
7277 const ArgList &Args,
7278 const char *LinkingOutput) const {
7279 ArgStringList CmdArgs;
7280
Daniel Dunbareb86b042011-05-09 17:23:16 +00007281 CmdArgs.push_back("-o");
7282 CmdArgs.push_back(Output.getFilename());
7283
Daniel Dunbar88299622010-06-04 18:28:36 +00007284 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7285 const InputInfo &Input = Inputs[0];
7286 assert(Input.isFilename() && "Unexpected dsymutil input.");
7287 CmdArgs.push_back(Input.getFilename());
7288
Daniel Dunbar88299622010-06-04 18:28:36 +00007289 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007290 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007292}
7293
Eric Christopher551ef452011-08-23 17:56:55 +00007294void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007295 const InputInfo &Output,
7296 const InputInfoList &Inputs,
7297 const ArgList &Args,
7298 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007299 ArgStringList CmdArgs;
7300 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007301 CmdArgs.push_back("--debug-info");
7302 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007303 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007304
7305 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7306 const InputInfo &Input = Inputs[0];
7307 assert(Input.isFilename() && "Unexpected verify input");
7308
7309 // Grabbing the output of the earlier dsymutil run.
7310 CmdArgs.push_back(Input.getFilename());
7311
7312 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007313 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007314 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007315}
7316
Douglas Katzman95354292015-06-23 20:42:09 +00007317void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007318 const InputInfo &Output,
7319 const InputInfoList &Inputs,
7320 const ArgList &Args,
7321 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007322 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007323 ArgStringList CmdArgs;
7324
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007325 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007326
7327 CmdArgs.push_back("-o");
7328 CmdArgs.push_back(Output.getFilename());
7329
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007330 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007331 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007332
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007333 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007334 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007335}
7336
Douglas Katzman95354292015-06-23 20:42:09 +00007337void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7338 const InputInfo &Output,
7339 const InputInfoList &Inputs,
7340 const ArgList &Args,
7341 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007342 ArgStringList CmdArgs;
7343
David Chisnall272a0712012-02-29 15:06:12 +00007344 // Demangle C++ names in errors
7345 CmdArgs.push_back("-C");
7346
Douglas Katzman78b37b02015-11-17 20:28:07 +00007347 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007348 CmdArgs.push_back("-e");
7349 CmdArgs.push_back("_start");
7350 }
7351
7352 if (Args.hasArg(options::OPT_static)) {
7353 CmdArgs.push_back("-Bstatic");
7354 CmdArgs.push_back("-dn");
7355 } else {
7356 CmdArgs.push_back("-Bdynamic");
7357 if (Args.hasArg(options::OPT_shared)) {
7358 CmdArgs.push_back("-shared");
7359 } else {
7360 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007361 CmdArgs.push_back(
7362 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007363 }
7364 }
7365
7366 if (Output.isFilename()) {
7367 CmdArgs.push_back("-o");
7368 CmdArgs.push_back(Output.getFilename());
7369 } else {
7370 assert(Output.isNothing() && "Invalid output.");
7371 }
7372
Douglas Katzman78b37b02015-11-17 20:28:07 +00007373 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007374 if (!Args.hasArg(options::OPT_shared))
7375 CmdArgs.push_back(
7376 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7377
7378 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7379 CmdArgs.push_back(
7380 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7381 CmdArgs.push_back(
7382 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007383 }
7384
Douglas Katzman6059ef92015-11-17 17:41:23 +00007385 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007386
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007387 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7388 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007389
7390 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7391
Douglas Katzman78b37b02015-11-17 20:28:07 +00007392 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007393 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007394 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007395 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007396 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007397 if (!Args.hasArg(options::OPT_shared)) {
7398 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007399 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007400 }
David Chisnallf571cde2012-02-15 13:39:01 +00007401 }
7402
Douglas Katzman78b37b02015-11-17 20:28:07 +00007403 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007404 CmdArgs.push_back(
7405 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007406 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007407 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007408
Xinliang David Li69306c02015-10-22 06:15:31 +00007409 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007410
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007411 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007412 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007413}
7414
Douglas Katzman95354292015-06-23 20:42:09 +00007415void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7416 const InputInfo &Output,
7417 const InputInfoList &Inputs,
7418 const ArgList &Args,
7419 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007420 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007421 ArgStringList CmdArgs;
7422
Rafael Espindolacc126272014-02-28 01:55:21 +00007423 switch (getToolChain().getArch()) {
7424 case llvm::Triple::x86:
7425 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7426 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007427 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007428 break;
7429
7430 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007431 CmdArgs.push_back("-mppc");
7432 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007433 break;
7434
7435 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007436 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007437 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007438 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7439 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7440 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007441 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007442 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007443
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007444 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007445 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007446 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7447 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7448 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007449 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007450 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007451
7452 case llvm::Triple::mips64:
7453 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007454 StringRef CPUName;
7455 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007456 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007457
7458 CmdArgs.push_back("-mabi");
7459 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7460
7461 if (getToolChain().getArch() == llvm::Triple::mips64)
7462 CmdArgs.push_back("-EB");
7463 else
7464 CmdArgs.push_back("-EL");
7465
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007466 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007467 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007468 }
7469
Rafael Espindolacc126272014-02-28 01:55:21 +00007470 default:
7471 break;
7472 }
7473
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007474 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007475
7476 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007477 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007478
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007479 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007480 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007482 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007483 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007484}
7485
Douglas Katzman95354292015-06-23 20:42:09 +00007486void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7487 const InputInfo &Output,
7488 const InputInfoList &Inputs,
7489 const ArgList &Args,
7490 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007491 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007492 ArgStringList CmdArgs;
7493
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007494 // Silence warning for "clang -g foo.o -o foo"
7495 Args.ClaimAllArgs(options::OPT_g_Group);
7496 // and "clang -emit-llvm foo.o -o foo"
7497 Args.ClaimAllArgs(options::OPT_emit_llvm);
7498 // and for "clang -w foo.o -o foo". Other warning options are already
7499 // handled somewhere else.
7500 Args.ClaimAllArgs(options::OPT_w);
7501
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007502 if (getToolChain().getArch() == llvm::Triple::mips64)
7503 CmdArgs.push_back("-EB");
7504 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7505 CmdArgs.push_back("-EL");
7506
Douglas Katzman78b37b02015-11-17 20:28:07 +00007507 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007508 CmdArgs.push_back("-e");
7509 CmdArgs.push_back("__start");
7510 }
7511
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007512 if (Args.hasArg(options::OPT_static)) {
7513 CmdArgs.push_back("-Bstatic");
7514 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007515 if (Args.hasArg(options::OPT_rdynamic))
7516 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007517 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007518 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007519 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007520 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007521 } else {
7522 CmdArgs.push_back("-dynamic-linker");
7523 CmdArgs.push_back("/usr/libexec/ld.so");
7524 }
7525 }
7526
Rafael Espindola044f7832013-06-05 04:28:55 +00007527 if (Args.hasArg(options::OPT_nopie))
7528 CmdArgs.push_back("-nopie");
7529
Daniel Dunbarb440f562010-08-02 02:38:21 +00007530 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007531 CmdArgs.push_back("-o");
7532 CmdArgs.push_back(Output.getFilename());
7533 } else {
7534 assert(Output.isNothing() && "Invalid output.");
7535 }
7536
Douglas Katzman78b37b02015-11-17 20:28:07 +00007537 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007538 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007539 if (Args.hasArg(options::OPT_pg))
7540 CmdArgs.push_back(
7541 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007542 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007543 CmdArgs.push_back(
7544 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7545 CmdArgs.push_back(
7546 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007547 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007548 CmdArgs.push_back(
7549 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007550 }
7551 }
7552
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007553 std::string Triple = getToolChain().getTripleString();
7554 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007555 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007556 CmdArgs.push_back(
7557 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007558
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007559 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7560 options::OPT_e, options::OPT_s, options::OPT_t,
7561 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007562
Daniel Dunbar54423b22010-09-17 00:24:54 +00007563 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007564
Douglas Katzman78b37b02015-11-17 20:28:07 +00007565 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007566 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007567 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007568 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007569 CmdArgs.push_back("-lm_p");
7570 else
7571 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007572 }
7573
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007574 // FIXME: For some reason GCC passes -lgcc before adding
7575 // the default system libraries. Just mimic this for now.
7576 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007577
Eric Christopher17674ec2012-09-13 06:32:34 +00007578 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007579 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7580 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007581 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007582 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007583 }
7584
Chandler Carruth45661652011-12-17 22:32:42 +00007585 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007586 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007587 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007588 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007589 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007590 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007591
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007592 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007593 }
7594
Douglas Katzman78b37b02015-11-17 20:28:07 +00007595 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007596 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007597 CmdArgs.push_back(
7598 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007599 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007600 CmdArgs.push_back(
7601 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007602 }
7603
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007604 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007605 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007606}
Ed Schoutene33194b2009-04-02 19:13:12 +00007607
Douglas Katzman95354292015-06-23 20:42:09 +00007608void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7609 const InputInfo &Output,
7610 const InputInfoList &Inputs,
7611 const ArgList &Args,
7612 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007613 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007614 ArgStringList CmdArgs;
7615
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007616 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007617
7618 CmdArgs.push_back("-o");
7619 CmdArgs.push_back(Output.getFilename());
7620
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007621 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007622 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007623
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007624 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007625 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007626}
7627
Douglas Katzman95354292015-06-23 20:42:09 +00007628void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7629 const InputInfo &Output,
7630 const InputInfoList &Inputs,
7631 const ArgList &Args,
7632 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007633 const Driver &D = getToolChain().getDriver();
7634 ArgStringList CmdArgs;
7635
Douglas Katzman78b37b02015-11-17 20:28:07 +00007636 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007637 CmdArgs.push_back("-e");
7638 CmdArgs.push_back("__start");
7639 }
7640
7641 if (Args.hasArg(options::OPT_static)) {
7642 CmdArgs.push_back("-Bstatic");
7643 } else {
7644 if (Args.hasArg(options::OPT_rdynamic))
7645 CmdArgs.push_back("-export-dynamic");
7646 CmdArgs.push_back("--eh-frame-hdr");
7647 CmdArgs.push_back("-Bdynamic");
7648 if (Args.hasArg(options::OPT_shared)) {
7649 CmdArgs.push_back("-shared");
7650 } else {
7651 CmdArgs.push_back("-dynamic-linker");
7652 CmdArgs.push_back("/usr/libexec/ld.so");
7653 }
7654 }
7655
7656 if (Output.isFilename()) {
7657 CmdArgs.push_back("-o");
7658 CmdArgs.push_back(Output.getFilename());
7659 } else {
7660 assert(Output.isNothing() && "Invalid output.");
7661 }
7662
Douglas Katzman78b37b02015-11-17 20:28:07 +00007663 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007664 if (!Args.hasArg(options::OPT_shared)) {
7665 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007666 CmdArgs.push_back(
7667 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007668 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007669 CmdArgs.push_back(
7670 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7671 CmdArgs.push_back(
7672 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007673 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007674 CmdArgs.push_back(
7675 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007676 }
7677 }
7678
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007679 Args.AddAllArgs(CmdArgs,
7680 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007681
7682 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7683
Douglas Katzman78b37b02015-11-17 20:28:07 +00007684 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007685 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007686 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7687 if (Args.hasArg(options::OPT_pg))
7688 CmdArgs.push_back("-lm_p");
7689 else
7690 CmdArgs.push_back("-lm");
7691 }
7692
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007693 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007694 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007695 CmdArgs.push_back("-lpthread_p");
7696 else
7697 CmdArgs.push_back("-lpthread");
7698 }
7699
Eli Friedman9fa28852012-08-08 23:57:20 +00007700 if (!Args.hasArg(options::OPT_shared)) {
7701 if (Args.hasArg(options::OPT_pg))
7702 CmdArgs.push_back("-lc_p");
7703 else
7704 CmdArgs.push_back("-lc");
7705 }
7706
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007707 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007708 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007709 case llvm::Triple::arm:
7710 MyArch = "arm";
7711 break;
7712 case llvm::Triple::x86:
7713 MyArch = "i386";
7714 break;
7715 case llvm::Triple::x86_64:
7716 MyArch = "amd64";
7717 break;
7718 default:
7719 llvm_unreachable("Unsupported architecture");
7720 }
7721 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007722 }
7723
Douglas Katzman78b37b02015-11-17 20:28:07 +00007724 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007725 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007726 CmdArgs.push_back(
7727 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007728 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007729 CmdArgs.push_back(
7730 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007731 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007732
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007733 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007734 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007735}
7736
Douglas Katzman95354292015-06-23 20:42:09 +00007737void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7738 const InputInfo &Output,
7739 const InputInfoList &Inputs,
7740 const ArgList &Args,
7741 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007742 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007743 ArgStringList CmdArgs;
7744
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007745 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7746 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007747 switch (getToolChain().getArch()) {
7748 default:
7749 break;
7750 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007751 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007752 break;
7753 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007754 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007755 break;
7756 case llvm::Triple::mips:
7757 case llvm::Triple::mipsel:
7758 case llvm::Triple::mips64:
7759 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007760 StringRef CPUName;
7761 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007762 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007763
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007764 CmdArgs.push_back("-march");
7765 CmdArgs.push_back(CPUName.data());
7766
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007767 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007768 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007769
7770 if (getToolChain().getArch() == llvm::Triple::mips ||
7771 getToolChain().getArch() == llvm::Triple::mips64)
7772 CmdArgs.push_back("-EB");
7773 else
7774 CmdArgs.push_back("-EL");
7775
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007776 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007777 break;
7778 }
7779 case llvm::Triple::arm:
7780 case llvm::Triple::armeb:
7781 case llvm::Triple::thumb:
7782 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007783 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007784
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007785 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007786 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007787 else
Renato Golinf4421f72014-02-19 10:44:07 +00007788 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007789
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007790 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007791 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007792 case llvm::Triple::GNUEABI:
7793 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007794 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007795 break;
7796
7797 default:
7798 CmdArgs.push_back("-matpcs");
7799 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007800 break;
7801 }
7802 case llvm::Triple::sparc:
7803 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007804 case llvm::Triple::sparcv9: {
7805 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7806 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007807 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007808 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007809 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007810 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007811
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007812 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007813
7814 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007815 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007816
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007817 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007818 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007820 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007822}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007823
Douglas Katzman95354292015-06-23 20:42:09 +00007824void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7825 const InputInfo &Output,
7826 const InputInfoList &Inputs,
7827 const ArgList &Args,
7828 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007829 const toolchains::FreeBSD &ToolChain =
7830 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007831 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007832 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007833 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007834 !Args.hasArg(options::OPT_shared) &&
7835 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007836 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007837
7838 // Silence warning for "clang -g foo.o -o foo"
7839 Args.ClaimAllArgs(options::OPT_g_Group);
7840 // and "clang -emit-llvm foo.o -o foo"
7841 Args.ClaimAllArgs(options::OPT_emit_llvm);
7842 // and for "clang -w foo.o -o foo". Other warning options are already
7843 // handled somewhere else.
7844 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007845
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007846 if (!D.SysRoot.empty())
7847 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7848
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007849 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007850 CmdArgs.push_back("-pie");
7851
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007852 if (Args.hasArg(options::OPT_static)) {
7853 CmdArgs.push_back("-Bstatic");
7854 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007855 if (Args.hasArg(options::OPT_rdynamic))
7856 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007857 CmdArgs.push_back("--eh-frame-hdr");
7858 if (Args.hasArg(options::OPT_shared)) {
7859 CmdArgs.push_back("-Bshareable");
7860 } else {
7861 CmdArgs.push_back("-dynamic-linker");
7862 CmdArgs.push_back("/libexec/ld-elf.so.1");
7863 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007864 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007865 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7866 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7867 CmdArgs.push_back("--hash-style=both");
7868 }
7869 }
7870 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007871 }
7872
7873 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7874 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007875 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007876 CmdArgs.push_back("-m");
7877 CmdArgs.push_back("elf_i386_fbsd");
7878 }
7879
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007880 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007881 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007882 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007883 }
7884
Daniel Dunbarb440f562010-08-02 02:38:21 +00007885 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007886 CmdArgs.push_back("-o");
7887 CmdArgs.push_back(Output.getFilename());
7888 } else {
7889 assert(Output.isNothing() && "Invalid output.");
7890 }
7891
Douglas Katzman78b37b02015-11-17 20:28:07 +00007892 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007893 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007894 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007895 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007896 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007897 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007898 crt1 = "Scrt1.o";
7899 else
7900 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007901 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007902 if (crt1)
7903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7904
7905 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7906
Craig Topper92fc2df2014-05-17 16:56:41 +00007907 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007908 if (Args.hasArg(options::OPT_static))
7909 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007910 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007911 crtbegin = "crtbeginS.o";
7912 else
7913 crtbegin = "crtbegin.o";
7914
7915 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007916 }
7917
7918 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007919 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007920 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7921 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007922 Args.AddAllArgs(CmdArgs, options::OPT_s);
7923 Args.AddAllArgs(CmdArgs, options::OPT_t);
7924 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7925 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007926
Teresa Johnson945bc502015-10-15 20:35:53 +00007927 if (D.isUsingLTO())
7928 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007929
Alexey Samsonov52550342014-09-15 19:58:40 +00007930 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007931 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007932
Douglas Katzman78b37b02015-11-17 20:28:07 +00007933 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007934 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007935 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007936 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007937 if (Args.hasArg(options::OPT_pg))
7938 CmdArgs.push_back("-lm_p");
7939 else
7940 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007941 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007942 if (NeedsSanitizerDeps)
7943 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007944 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7945 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007946 if (Args.hasArg(options::OPT_pg))
7947 CmdArgs.push_back("-lgcc_p");
7948 else
7949 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007950 if (Args.hasArg(options::OPT_static)) {
7951 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007952 } else if (Args.hasArg(options::OPT_pg)) {
7953 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007954 } else {
7955 CmdArgs.push_back("--as-needed");
7956 CmdArgs.push_back("-lgcc_s");
7957 CmdArgs.push_back("--no-as-needed");
7958 }
7959
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007960 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007961 if (Args.hasArg(options::OPT_pg))
7962 CmdArgs.push_back("-lpthread_p");
7963 else
7964 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007965 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007966
Roman Divacky66f22762011-02-10 16:59:40 +00007967 if (Args.hasArg(options::OPT_pg)) {
7968 if (Args.hasArg(options::OPT_shared))
7969 CmdArgs.push_back("-lc");
7970 else
7971 CmdArgs.push_back("-lc_p");
7972 CmdArgs.push_back("-lgcc_p");
7973 } else {
7974 CmdArgs.push_back("-lc");
7975 CmdArgs.push_back("-lgcc");
7976 }
7977
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007978 if (Args.hasArg(options::OPT_static)) {
7979 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007980 } else if (Args.hasArg(options::OPT_pg)) {
7981 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007982 } else {
7983 CmdArgs.push_back("--as-needed");
7984 CmdArgs.push_back("-lgcc_s");
7985 CmdArgs.push_back("--no-as-needed");
7986 }
7987 }
7988
Douglas Katzman78b37b02015-11-17 20:28:07 +00007989 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007990 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007991 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007992 else
7993 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007994 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007995 }
7996
Xinliang David Li69306c02015-10-22 06:15:31 +00007997 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007998
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007999 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008000 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008001}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008002
Douglas Katzman95354292015-06-23 20:42:09 +00008003void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008004 const InputInfo &Output,
8005 const InputInfoList &Inputs,
8006 const ArgList &Args,
8007 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008008 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008009 ArgStringList CmdArgs;
8010
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008011 // GNU as needs different flags for creating the correct output format
8012 // on architectures with different ABIs or optional feature sets.
8013 switch (getToolChain().getArch()) {
8014 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008015 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008016 break;
8017 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008018 case llvm::Triple::armeb:
8019 case llvm::Triple::thumb:
8020 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008021 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008022 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8023 std::string Arch =
8024 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008025 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008026 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008027 }
8028
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008029 case llvm::Triple::mips:
8030 case llvm::Triple::mipsel:
8031 case llvm::Triple::mips64:
8032 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008033 StringRef CPUName;
8034 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008035 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008036
8037 CmdArgs.push_back("-march");
8038 CmdArgs.push_back(CPUName.data());
8039
8040 CmdArgs.push_back("-mabi");
8041 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8042
8043 if (getToolChain().getArch() == llvm::Triple::mips ||
8044 getToolChain().getArch() == llvm::Triple::mips64)
8045 CmdArgs.push_back("-EB");
8046 else
8047 CmdArgs.push_back("-EL");
8048
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008049 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008050 break;
8051 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008052
8053 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008054 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008055 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008056 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8057 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008058 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008059 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008060 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008061
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008062 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008063 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008064 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8065 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008066 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008067 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008068 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008069
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008070 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008071 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008072 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008074 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008075
8076 CmdArgs.push_back("-o");
8077 CmdArgs.push_back(Output.getFilename());
8078
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008079 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008080 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008081
David Chisnallddbd68f2011-09-27 22:03:18 +00008082 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008083 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008084}
8085
Douglas Katzman95354292015-06-23 20:42:09 +00008086void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8087 const InputInfo &Output,
8088 const InputInfoList &Inputs,
8089 const ArgList &Args,
8090 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008091 const Driver &D = getToolChain().getDriver();
8092 ArgStringList CmdArgs;
8093
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008094 if (!D.SysRoot.empty())
8095 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8096
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008097 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008098 if (Args.hasArg(options::OPT_static)) {
8099 CmdArgs.push_back("-Bstatic");
8100 } else {
8101 if (Args.hasArg(options::OPT_rdynamic))
8102 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008103 if (Args.hasArg(options::OPT_shared)) {
8104 CmdArgs.push_back("-Bshareable");
8105 } else {
8106 CmdArgs.push_back("-dynamic-linker");
8107 CmdArgs.push_back("/libexec/ld.elf_so");
8108 }
8109 }
8110
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008111 // Many NetBSD architectures support more than one ABI.
8112 // Determine the correct emulation for ld.
8113 switch (getToolChain().getArch()) {
8114 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008115 CmdArgs.push_back("-m");
8116 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008117 break;
8118 case llvm::Triple::arm:
8119 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008120 CmdArgs.push_back("-m");
8121 switch (getToolChain().getTriple().getEnvironment()) {
8122 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008123 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008124 CmdArgs.push_back("armelf_nbsd_eabi");
8125 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008126 case llvm::Triple::EABIHF:
8127 case llvm::Triple::GNUEABIHF:
8128 CmdArgs.push_back("armelf_nbsd_eabihf");
8129 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008130 default:
8131 CmdArgs.push_back("armelf_nbsd");
8132 break;
8133 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008134 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008135 case llvm::Triple::armeb:
8136 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008137 arm::appendEBLinkFlags(
8138 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008139 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008140 CmdArgs.push_back("-m");
8141 switch (getToolChain().getTriple().getEnvironment()) {
8142 case llvm::Triple::EABI:
8143 case llvm::Triple::GNUEABI:
8144 CmdArgs.push_back("armelfb_nbsd_eabi");
8145 break;
8146 case llvm::Triple::EABIHF:
8147 case llvm::Triple::GNUEABIHF:
8148 CmdArgs.push_back("armelfb_nbsd_eabihf");
8149 break;
8150 default:
8151 CmdArgs.push_back("armelfb_nbsd");
8152 break;
8153 }
8154 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008155 case llvm::Triple::mips64:
8156 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008157 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008158 CmdArgs.push_back("-m");
8159 if (getToolChain().getArch() == llvm::Triple::mips64)
8160 CmdArgs.push_back("elf32btsmip");
8161 else
8162 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008163 } else if (mips::hasMipsAbiArg(Args, "64")) {
8164 CmdArgs.push_back("-m");
8165 if (getToolChain().getArch() == llvm::Triple::mips64)
8166 CmdArgs.push_back("elf64btsmip");
8167 else
8168 CmdArgs.push_back("elf64ltsmip");
8169 }
8170 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008171 case llvm::Triple::ppc:
8172 CmdArgs.push_back("-m");
8173 CmdArgs.push_back("elf32ppc_nbsd");
8174 break;
8175
8176 case llvm::Triple::ppc64:
8177 case llvm::Triple::ppc64le:
8178 CmdArgs.push_back("-m");
8179 CmdArgs.push_back("elf64ppc");
8180 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008181
8182 case llvm::Triple::sparc:
8183 CmdArgs.push_back("-m");
8184 CmdArgs.push_back("elf32_sparc");
8185 break;
8186
8187 case llvm::Triple::sparcv9:
8188 CmdArgs.push_back("-m");
8189 CmdArgs.push_back("elf64_sparc");
8190 break;
8191
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008192 default:
8193 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008194 }
8195
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008196 if (Output.isFilename()) {
8197 CmdArgs.push_back("-o");
8198 CmdArgs.push_back(Output.getFilename());
8199 } else {
8200 assert(Output.isNothing() && "Invalid output.");
8201 }
8202
Douglas Katzman78b37b02015-11-17 20:28:07 +00008203 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008204 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008205 CmdArgs.push_back(
8206 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8207 CmdArgs.push_back(
8208 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8209 CmdArgs.push_back(
8210 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008211 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008212 CmdArgs.push_back(
8213 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8214 CmdArgs.push_back(
8215 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008216 }
8217 }
8218
8219 Args.AddAllArgs(CmdArgs, options::OPT_L);
8220 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8221 Args.AddAllArgs(CmdArgs, options::OPT_e);
8222 Args.AddAllArgs(CmdArgs, options::OPT_s);
8223 Args.AddAllArgs(CmdArgs, options::OPT_t);
8224 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8225 Args.AddAllArgs(CmdArgs, options::OPT_r);
8226
8227 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8228
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008229 unsigned Major, Minor, Micro;
8230 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8231 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008232 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008233 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008234 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008235 case llvm::Triple::arm:
8236 case llvm::Triple::armeb:
8237 case llvm::Triple::thumb:
8238 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008239 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008240 case llvm::Triple::ppc64:
8241 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008242 case llvm::Triple::x86:
8243 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008244 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008245 break;
8246 default:
8247 break;
8248 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008249 }
8250
Douglas Katzman78b37b02015-11-17 20:28:07 +00008251 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008252 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008253 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008254 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8255 CmdArgs.push_back("-lm");
8256 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008257 if (Args.hasArg(options::OPT_pthread))
8258 CmdArgs.push_back("-lpthread");
8259 CmdArgs.push_back("-lc");
8260
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008261 if (useLibgcc) {
8262 if (Args.hasArg(options::OPT_static)) {
8263 // libgcc_eh depends on libc, so resolve as much as possible,
8264 // pull in any new requirements from libc and then get the rest
8265 // of libgcc.
8266 CmdArgs.push_back("-lgcc_eh");
8267 CmdArgs.push_back("-lc");
8268 CmdArgs.push_back("-lgcc");
8269 } else {
8270 CmdArgs.push_back("-lgcc");
8271 CmdArgs.push_back("--as-needed");
8272 CmdArgs.push_back("-lgcc_s");
8273 CmdArgs.push_back("--no-as-needed");
8274 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008275 }
8276 }
8277
Douglas Katzman78b37b02015-11-17 20:28:07 +00008278 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008279 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008280 CmdArgs.push_back(
8281 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008282 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008283 CmdArgs.push_back(
8284 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8285 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008286 }
8287
Xinliang David Li69306c02015-10-22 06:15:31 +00008288 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008289
Logan Chieneb9162f2014-06-26 14:23:45 +00008290 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008292}
8293
Douglas Katzman95354292015-06-23 20:42:09 +00008294void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8295 const InputInfo &Output,
8296 const InputInfoList &Inputs,
8297 const ArgList &Args,
8298 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008299 claimNoWarnArgs(Args);
8300
James Y Knight2db38f32015-08-15 03:45:25 +00008301 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8302 llvm::Triple Triple = llvm::Triple(TripleStr);
8303
Rafael Espindola92b00932010-08-10 00:25:48 +00008304 ArgStringList CmdArgs;
8305
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008306 llvm::Reloc::Model RelocationModel;
8307 unsigned PICLevel;
8308 bool IsPIE;
8309 std::tie(RelocationModel, PICLevel, IsPIE) =
8310 ParsePICArgs(getToolChain(), Triple, Args);
8311
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008312 switch (getToolChain().getArch()) {
8313 default:
8314 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008315 // Add --32/--64 to make sure we get the format we want.
8316 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008317 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008318 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008319 break;
8320 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008321 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8322 CmdArgs.push_back("--x32");
8323 else
8324 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008325 break;
8326 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008327 CmdArgs.push_back("-a32");
8328 CmdArgs.push_back("-mppc");
8329 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008330 break;
8331 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008332 CmdArgs.push_back("-a64");
8333 CmdArgs.push_back("-mppc64");
8334 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008335 break;
8336 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008337 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008338 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008339 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008340 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008341 break;
8342 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008343 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008344 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008345 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8346 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8347 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008348 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008349 }
8350 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008351 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008352 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8353 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8354 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008355 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008356 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008357 case llvm::Triple::arm:
8358 case llvm::Triple::armeb:
8359 case llvm::Triple::thumb:
8360 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008361 const llvm::Triple &Triple2 = getToolChain().getTriple();
8362 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008363 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008364 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008365 break;
8366 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008367 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008368 break;
8369 default:
8370 break;
8371 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008372
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008373 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008374 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8375 case arm::FloatABI::Soft:
8376 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8377 break;
8378 case arm::FloatABI::SoftFP:
8379 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8380 break;
8381 case arm::FloatABI::Hard:
8382 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8383 break;
8384 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008385
8386 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008387
8388 // FIXME: remove krait check when GNU tools support krait cpu
8389 // for now replace it with -march=armv7-a to avoid a lower
8390 // march from being picked in the absence of a cpu flag.
8391 Arg *A;
8392 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008393 StringRef(A->getValue()).lower() == "krait")
8394 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008395 else
8396 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008397 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008398 break;
8399 }
8400 case llvm::Triple::mips:
8401 case llvm::Triple::mipsel:
8402 case llvm::Triple::mips64:
8403 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008404 StringRef CPUName;
8405 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008406 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008407 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008408
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008409 CmdArgs.push_back("-march");
8410 CmdArgs.push_back(CPUName.data());
8411
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008412 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008413 CmdArgs.push_back(ABIName.data());
8414
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008415 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8416 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008417 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008418 CmdArgs.push_back("-mno-shared");
8419
Daniel Sanders379d44b2014-07-16 11:52:23 +00008420 // LLVM doesn't support -mplt yet and acts as if it is always given.
8421 // However, -mplt has no effect with the N64 ABI.
8422 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008423
8424 if (getToolChain().getArch() == llvm::Triple::mips ||
8425 getToolChain().getArch() == llvm::Triple::mips64)
8426 CmdArgs.push_back("-EB");
8427 else
8428 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008429
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008430 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8431 if (StringRef(A->getValue()) == "2008")
8432 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8433 }
8434
Daniel Sanders379d44b2014-07-16 11:52:23 +00008435 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8436 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8437 options::OPT_mfp64)) {
8438 A->claim();
8439 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008440 } else if (mips::shouldUseFPXX(
8441 Args, getToolChain().getTriple(), CPUName, ABIName,
8442 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008443 CmdArgs.push_back("-mfpxx");
8444
8445 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8446 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008447 if (Arg *A =
8448 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008449 if (A->getOption().matches(options::OPT_mips16)) {
8450 A->claim();
8451 A->render(Args, CmdArgs);
8452 } else {
8453 A->claim();
8454 CmdArgs.push_back("-no-mips16");
8455 }
8456 }
8457
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008458 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8459 options::OPT_mno_micromips);
8460 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8461 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8462
Simon Atanasyanbd986632013-11-26 11:58:04 +00008463 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8464 // Do not use AddLastArg because not all versions of MIPS assembler
8465 // support -mmsa / -mno-msa options.
8466 if (A->getOption().matches(options::OPT_mmsa))
8467 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8468 }
8469
Daniel Sanders379d44b2014-07-16 11:52:23 +00008470 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8471 options::OPT_msoft_float);
8472
Toma Tabacub36d6102015-06-11 12:13:18 +00008473 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8474 options::OPT_msingle_float);
8475
Daniel Sanders379d44b2014-07-16 11:52:23 +00008476 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8477 options::OPT_mno_odd_spreg);
8478
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008479 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008480 break;
8481 }
8482 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008483 // Always pass an -march option, since our default of z10 is later
8484 // than the GNU assembler's default.
8485 StringRef CPUName = getSystemZTargetCPU(Args);
8486 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008487 break;
8488 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008489 }
8490
Renato Golina74bbc72015-07-22 15:32:36 +00008491 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008492 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008493
8494 CmdArgs.push_back("-o");
8495 CmdArgs.push_back(Output.getFilename());
8496
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008497 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008498 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008499
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008500 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008501 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008502
8503 // Handle the debug info splitting at object creation time if we're
8504 // creating an object.
8505 // TODO: Currently only works on linux with newer objcopy.
8506 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008507 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008508 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008509 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008510}
8511
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008512static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008513 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008514 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008515 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008516 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8517 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008518 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008519 CmdArgs.push_back("-lgcc");
8520
Logan Chien3d3373c2012-11-19 12:04:11 +00008521 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008522 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008523 CmdArgs.push_back("-lgcc");
8524 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008525 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008526 CmdArgs.push_back("--as-needed");
8527 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008528 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008529 CmdArgs.push_back("--no-as-needed");
8530 }
8531
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008532 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008533 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008534 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008535 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008536
8537 // According to Android ABI, we have to link with libdl if we are
8538 // linking with non-static libgcc.
8539 //
8540 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8541 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8542 if (isAndroid && !StaticLibgcc)
8543 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008544}
8545
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008546static std::string getLinuxDynamicLinker(const ArgList &Args,
8547 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008548 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8549
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008550 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008551 if (ToolChain.getTriple().isArch64Bit())
8552 return "/system/bin/linker64";
8553 else
8554 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008555 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8556 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008557 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008558 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008559 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008560 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008561 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008562 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008563 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008564 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008565 return "/lib/ld-linux-armhf.so.3";
8566 else
8567 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008568 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8569 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008570 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008571 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008572 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008573 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008574 return "/lib/ld-linux.so.3";
8575 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8576 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008577 std::string LibDir =
8578 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008579 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008580 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008581 if (mips::isUCLibc(Args))
8582 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008583 else if (!ToolChain.getTriple().hasEnvironment()) {
8584 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8585 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8586 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8587 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008588 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008589
8590 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008591 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008592 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008593 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008594 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8595 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008596 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008597 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008598 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8599 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008600 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008601 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008602 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008603 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008604 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008605 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008606 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8607 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008608 else
8609 return "/lib64/ld-linux-x86-64.so.2";
8610}
8611
Renato Golinc4b49242014-02-13 10:01:16 +00008612static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008613 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008614 // Make use of compiler-rt if --rtlib option is used
8615 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8616
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008617 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008618 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008619 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008620 default:
8621 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008622 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008623 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008624 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008625 break;
8626 }
Renato Golinc4b49242014-02-13 10:01:16 +00008627 break;
8628 case ToolChain::RLT_Libgcc:
8629 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8630 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008631 }
8632}
8633
Rafael Espindola1e085772014-08-15 17:14:35 +00008634static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8635 switch (T.getArch()) {
8636 case llvm::Triple::x86:
8637 return "elf_i386";
8638 case llvm::Triple::aarch64:
8639 return "aarch64linux";
8640 case llvm::Triple::aarch64_be:
8641 return "aarch64_be_linux";
8642 case llvm::Triple::arm:
8643 case llvm::Triple::thumb:
8644 return "armelf_linux_eabi";
8645 case llvm::Triple::armeb:
8646 case llvm::Triple::thumbeb:
8647 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8648 case llvm::Triple::ppc:
8649 return "elf32ppclinux";
8650 case llvm::Triple::ppc64:
8651 return "elf64ppc";
8652 case llvm::Triple::ppc64le:
8653 return "elf64lppc";
8654 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008655 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008656 return "elf32_sparc";
8657 case llvm::Triple::sparcv9:
8658 return "elf64_sparc";
8659 case llvm::Triple::mips:
8660 return "elf32btsmip";
8661 case llvm::Triple::mipsel:
8662 return "elf32ltsmip";
8663 case llvm::Triple::mips64:
8664 if (mips::hasMipsAbiArg(Args, "n32"))
8665 return "elf32btsmipn32";
8666 return "elf64btsmip";
8667 case llvm::Triple::mips64el:
8668 if (mips::hasMipsAbiArg(Args, "n32"))
8669 return "elf32ltsmipn32";
8670 return "elf64ltsmip";
8671 case llvm::Triple::systemz:
8672 return "elf64_s390";
8673 case llvm::Triple::x86_64:
8674 if (T.getEnvironment() == llvm::Triple::GNUX32)
8675 return "elf32_x86_64";
8676 return "elf_x86_64";
8677 default:
8678 llvm_unreachable("Unexpected arch");
8679 }
8680}
8681
Douglas Katzman95354292015-06-23 20:42:09 +00008682void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8683 const InputInfo &Output,
8684 const InputInfoList &Inputs,
8685 const ArgList &Args,
8686 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008687 const toolchains::Linux &ToolChain =
8688 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008689 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008690
8691 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8692 llvm::Triple Triple = llvm::Triple(TripleStr);
8693
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008694 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008695 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008696 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008697 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8698 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008699 const bool HasCRTBeginEndFiles =
8700 ToolChain.getTriple().hasEnvironment() ||
8701 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008702
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008703 ArgStringList CmdArgs;
8704
Rafael Espindolad1002f62010-11-15 18:28:16 +00008705 // Silence warning for "clang -g foo.o -o foo"
8706 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008707 // and "clang -emit-llvm foo.o -o foo"
8708 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008709 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008710 // handled somewhere else.
8711 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008712
Peter Collingbourne39719a72015-11-20 20:49:39 +00008713 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8714 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008715 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008716 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008717 CmdArgs.push_back("-target");
8718 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8719 }
8720
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008721 if (!D.SysRoot.empty())
8722 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008723
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008724 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008725 CmdArgs.push_back("-pie");
8726
Rafael Espindola1c76c592010-11-07 22:57:16 +00008727 if (Args.hasArg(options::OPT_rdynamic))
8728 CmdArgs.push_back("-export-dynamic");
8729
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008730 if (Args.hasArg(options::OPT_s))
8731 CmdArgs.push_back("-s");
8732
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008733 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008734 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008735
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008736 for (const auto &Opt : ToolChain.ExtraOpts)
8737 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008738
8739 if (!Args.hasArg(options::OPT_static)) {
8740 CmdArgs.push_back("--eh-frame-hdr");
8741 }
8742
8743 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008744 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008745
8746 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008747 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8748 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008749 CmdArgs.push_back("-Bstatic");
8750 else
8751 CmdArgs.push_back("-static");
8752 } else if (Args.hasArg(options::OPT_shared)) {
8753 CmdArgs.push_back("-shared");
8754 }
8755
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008756 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8757 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008758 (!Args.hasArg(options::OPT_static) &&
8759 !Args.hasArg(options::OPT_shared))) {
8760 CmdArgs.push_back("-dynamic-linker");
8761 CmdArgs.push_back(Args.MakeArgString(
8762 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8763 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008764
8765 CmdArgs.push_back("-o");
8766 CmdArgs.push_back(Output.getFilename());
8767
Douglas Katzman78b37b02015-11-17 20:28:07 +00008768 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008769 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008770 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008771 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008772 if (Args.hasArg(options::OPT_pg))
8773 crt1 = "gcrt1.o";
8774 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008775 crt1 = "Scrt1.o";
8776 else
8777 crt1 = "crt1.o";
8778 }
8779 if (crt1)
8780 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008781
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008782 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8783 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008784
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008785 const char *crtbegin;
8786 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008787 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008788 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008789 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008790 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008791 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008792 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008793 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008794
8795 if (HasCRTBeginEndFiles)
8796 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008797
8798 // Add crtfastmath.o if available and fast math is enabled.
8799 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008800 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008801
8802 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008803 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008804
Douglas Katzman6059ef92015-11-17 17:41:23 +00008805 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008806
Teresa Johnson945bc502015-10-15 20:35:53 +00008807 if (D.isUsingLTO())
8808 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008809
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008810 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8811 CmdArgs.push_back("--no-demangle");
8812
Alexey Samsonov52550342014-09-15 19:58:40 +00008813 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008814 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008815 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008816 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008817
Douglas Katzman78b37b02015-11-17 20:28:07 +00008818 if (D.CCCIsCXX() &&
8819 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008820 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008821 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008822 if (OnlyLibstdcxxStatic)
8823 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008824 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008825 if (OnlyLibstdcxxStatic)
8826 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008827 CmdArgs.push_back("-lm");
8828 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008829 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8830 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008831
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008832 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008833 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8834 if (Args.hasArg(options::OPT_static))
8835 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008836
Alexey Samsonov52550342014-09-15 19:58:40 +00008837 if (NeedsSanitizerDeps)
8838 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8839
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008840 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8841 Args.hasArg(options::OPT_pthreads);
8842
8843 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8844 options::OPT_fno_openmp, false)) {
8845 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8846 // FIXME: Does this really make sense for all GNU toolchains?
8847 WantPthread = true;
8848
8849 // Also link the particular OpenMP runtimes.
8850 switch (getOpenMPRuntime(ToolChain, Args)) {
8851 case OMPRT_OMP:
8852 CmdArgs.push_back("-lomp");
8853 break;
8854 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008855 CmdArgs.push_back("-lgomp");
8856
8857 // FIXME: Exclude this for platforms with libgomp that don't require
8858 // librt. Most modern Linux platforms require it, but some may not.
8859 CmdArgs.push_back("-lrt");
8860 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008861 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008862 CmdArgs.push_back("-liomp5");
8863 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008864 case OMPRT_Unknown:
8865 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008866 break;
8867 }
Chandler Carruth01538002013-01-17 13:19:29 +00008868 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008869
Renato Golinc4b49242014-02-13 10:01:16 +00008870 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008871
Richard Smith31d1de22015-05-20 22:48:44 +00008872 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008873 CmdArgs.push_back("-lpthread");
8874
8875 CmdArgs.push_back("-lc");
8876
8877 if (Args.hasArg(options::OPT_static))
8878 CmdArgs.push_back("--end-group");
8879 else
Renato Golinc4b49242014-02-13 10:01:16 +00008880 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008881 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008882
Rafael Espindola81937ec2010-12-01 01:52:43 +00008883 if (!Args.hasArg(options::OPT_nostartfiles)) {
8884 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008885 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008886 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008887 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008888 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008889 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008890 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008891
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008892 if (HasCRTBeginEndFiles)
8893 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008894 if (!isAndroid)
8895 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008896 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008897 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008898
Peter Collingbourne39719a72015-11-20 20:49:39 +00008899 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008900}
8901
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008902// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8903// for the various SFI requirements like register masking. The assembly tool
8904// inserts the file containing the macros as an input into all the assembly
8905// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008906void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8907 const InputInfo &Output,
8908 const InputInfoList &Inputs,
8909 const ArgList &Args,
8910 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008911 const toolchains::NaClToolChain &ToolChain =
8912 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008913 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8914 "nacl-arm-macros.s");
8915 InputInfoList NewInputs;
8916 NewInputs.push_back(NaClMacros);
8917 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008918 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8919 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008920}
8921
Douglas Katzman750cfc52015-06-29 18:42:16 +00008922// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008923// we use static by default, do not yet support sanitizers or LTO, and a few
8924// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008925// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008926void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8927 const InputInfo &Output,
8928 const InputInfoList &Inputs,
8929 const ArgList &Args,
8930 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008931
Douglas Katzman54366072015-07-27 16:53:08 +00008932 const toolchains::NaClToolChain &ToolChain =
8933 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008934 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008935 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008936 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008937 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008938
8939 ArgStringList CmdArgs;
8940
8941 // Silence warning for "clang -g foo.o -o foo"
8942 Args.ClaimAllArgs(options::OPT_g_Group);
8943 // and "clang -emit-llvm foo.o -o foo"
8944 Args.ClaimAllArgs(options::OPT_emit_llvm);
8945 // and for "clang -w foo.o -o foo". Other warning options are already
8946 // handled somewhere else.
8947 Args.ClaimAllArgs(options::OPT_w);
8948
8949 if (!D.SysRoot.empty())
8950 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8951
8952 if (Args.hasArg(options::OPT_rdynamic))
8953 CmdArgs.push_back("-export-dynamic");
8954
8955 if (Args.hasArg(options::OPT_s))
8956 CmdArgs.push_back("-s");
8957
Douglas Katzman54366072015-07-27 16:53:08 +00008958 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8959 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008960 CmdArgs.push_back("--build-id");
8961
8962 if (!IsStatic)
8963 CmdArgs.push_back("--eh-frame-hdr");
8964
8965 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008966 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008967 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008968 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008969 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008970 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008971 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008972 else if (Arch == llvm::Triple::mipsel)
8973 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008974 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008975 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8976 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008977
8978 if (IsStatic)
8979 CmdArgs.push_back("-static");
8980 else if (Args.hasArg(options::OPT_shared))
8981 CmdArgs.push_back("-shared");
8982
8983 CmdArgs.push_back("-o");
8984 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008985 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008986 if (!Args.hasArg(options::OPT_shared))
8987 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8988 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8989
8990 const char *crtbegin;
8991 if (IsStatic)
8992 crtbegin = "crtbeginT.o";
8993 else if (Args.hasArg(options::OPT_shared))
8994 crtbegin = "crtbeginS.o";
8995 else
8996 crtbegin = "crtbegin.o";
8997 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8998 }
8999
9000 Args.AddAllArgs(CmdArgs, options::OPT_L);
9001 Args.AddAllArgs(CmdArgs, options::OPT_u);
9002
Douglas Katzman6059ef92015-11-17 17:41:23 +00009003 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009004
9005 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9006 CmdArgs.push_back("--no-demangle");
9007
9008 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9009
Douglas Katzman78b37b02015-11-17 20:28:07 +00009010 if (D.CCCIsCXX() &&
9011 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009012 bool OnlyLibstdcxxStatic =
9013 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009014 if (OnlyLibstdcxxStatic)
9015 CmdArgs.push_back("-Bstatic");
9016 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9017 if (OnlyLibstdcxxStatic)
9018 CmdArgs.push_back("-Bdynamic");
9019 CmdArgs.push_back("-lm");
9020 }
9021
9022 if (!Args.hasArg(options::OPT_nostdlib)) {
9023 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9024 // Always use groups, since it has no effect on dynamic libraries.
9025 CmdArgs.push_back("--start-group");
9026 CmdArgs.push_back("-lc");
9027 // NaCl's libc++ currently requires libpthread, so just always include it
9028 // in the group for C++.
9029 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009030 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009031 // Gold, used by Mips, handles nested groups differently than ld, and
9032 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9033 // which is not a desired behaviour here.
9034 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9035 if (getToolChain().getArch() == llvm::Triple::mipsel)
9036 CmdArgs.push_back("-lnacl");
9037
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009038 CmdArgs.push_back("-lpthread");
9039 }
9040
9041 CmdArgs.push_back("-lgcc");
9042 CmdArgs.push_back("--as-needed");
9043 if (IsStatic)
9044 CmdArgs.push_back("-lgcc_eh");
9045 else
9046 CmdArgs.push_back("-lgcc_s");
9047 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009048
9049 // Mips needs to create and use pnacl_legacy library that contains
9050 // definitions from bitcode/pnaclmm.c and definitions for
9051 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9052 if (getToolChain().getArch() == llvm::Triple::mipsel)
9053 CmdArgs.push_back("-lpnacl_legacy");
9054
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009055 CmdArgs.push_back("--end-group");
9056 }
9057
9058 if (!Args.hasArg(options::OPT_nostartfiles)) {
9059 const char *crtend;
9060 if (Args.hasArg(options::OPT_shared))
9061 crtend = "crtendS.o";
9062 else
9063 crtend = "crtend.o";
9064
9065 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9066 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9067 }
9068 }
9069
Peter Collingbourne39719a72015-11-20 20:49:39 +00009070 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9071 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009072}
9073
Douglas Katzman95354292015-06-23 20:42:09 +00009074void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9075 const InputInfo &Output,
9076 const InputInfoList &Inputs,
9077 const ArgList &Args,
9078 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009079 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009080 ArgStringList CmdArgs;
9081
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009082 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009083
9084 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009085 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009086
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009087 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009088 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009089
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009090 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009091 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009092}
9093
Douglas Katzman95354292015-06-23 20:42:09 +00009094void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9095 const InputInfo &Output,
9096 const InputInfoList &Inputs,
9097 const ArgList &Args,
9098 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009099 const Driver &D = getToolChain().getDriver();
9100 ArgStringList CmdArgs;
9101
Daniel Dunbarb440f562010-08-02 02:38:21 +00009102 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009103 CmdArgs.push_back("-o");
9104 CmdArgs.push_back(Output.getFilename());
9105 } else {
9106 assert(Output.isNothing() && "Invalid output.");
9107 }
9108
Douglas Katzman78b37b02015-11-17 20:28:07 +00009109 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009110 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9111 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9112 CmdArgs.push_back(
9113 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9114 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009115 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009116
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009117 Args.AddAllArgs(CmdArgs,
9118 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009119
Daniel Dunbar54423b22010-09-17 00:24:54 +00009120 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009121
Xinliang David Li69306c02015-10-22 06:15:31 +00009122 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009123
Douglas Katzman78b37b02015-11-17 20:28:07 +00009124 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009125 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009126 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009127 CmdArgs.push_back("-lm");
9128 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009129 }
9130
Douglas Katzman78b37b02015-11-17 20:28:07 +00009131 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009132 if (Args.hasArg(options::OPT_pthread))
9133 CmdArgs.push_back("-lpthread");
9134 CmdArgs.push_back("-lc");
9135 CmdArgs.push_back("-lCompilerRT-Generic");
9136 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9137 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009138 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009139 }
9140
Logan Chieneb9162f2014-06-26 14:23:45 +00009141 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009142 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009143}
9144
Daniel Dunbarcc912342009-05-02 18:28:39 +00009145/// DragonFly Tools
9146
9147// For now, DragonFly Assemble does just about the same as for
9148// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009149void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9150 const InputInfo &Output,
9151 const InputInfoList &Inputs,
9152 const ArgList &Args,
9153 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009154 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009155 ArgStringList CmdArgs;
9156
9157 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9158 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009159 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009160 CmdArgs.push_back("--32");
9161
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009162 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009163
9164 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009165 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009166
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009167 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009168 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009169
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009170 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009171 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009172}
9173
Douglas Katzman95354292015-06-23 20:42:09 +00009174void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9175 const InputInfo &Output,
9176 const InputInfoList &Inputs,
9177 const ArgList &Args,
9178 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009179 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009180 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00009181 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00009182
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009183 if (!D.SysRoot.empty())
9184 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9185
John McCall65b8da02013-04-11 22:55:55 +00009186 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009187 if (Args.hasArg(options::OPT_static)) {
9188 CmdArgs.push_back("-Bstatic");
9189 } else {
John McCall65b8da02013-04-11 22:55:55 +00009190 if (Args.hasArg(options::OPT_rdynamic))
9191 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009192 if (Args.hasArg(options::OPT_shared))
9193 CmdArgs.push_back("-Bshareable");
9194 else {
9195 CmdArgs.push_back("-dynamic-linker");
9196 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9197 }
John McCall65b8da02013-04-11 22:55:55 +00009198 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009199 }
9200
9201 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9202 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009203 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009204 CmdArgs.push_back("-m");
9205 CmdArgs.push_back("elf_i386");
9206 }
9207
Daniel Dunbarb440f562010-08-02 02:38:21 +00009208 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009209 CmdArgs.push_back("-o");
9210 CmdArgs.push_back(Output.getFilename());
9211 } else {
9212 assert(Output.isNothing() && "Invalid output.");
9213 }
9214
Douglas Katzman78b37b02015-11-17 20:28:07 +00009215 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009216 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009217 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009218 CmdArgs.push_back(
9219 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009220 else {
9221 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009222 CmdArgs.push_back(
9223 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009224 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009225 CmdArgs.push_back(
9226 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009227 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009228 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009229 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009230 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009231 CmdArgs.push_back(
9232 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009233 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009234 CmdArgs.push_back(
9235 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009236 }
9237
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009238 Args.AddAllArgs(CmdArgs,
9239 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009240
Daniel Dunbar54423b22010-09-17 00:24:54 +00009241 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009242
Douglas Katzman78b37b02015-11-17 20:28:07 +00009243 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009244 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9245 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009246 if (UseGCC47)
9247 CmdArgs.push_back("-L/usr/lib/gcc47");
9248 else
9249 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009250
9251 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009252 if (UseGCC47) {
9253 CmdArgs.push_back("-rpath");
9254 CmdArgs.push_back("/usr/lib/gcc47");
9255 } else {
9256 CmdArgs.push_back("-rpath");
9257 CmdArgs.push_back("/usr/lib/gcc44");
9258 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009259 }
9260
Hans Wennborg70850d82013-07-18 20:29:38 +00009261 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009262 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009263 CmdArgs.push_back("-lm");
9264 }
9265
Daniel Dunbarcc912342009-05-02 18:28:39 +00009266 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009267 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009268
9269 if (!Args.hasArg(options::OPT_nolibc)) {
9270 CmdArgs.push_back("-lc");
9271 }
9272
John McCall65b8da02013-04-11 22:55:55 +00009273 if (UseGCC47) {
9274 if (Args.hasArg(options::OPT_static) ||
9275 Args.hasArg(options::OPT_static_libgcc)) {
9276 CmdArgs.push_back("-lgcc");
9277 CmdArgs.push_back("-lgcc_eh");
9278 } else {
9279 if (Args.hasArg(options::OPT_shared_libgcc)) {
9280 CmdArgs.push_back("-lgcc_pic");
9281 if (!Args.hasArg(options::OPT_shared))
9282 CmdArgs.push_back("-lgcc");
9283 } else {
9284 CmdArgs.push_back("-lgcc");
9285 CmdArgs.push_back("--as-needed");
9286 CmdArgs.push_back("-lgcc_pic");
9287 CmdArgs.push_back("--no-as-needed");
9288 }
9289 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009290 } else {
John McCall65b8da02013-04-11 22:55:55 +00009291 if (Args.hasArg(options::OPT_shared)) {
9292 CmdArgs.push_back("-lgcc_pic");
9293 } else {
9294 CmdArgs.push_back("-lgcc");
9295 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009296 }
9297 }
9298
Douglas Katzman78b37b02015-11-17 20:28:07 +00009299 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009300 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009301 CmdArgs.push_back(
9302 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009303 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009304 CmdArgs.push_back(
9305 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9306 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009307 }
9308
Xinliang David Li69306c02015-10-22 06:15:31 +00009309 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009310
Logan Chieneb9162f2014-06-26 14:23:45 +00009311 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009312 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009313}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009314
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009315// Try to find Exe from a Visual Studio distribution. This first tries to find
9316// an installed copy of Visual Studio and, failing that, looks in the PATH,
9317// making sure that whatever executable that's found is not a same-named exe
9318// from clang itself to prevent clang from falling back to itself.
9319static std::string FindVisualStudioExecutable(const ToolChain &TC,
9320 const char *Exe,
9321 const char *ClangProgramPath) {
9322 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9323 std::string visualStudioBinDir;
9324 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9325 visualStudioBinDir)) {
9326 SmallString<128> FilePath(visualStudioBinDir);
9327 llvm::sys::path::append(FilePath, Exe);
9328 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9329 return FilePath.str();
9330 }
9331
9332 return Exe;
9333}
9334
Douglas Katzman95354292015-06-23 20:42:09 +00009335void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9336 const InputInfo &Output,
9337 const InputInfoList &Inputs,
9338 const ArgList &Args,
9339 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009340 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009341 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009342
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009343 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9344 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009345 CmdArgs.push_back(
9346 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009347
Douglas Katzman78b37b02015-11-17 20:28:07 +00009348 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9349 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009350 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009351
Zachary Turner10d75b22014-10-22 20:40:43 +00009352 if (!llvm::sys::Process::GetEnv("LIB")) {
9353 // If the VC environment hasn't been configured (perhaps because the user
9354 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009355 // the environment variable is set however, assume the user knows what
9356 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009357 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009358 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009359 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9360 SmallString<128> LibDir(VisualStudioDir);
9361 llvm::sys::path::append(LibDir, "VC", "lib");
9362 switch (MSVC.getArch()) {
9363 case llvm::Triple::x86:
9364 // x86 just puts the libraries directly in lib
9365 break;
9366 case llvm::Triple::x86_64:
9367 llvm::sys::path::append(LibDir, "amd64");
9368 break;
9369 case llvm::Triple::arm:
9370 llvm::sys::path::append(LibDir, "arm");
9371 break;
9372 default:
9373 break;
9374 }
9375 CmdArgs.push_back(
9376 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009377
9378 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9379 std::string UniversalCRTLibPath;
9380 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9381 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9382 UniversalCRTLibPath.c_str()));
9383 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009384 }
9385
9386 std::string WindowsSdkLibPath;
9387 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9388 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9389 WindowsSdkLibPath.c_str()));
9390 }
9391
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009392 CmdArgs.push_back("-nologo");
9393
Reid Kleckner124955a2015-08-05 18:51:13 +00009394 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009395 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009396
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009397 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009398 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009399 if (DLL) {
9400 CmdArgs.push_back(Args.MakeArgString("-dll"));
9401
9402 SmallString<128> ImplibName(Output.getFilename());
9403 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009404 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009405 }
9406
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009407 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009408 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009409 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009410 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009411 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9412 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009413 // Make sure the dynamic runtime thunk is not optimized out at link time
9414 // to ensure proper SEH handling.
9415 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009416 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009417 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009418 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009419 for (const auto &Lib : {"asan", "asan_cxx"})
9420 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009421 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009422 }
9423
Hans Wennborg2e274592013-08-13 23:38:57 +00009424 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009425
Alexey Bataevc7e84352015-08-19 04:49:01 +00009426 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9427 options::OPT_fno_openmp, false)) {
9428 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9429 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9430 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9431 TC.getDriver().Dir + "/../lib"));
9432 switch (getOpenMPRuntime(getToolChain(), Args)) {
9433 case OMPRT_OMP:
9434 CmdArgs.push_back("-defaultlib:libomp.lib");
9435 break;
9436 case OMPRT_IOMP5:
9437 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9438 break;
9439 case OMPRT_GOMP:
9440 break;
9441 case OMPRT_Unknown:
9442 // Already diagnosed.
9443 break;
9444 }
9445 }
9446
Reid Kleckner337188f2014-09-16 19:22:00 +00009447 // Add filenames, libraries, and other linker inputs.
9448 for (const auto &Input : Inputs) {
9449 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009450 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009451 continue;
9452 }
9453
9454 const Arg &A = Input.getInputArg();
9455
9456 // Render -l options differently for the MSVC linker.
9457 if (A.getOption().matches(options::OPT_l)) {
9458 StringRef Lib = A.getValue();
9459 const char *LinkLibArg;
9460 if (Lib.endswith(".lib"))
9461 LinkLibArg = Args.MakeArgString(Lib);
9462 else
9463 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9464 CmdArgs.push_back(LinkLibArg);
9465 continue;
9466 }
9467
9468 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9469 // or -L. Render it, even if MSVC doesn't understand it.
9470 A.renderAsInput(Args, CmdArgs);
9471 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009472
Zachary Turner719f58c2014-12-01 23:06:47 +00009473 // We need to special case some linker paths. In the case of lld, we need to
9474 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9475 // linker, we need to use a special search algorithm.
9476 llvm::SmallString<128> linkPath;
9477 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9478 if (Linker.equals_lower("lld"))
9479 Linker = "lld-link";
9480
9481 if (Linker.equals_lower("link")) {
9482 // If we're using the MSVC linker, it's not sufficient to just use link
9483 // from the program PATH, because other environments like GnuWin32 install
9484 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009485 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009486 C.getDriver().getClangProgramPath());
9487 } else {
9488 linkPath = Linker;
9489 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009490 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009491 }
9492
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009493 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009494 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009495}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009496
Douglas Katzman95354292015-06-23 20:42:09 +00009497void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9498 const InputInfo &Output,
9499 const InputInfoList &Inputs,
9500 const ArgList &Args,
9501 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009502 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9503}
9504
Douglas Katzman95354292015-06-23 20:42:09 +00009505std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009506 Compilation &C, const JobAction &JA, const InputInfo &Output,
9507 const InputInfoList &Inputs, const ArgList &Args,
9508 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009509 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009510 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009511 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009512 CmdArgs.push_back("/W0"); // No warnings.
9513
9514 // The goal is to be able to invoke this tool correctly based on
9515 // any flag accepted by clang-cl.
9516
9517 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009518 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009519
9520 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009521 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9522 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9523 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009524 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9525 if (A->getOption().getID() == options::OPT_O0) {
9526 CmdArgs.push_back("/Od");
9527 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009528 CmdArgs.push_back("/Og");
9529
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009530 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009531 if (OptLevel == "s" || OptLevel == "z")
9532 CmdArgs.push_back("/Os");
9533 else
9534 CmdArgs.push_back("/Ot");
9535
9536 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009537 }
9538 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009539 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9540 options::OPT_fno_omit_frame_pointer))
9541 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9542 ? "/Oy"
9543 : "/Oy-");
9544 if (!Args.hasArg(options::OPT_fwritable_strings))
9545 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009546
Nico Weber3f8dafb2015-03-12 19:37:10 +00009547 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009548 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9549
David Majnemerf6072342014-07-01 22:24:56 +00009550 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9551 /*default=*/false))
9552 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009553 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9554 options::OPT_fno_function_sections))
9555 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9556 ? "/Gy"
9557 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009558 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9559 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009560 CmdArgs.push_back(
9561 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009562 if (Args.hasArg(options::OPT_fsyntax_only))
9563 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009564 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9565 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009566 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009567
Nico Weber3f8dafb2015-03-12 19:37:10 +00009568 std::vector<std::string> Includes =
9569 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009570 for (const auto &Include : Includes)
9571 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009572
Hans Wennborg87cfa712013-09-19 20:32:16 +00009573 // Flags that can simply be passed through.
9574 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9575 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009576 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009577 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009578
9579 // The order of these flags is relevant, so pick the last one.
9580 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9581 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9582 A->render(Args, CmdArgs);
9583
Hans Wennborg87cfa712013-09-19 20:32:16 +00009584 // Input filename.
9585 assert(Inputs.size() == 1);
9586 const InputInfo &II = Inputs[0];
9587 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9588 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9589 if (II.isFilename())
9590 CmdArgs.push_back(II.getFilename());
9591 else
9592 II.getInputArg().renderAsInput(Args, CmdArgs);
9593
9594 // Output filename.
9595 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009596 const char *Fo =
9597 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009598 CmdArgs.push_back(Fo);
9599
Hans Wennborg188382e2013-09-20 18:16:35 +00009600 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009601 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9602 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009603 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009604 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009605}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009606
Yaron Keren1c0070c2015-07-02 04:45:27 +00009607/// MinGW Tools
9608void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9609 const InputInfo &Output,
9610 const InputInfoList &Inputs,
9611 const ArgList &Args,
9612 const char *LinkingOutput) const {
9613 claimNoWarnArgs(Args);
9614 ArgStringList CmdArgs;
9615
9616 if (getToolChain().getArch() == llvm::Triple::x86) {
9617 CmdArgs.push_back("--32");
9618 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9619 CmdArgs.push_back("--64");
9620 }
9621
9622 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9623
9624 CmdArgs.push_back("-o");
9625 CmdArgs.push_back(Output.getFilename());
9626
9627 for (const auto &II : Inputs)
9628 CmdArgs.push_back(II.getFilename());
9629
9630 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009631 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009632
9633 if (Args.hasArg(options::OPT_gsplit_dwarf))
9634 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9635 SplitDebugName(Args, Inputs[0]));
9636}
9637
9638void MinGW::Linker::AddLibGCC(const ArgList &Args,
9639 ArgStringList &CmdArgs) const {
9640 if (Args.hasArg(options::OPT_mthreads))
9641 CmdArgs.push_back("-lmingwthrd");
9642 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009643
Yaron Kerenaa281332015-08-09 00:24:07 +00009644 // Make use of compiler-rt if --rtlib option is used
9645 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9646 if (RLT == ToolChain::RLT_Libgcc) {
9647 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9648 Args.hasArg(options::OPT_static);
9649 bool Shared = Args.hasArg(options::OPT_shared);
9650 bool CXX = getToolChain().getDriver().CCCIsCXX();
9651
9652 if (Static || (!CXX && !Shared)) {
9653 CmdArgs.push_back("-lgcc");
9654 CmdArgs.push_back("-lgcc_eh");
9655 } else {
9656 CmdArgs.push_back("-lgcc_s");
9657 CmdArgs.push_back("-lgcc");
9658 }
9659 } else {
9660 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9661 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009662
Yaron Keren1c0070c2015-07-02 04:45:27 +00009663 CmdArgs.push_back("-lmoldname");
9664 CmdArgs.push_back("-lmingwex");
9665 CmdArgs.push_back("-lmsvcrt");
9666}
9667
9668void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9669 const InputInfo &Output,
9670 const InputInfoList &Inputs,
9671 const ArgList &Args,
9672 const char *LinkingOutput) const {
9673 const ToolChain &TC = getToolChain();
9674 const Driver &D = TC.getDriver();
9675 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9676
9677 ArgStringList CmdArgs;
9678
9679 // Silence warning for "clang -g foo.o -o foo"
9680 Args.ClaimAllArgs(options::OPT_g_Group);
9681 // and "clang -emit-llvm foo.o -o foo"
9682 Args.ClaimAllArgs(options::OPT_emit_llvm);
9683 // and for "clang -w foo.o -o foo". Other warning options are already
9684 // handled somewhere else.
9685 Args.ClaimAllArgs(options::OPT_w);
9686
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009687 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9688 if (LinkerName.equals_lower("lld")) {
9689 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009690 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009691 } else if (!LinkerName.equals_lower("ld")) {
9692 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009693 }
9694
Yaron Keren1c0070c2015-07-02 04:45:27 +00009695 if (!D.SysRoot.empty())
9696 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9697
9698 if (Args.hasArg(options::OPT_s))
9699 CmdArgs.push_back("-s");
9700
9701 CmdArgs.push_back("-m");
9702 if (TC.getArch() == llvm::Triple::x86)
9703 CmdArgs.push_back("i386pe");
9704 if (TC.getArch() == llvm::Triple::x86_64)
9705 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009706 if (TC.getArch() == llvm::Triple::arm)
9707 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009708
9709 if (Args.hasArg(options::OPT_mwindows)) {
9710 CmdArgs.push_back("--subsystem");
9711 CmdArgs.push_back("windows");
9712 } else if (Args.hasArg(options::OPT_mconsole)) {
9713 CmdArgs.push_back("--subsystem");
9714 CmdArgs.push_back("console");
9715 }
9716
9717 if (Args.hasArg(options::OPT_static))
9718 CmdArgs.push_back("-Bstatic");
9719 else {
9720 if (Args.hasArg(options::OPT_mdll))
9721 CmdArgs.push_back("--dll");
9722 else if (Args.hasArg(options::OPT_shared))
9723 CmdArgs.push_back("--shared");
9724 CmdArgs.push_back("-Bdynamic");
9725 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9726 CmdArgs.push_back("-e");
9727 if (TC.getArch() == llvm::Triple::x86)
9728 CmdArgs.push_back("_DllMainCRTStartup@12");
9729 else
9730 CmdArgs.push_back("DllMainCRTStartup");
9731 CmdArgs.push_back("--enable-auto-image-base");
9732 }
9733 }
9734
9735 CmdArgs.push_back("-o");
9736 CmdArgs.push_back(Output.getFilename());
9737
9738 Args.AddAllArgs(CmdArgs, options::OPT_e);
9739 // FIXME: add -N, -n flags
9740 Args.AddLastArg(CmdArgs, options::OPT_r);
9741 Args.AddLastArg(CmdArgs, options::OPT_s);
9742 Args.AddLastArg(CmdArgs, options::OPT_t);
9743 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9744 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9745
Douglas Katzman78b37b02015-11-17 20:28:07 +00009746 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009747 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9748 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9749 } else {
9750 if (Args.hasArg(options::OPT_municode))
9751 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9752 else
9753 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9754 }
9755 if (Args.hasArg(options::OPT_pg))
9756 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9757 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9758 }
9759
9760 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009761 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009762 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9763
9764 // TODO: Add ASan stuff here
9765
9766 // TODO: Add profile stuff here
9767
Douglas Katzman78b37b02015-11-17 20:28:07 +00009768 if (D.CCCIsCXX() &&
9769 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009770 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9771 !Args.hasArg(options::OPT_static);
9772 if (OnlyLibstdcxxStatic)
9773 CmdArgs.push_back("-Bstatic");
9774 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9775 if (OnlyLibstdcxxStatic)
9776 CmdArgs.push_back("-Bdynamic");
9777 }
9778
9779 if (!Args.hasArg(options::OPT_nostdlib)) {
9780 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9781 if (Args.hasArg(options::OPT_static))
9782 CmdArgs.push_back("--start-group");
9783
9784 if (Args.hasArg(options::OPT_fstack_protector) ||
9785 Args.hasArg(options::OPT_fstack_protector_strong) ||
9786 Args.hasArg(options::OPT_fstack_protector_all)) {
9787 CmdArgs.push_back("-lssp_nonshared");
9788 CmdArgs.push_back("-lssp");
9789 }
9790 if (Args.hasArg(options::OPT_fopenmp))
9791 CmdArgs.push_back("-lgomp");
9792
9793 AddLibGCC(Args, CmdArgs);
9794
9795 if (Args.hasArg(options::OPT_pg))
9796 CmdArgs.push_back("-lgmon");
9797
Yaron Kerenadce68e2015-07-06 18:52:19 +00009798 if (Args.hasArg(options::OPT_pthread))
9799 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009800
9801 // add system libraries
9802 if (Args.hasArg(options::OPT_mwindows)) {
9803 CmdArgs.push_back("-lgdi32");
9804 CmdArgs.push_back("-lcomdlg32");
9805 }
9806 CmdArgs.push_back("-ladvapi32");
9807 CmdArgs.push_back("-lshell32");
9808 CmdArgs.push_back("-luser32");
9809 CmdArgs.push_back("-lkernel32");
9810
9811 if (Args.hasArg(options::OPT_static))
9812 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009813 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009814 AddLibGCC(Args, CmdArgs);
9815 }
9816
9817 if (!Args.hasArg(options::OPT_nostartfiles)) {
9818 // Add crtfastmath.o if available and fast math is enabled.
9819 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9820
9821 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9822 }
9823 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009824 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009825 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009826}
9827
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009828/// XCore Tools
9829// We pass assemble and link construction to the xcc tool.
9830
Douglas Katzman95354292015-06-23 20:42:09 +00009831void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9832 const InputInfo &Output,
9833 const InputInfoList &Inputs,
9834 const ArgList &Args,
9835 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009836 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009837 ArgStringList CmdArgs;
9838
9839 CmdArgs.push_back("-o");
9840 CmdArgs.push_back(Output.getFilename());
9841
9842 CmdArgs.push_back("-c");
9843
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009844 if (Args.hasArg(options::OPT_v))
9845 CmdArgs.push_back("-v");
9846
Robert Lytton894d25c2014-05-02 09:33:25 +00009847 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9848 if (!A->getOption().matches(options::OPT_g0))
9849 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009850
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009851 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9852 false))
9853 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009854
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009855 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009856
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009857 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009858 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009859
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009860 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009861 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009862}
9863
Douglas Katzman95354292015-06-23 20:42:09 +00009864void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9865 const InputInfo &Output,
9866 const InputInfoList &Inputs,
9867 const ArgList &Args,
9868 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009869 ArgStringList CmdArgs;
9870
9871 if (Output.isFilename()) {
9872 CmdArgs.push_back("-o");
9873 CmdArgs.push_back(Output.getFilename());
9874 } else {
9875 assert(Output.isNothing() && "Invalid output.");
9876 }
9877
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009878 if (Args.hasArg(options::OPT_v))
9879 CmdArgs.push_back("-v");
9880
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009881 // Pass -fexceptions through to the linker if it was present.
9882 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9883 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009884 CmdArgs.push_back("-fexceptions");
9885
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009886 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9887
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009888 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009889 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009890}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009891
Douglas Katzman95354292015-06-23 20:42:09 +00009892void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9893 const InputInfo &Output,
9894 const InputInfoList &Inputs,
9895 const ArgList &Args,
9896 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009897 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009898 const auto &TC =
9899 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9900 ArgStringList CmdArgs;
9901 const char *Exec;
9902
9903 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009904 default:
9905 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009906 case llvm::Triple::arm:
9907 case llvm::Triple::thumb:
9908 break;
9909 case llvm::Triple::x86:
9910 CmdArgs.push_back("--32");
9911 break;
9912 case llvm::Triple::x86_64:
9913 CmdArgs.push_back("--64");
9914 break;
9915 }
9916
9917 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9918
9919 CmdArgs.push_back("-o");
9920 CmdArgs.push_back(Output.getFilename());
9921
9922 for (const auto &Input : Inputs)
9923 CmdArgs.push_back(Input.getFilename());
9924
9925 const std::string Assembler = TC.GetProgramPath("as");
9926 Exec = Args.MakeArgString(Assembler);
9927
Justin Bognerd3371d82015-07-17 03:35:54 +00009928 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009929}
9930
Douglas Katzman95354292015-06-23 20:42:09 +00009931void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9932 const InputInfo &Output,
9933 const InputInfoList &Inputs,
9934 const ArgList &Args,
9935 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009936 const auto &TC =
9937 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9938 const llvm::Triple &T = TC.getTriple();
9939 const Driver &D = TC.getDriver();
9940 SmallString<128> EntryPoint;
9941 ArgStringList CmdArgs;
9942 const char *Exec;
9943
9944 // Silence warning for "clang -g foo.o -o foo"
9945 Args.ClaimAllArgs(options::OPT_g_Group);
9946 // and "clang -emit-llvm foo.o -o foo"
9947 Args.ClaimAllArgs(options::OPT_emit_llvm);
9948 // and for "clang -w foo.o -o foo"
9949 Args.ClaimAllArgs(options::OPT_w);
9950 // Other warning options are already handled somewhere else.
9951
9952 if (!D.SysRoot.empty())
9953 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9954
9955 if (Args.hasArg(options::OPT_pie))
9956 CmdArgs.push_back("-pie");
9957 if (Args.hasArg(options::OPT_rdynamic))
9958 CmdArgs.push_back("-export-dynamic");
9959 if (Args.hasArg(options::OPT_s))
9960 CmdArgs.push_back("--strip-all");
9961
9962 CmdArgs.push_back("-m");
9963 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009964 default:
9965 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009966 case llvm::Triple::arm:
9967 case llvm::Triple::thumb:
9968 // FIXME: this is incorrect for WinCE
9969 CmdArgs.push_back("thumb2pe");
9970 break;
9971 case llvm::Triple::x86:
9972 CmdArgs.push_back("i386pe");
9973 EntryPoint.append("_");
9974 break;
9975 case llvm::Triple::x86_64:
9976 CmdArgs.push_back("i386pep");
9977 break;
9978 }
9979
9980 if (Args.hasArg(options::OPT_shared)) {
9981 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009982 default:
9983 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009984 case llvm::Triple::arm:
9985 case llvm::Triple::thumb:
9986 case llvm::Triple::x86_64:
9987 EntryPoint.append("_DllMainCRTStartup");
9988 break;
9989 case llvm::Triple::x86:
9990 EntryPoint.append("_DllMainCRTStartup@12");
9991 break;
9992 }
9993
9994 CmdArgs.push_back("-shared");
9995 CmdArgs.push_back("-Bdynamic");
9996
9997 CmdArgs.push_back("--enable-auto-image-base");
9998
9999 CmdArgs.push_back("--entry");
10000 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10001 } else {
10002 EntryPoint.append("mainCRTStartup");
10003
10004 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10005 : "-Bdynamic");
10006
Douglas Katzman78b37b02015-11-17 20:28:07 +000010007 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010008 CmdArgs.push_back("--entry");
10009 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10010 }
10011
10012 // FIXME: handle subsystem
10013 }
10014
10015 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010016 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010017
10018 CmdArgs.push_back("-o");
10019 CmdArgs.push_back(Output.getFilename());
10020
10021 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10022 SmallString<261> ImpLib(Output.getFilename());
10023 llvm::sys::path::replace_extension(ImpLib, ".lib");
10024
10025 CmdArgs.push_back("--out-implib");
10026 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10027 }
10028
Douglas Katzman78b37b02015-11-17 20:28:07 +000010029 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010030 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10031 const char *CRTBegin;
10032
10033 CRTBegin =
10034 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10035 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10036 }
10037
10038 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010039 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010040 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10041
10042 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10043 !Args.hasArg(options::OPT_nodefaultlibs)) {
10044 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10045 !Args.hasArg(options::OPT_static);
10046 if (StaticCXX)
10047 CmdArgs.push_back("-Bstatic");
10048 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10049 if (StaticCXX)
10050 CmdArgs.push_back("-Bdynamic");
10051 }
10052
10053 if (!Args.hasArg(options::OPT_nostdlib)) {
10054 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10055 // TODO handle /MT[d] /MD[d]
10056 CmdArgs.push_back("-lmsvcrt");
10057 AddRunTimeLibs(TC, D, CmdArgs, Args);
10058 }
10059 }
10060
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010061 if (TC.getSanitizerArgs().needsAsanRt()) {
10062 // TODO handle /MT[d] /MD[d]
10063 if (Args.hasArg(options::OPT_shared)) {
10064 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10065 } else {
10066 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10067 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10068 // Make sure the dynamic runtime thunk is not optimized out at link time
10069 // to ensure proper SEH handling.
10070 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10071 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10072 ? "___asan_seh_interceptor"
10073 : "__asan_seh_interceptor"));
10074 }
10075 }
10076
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010077 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010078
Justin Bognerd3371d82015-07-17 03:35:54 +000010079 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010080}
Douglas Katzman84a75642015-06-19 14:55:19 +000010081
Douglas Katzman95354292015-06-23 20:42:09 +000010082void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10083 const InputInfo &Output,
10084 const InputInfoList &Inputs,
10085 const ArgList &Args,
10086 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010087 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010088 assert(Inputs.size() == 1);
10089 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010090 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10091 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010092
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010093 if (JA.getKind() == Action::PreprocessJobClass) {
10094 Args.ClaimAllArgs();
10095 CmdArgs.push_back("-E");
10096 } else {
10097 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10098 CmdArgs.push_back("-S");
10099 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10100 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010101 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010102 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010103
Douglas Katzmanf6071112015-08-03 14:34:22 +000010104 // Append all -I, -iquote, -isystem paths, defines/undefines,
10105 // 'f' flags, optimize flags, and warning options.
10106 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010107 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010108 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010109 options::OPT_f_Group, options::OPT_f_clang_Group,
10110 options::OPT_g_Group, options::OPT_M_Group,
10111 options::OPT_O_Group, options::OPT_W_Group});
10112
10113 // If we're producing a dependency file, and assembly is the final action,
10114 // then the name of the target in the dependency file should be the '.o'
10115 // file, not the '.s' file produced by this step. For example, instead of
10116 // /tmp/mumble.s: mumble.c .../someheader.h
10117 // the filename on the lefthand side should be "mumble.o"
10118 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10119 C.getActions().size() == 1 &&
10120 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10121 Arg *A = Args.getLastArg(options::OPT_o);
10122 if (A) {
10123 CmdArgs.push_back("-MT");
10124 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10125 }
10126 }
10127
Douglas Katzman84a75642015-06-19 14:55:19 +000010128 CmdArgs.push_back(II.getFilename());
10129 CmdArgs.push_back("-o");
10130 CmdArgs.push_back(Output.getFilename());
10131
10132 std::string Exec =
10133 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010134 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10135 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010136}
10137
Douglas Katzman95354292015-06-23 20:42:09 +000010138void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10139 const InputInfo &Output,
10140 const InputInfoList &Inputs,
10141 const ArgList &Args,
10142 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010143 ArgStringList CmdArgs;
10144
10145 assert(Inputs.size() == 1);
10146 const InputInfo &II = Inputs[0];
10147 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10148 assert(Output.getType() == types::TY_Object);
10149
10150 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010151 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010152 CmdArgs.push_back("-noSPrefixing");
10153 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010154 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10155 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10156 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010157 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010158 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010159 }
10160 CmdArgs.push_back("-elf"); // Output format.
10161 CmdArgs.push_back(II.getFilename());
10162 CmdArgs.push_back(
10163 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10164
10165 std::string Exec =
10166 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010167 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10168 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010169}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010170
10171void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10172 const InputInfo &Output,
10173 const InputInfoList &Inputs,
10174 const ArgList &Args,
10175 const char *LinkingOutput) const {
10176 const auto &TC =
10177 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10178 const llvm::Triple &T = TC.getTriple();
10179 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010180 bool UseStartfiles =
10181 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010182 bool UseDefaultLibs =
10183 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010184
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010185 if (T.getArch() == llvm::Triple::sparc)
10186 CmdArgs.push_back("-EB");
10187 else // SHAVE assumes little-endian, and sparcel is expressly so.
10188 CmdArgs.push_back("-EL");
10189
10190 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10191 // but we never pass through a --sysroot option and various other bits.
10192 // For example, there are no sanitizers (yet) nor gold linker.
10193
10194 // Eat some arguments that may be present but have no effect.
10195 Args.ClaimAllArgs(options::OPT_g_Group);
10196 Args.ClaimAllArgs(options::OPT_w);
10197 Args.ClaimAllArgs(options::OPT_static_libgcc);
10198
10199 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10200 CmdArgs.push_back("-s");
10201
10202 CmdArgs.push_back("-o");
10203 CmdArgs.push_back(Output.getFilename());
10204
10205 if (UseStartfiles) {
10206 // If you want startfiles, it means you want the builtin crti and crtbegin,
10207 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010208 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10209 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010210 }
10211
10212 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10213 options::OPT_e, options::OPT_s, options::OPT_t,
10214 options::OPT_Z_Flag, options::OPT_r});
10215
Douglas Katzman674a3122015-11-18 16:24:46 +000010216 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010217
10218 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10219
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010220 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010221 if (C.getDriver().CCCIsCXX())
10222 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010223 if (T.getOS() == llvm::Triple::RTEMS) {
10224 CmdArgs.push_back("--start-group");
10225 CmdArgs.push_back("-lc");
10226 // You must provide your own "-L" option to enable finding these.
10227 CmdArgs.push_back("-lrtemscpu");
10228 CmdArgs.push_back("-lrtemsbsp");
10229 CmdArgs.push_back("--end-group");
10230 } else {
10231 CmdArgs.push_back("-lc");
10232 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010233 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010234 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010235 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010236 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10237 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010238 }
10239
10240 std::string Exec =
10241 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10242 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10243 CmdArgs, Inputs));
10244}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010245
10246void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10247 const InputInfo &Output,
10248 const InputInfoList &Inputs,
10249 const ArgList &Args,
10250 const char *LinkingOutput) const {
10251 claimNoWarnArgs(Args);
10252 ArgStringList CmdArgs;
10253
10254 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10255
10256 CmdArgs.push_back("-o");
10257 CmdArgs.push_back(Output.getFilename());
10258
10259 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10260 const InputInfo &Input = Inputs[0];
10261 assert(Input.isFilename() && "Invalid input.");
10262 CmdArgs.push_back(Input.getFilename());
10263
10264 const char *Exec =
10265 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10266 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10267}
10268
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010269static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10270 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10271 if (SanArgs.needsUbsanRt()) {
10272 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10273 }
10274 if (SanArgs.needsAsanRt()) {
10275 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10276 }
10277}
10278
10279static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10280 const JobAction &JA, const InputInfo &Output,
10281 const InputInfoList &Inputs,
10282 const ArgList &Args,
10283 const char *LinkingOutput) {
10284 const toolchains::FreeBSD &ToolChain =
10285 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10286 const Driver &D = ToolChain.getDriver();
10287 ArgStringList CmdArgs;
10288
10289 // Silence warning for "clang -g foo.o -o foo"
10290 Args.ClaimAllArgs(options::OPT_g_Group);
10291 // and "clang -emit-llvm foo.o -o foo"
10292 Args.ClaimAllArgs(options::OPT_emit_llvm);
10293 // and for "clang -w foo.o -o foo". Other warning options are already
10294 // handled somewhere else.
10295 Args.ClaimAllArgs(options::OPT_w);
10296
10297 if (!D.SysRoot.empty())
10298 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10299
10300 if (Args.hasArg(options::OPT_pie))
10301 CmdArgs.push_back("-pie");
10302
10303 if (Args.hasArg(options::OPT_rdynamic))
10304 CmdArgs.push_back("-export-dynamic");
10305 if (Args.hasArg(options::OPT_shared))
10306 CmdArgs.push_back("--oformat=so");
10307
10308 if (Output.isFilename()) {
10309 CmdArgs.push_back("-o");
10310 CmdArgs.push_back(Output.getFilename());
10311 } else {
10312 assert(Output.isNothing() && "Invalid output.");
10313 }
10314
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010315 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10316
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010317 Args.AddAllArgs(CmdArgs, options::OPT_L);
10318 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10319 Args.AddAllArgs(CmdArgs, options::OPT_e);
10320 Args.AddAllArgs(CmdArgs, options::OPT_s);
10321 Args.AddAllArgs(CmdArgs, options::OPT_t);
10322 Args.AddAllArgs(CmdArgs, options::OPT_r);
10323
10324 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10325 CmdArgs.push_back("--no-demangle");
10326
10327 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10328
10329 if (Args.hasArg(options::OPT_pthread)) {
10330 CmdArgs.push_back("-lpthread");
10331 }
10332
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010333 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10334
10335 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10336}
10337
10338static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10339 const JobAction &JA, const InputInfo &Output,
10340 const InputInfoList &Inputs,
10341 const ArgList &Args,
10342 const char *LinkingOutput) {
10343 const toolchains::FreeBSD &ToolChain =
10344 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10345 const Driver &D = ToolChain.getDriver();
10346 ArgStringList CmdArgs;
10347
10348 // Silence warning for "clang -g foo.o -o foo"
10349 Args.ClaimAllArgs(options::OPT_g_Group);
10350 // and "clang -emit-llvm foo.o -o foo"
10351 Args.ClaimAllArgs(options::OPT_emit_llvm);
10352 // and for "clang -w foo.o -o foo". Other warning options are already
10353 // handled somewhere else.
10354 Args.ClaimAllArgs(options::OPT_w);
10355
10356 if (!D.SysRoot.empty())
10357 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10358
10359 if (Args.hasArg(options::OPT_pie))
10360 CmdArgs.push_back("-pie");
10361
10362 if (Args.hasArg(options::OPT_static)) {
10363 CmdArgs.push_back("-Bstatic");
10364 } else {
10365 if (Args.hasArg(options::OPT_rdynamic))
10366 CmdArgs.push_back("-export-dynamic");
10367 CmdArgs.push_back("--eh-frame-hdr");
10368 if (Args.hasArg(options::OPT_shared)) {
10369 CmdArgs.push_back("-Bshareable");
10370 } else {
10371 CmdArgs.push_back("-dynamic-linker");
10372 CmdArgs.push_back("/libexec/ld-elf.so.1");
10373 }
10374 CmdArgs.push_back("--enable-new-dtags");
10375 }
10376
10377 if (Output.isFilename()) {
10378 CmdArgs.push_back("-o");
10379 CmdArgs.push_back(Output.getFilename());
10380 } else {
10381 assert(Output.isNothing() && "Invalid output.");
10382 }
10383
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010384 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10385
Douglas Katzman78b37b02015-11-17 20:28:07 +000010386 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010387 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010388 if (!Args.hasArg(options::OPT_shared)) {
10389 if (Args.hasArg(options::OPT_pg))
10390 crt1 = "gcrt1.o";
10391 else if (Args.hasArg(options::OPT_pie))
10392 crt1 = "Scrt1.o";
10393 else
10394 crt1 = "crt1.o";
10395 }
10396 if (crt1)
10397 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10398
10399 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10400
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010401 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010402 if (Args.hasArg(options::OPT_static))
10403 crtbegin = "crtbeginT.o";
10404 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10405 crtbegin = "crtbeginS.o";
10406 else
10407 crtbegin = "crtbegin.o";
10408
10409 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10410 }
10411
10412 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010413 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010414 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10415 Args.AddAllArgs(CmdArgs, options::OPT_e);
10416 Args.AddAllArgs(CmdArgs, options::OPT_s);
10417 Args.AddAllArgs(CmdArgs, options::OPT_t);
10418 Args.AddAllArgs(CmdArgs, options::OPT_r);
10419
10420 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10421 CmdArgs.push_back("--no-demangle");
10422
10423 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10424
Douglas Katzman78b37b02015-11-17 20:28:07 +000010425 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010426 // For PS4, we always want to pass libm, libstdc++ and libkernel
10427 // libraries for both C and C++ compilations.
10428 CmdArgs.push_back("-lkernel");
10429 if (D.CCCIsCXX()) {
10430 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10431 if (Args.hasArg(options::OPT_pg))
10432 CmdArgs.push_back("-lm_p");
10433 else
10434 CmdArgs.push_back("-lm");
10435 }
10436 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10437 // the default system libraries. Just mimic this for now.
10438 if (Args.hasArg(options::OPT_pg))
10439 CmdArgs.push_back("-lgcc_p");
10440 else
10441 CmdArgs.push_back("-lcompiler_rt");
10442 if (Args.hasArg(options::OPT_static)) {
10443 CmdArgs.push_back("-lstdc++");
10444 } else if (Args.hasArg(options::OPT_pg)) {
10445 CmdArgs.push_back("-lgcc_eh_p");
10446 } else {
10447 CmdArgs.push_back("--as-needed");
10448 CmdArgs.push_back("-lstdc++");
10449 CmdArgs.push_back("--no-as-needed");
10450 }
10451
10452 if (Args.hasArg(options::OPT_pthread)) {
10453 if (Args.hasArg(options::OPT_pg))
10454 CmdArgs.push_back("-lpthread_p");
10455 else
10456 CmdArgs.push_back("-lpthread");
10457 }
10458
10459 if (Args.hasArg(options::OPT_pg)) {
10460 if (Args.hasArg(options::OPT_shared))
10461 CmdArgs.push_back("-lc");
10462 else {
10463 if (Args.hasArg(options::OPT_static)) {
10464 CmdArgs.push_back("--start-group");
10465 CmdArgs.push_back("-lc_p");
10466 CmdArgs.push_back("-lpthread_p");
10467 CmdArgs.push_back("--end-group");
10468 } else {
10469 CmdArgs.push_back("-lc_p");
10470 }
10471 }
10472 CmdArgs.push_back("-lgcc_p");
10473 } else {
10474 if (Args.hasArg(options::OPT_static)) {
10475 CmdArgs.push_back("--start-group");
10476 CmdArgs.push_back("-lc");
10477 CmdArgs.push_back("-lpthread");
10478 CmdArgs.push_back("--end-group");
10479 } else {
10480 CmdArgs.push_back("-lc");
10481 }
10482 CmdArgs.push_back("-lcompiler_rt");
10483 }
10484
10485 if (Args.hasArg(options::OPT_static)) {
10486 CmdArgs.push_back("-lstdc++");
10487 } else if (Args.hasArg(options::OPT_pg)) {
10488 CmdArgs.push_back("-lgcc_eh_p");
10489 } else {
10490 CmdArgs.push_back("--as-needed");
10491 CmdArgs.push_back("-lstdc++");
10492 CmdArgs.push_back("--no-as-needed");
10493 }
10494 }
10495
Douglas Katzman78b37b02015-11-17 20:28:07 +000010496 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010497 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10498 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10499 else
10500 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10501 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10502 }
10503
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010504 const char *Exec =
10505#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010506 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010507#else
10508 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10509#endif
10510
10511 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10512}
10513
10514void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10515 const InputInfo &Output,
10516 const InputInfoList &Inputs,
10517 const ArgList &Args,
10518 const char *LinkingOutput) const {
10519 const toolchains::FreeBSD &ToolChain =
10520 static_cast<const toolchains::FreeBSD &>(getToolChain());
10521 const Driver &D = ToolChain.getDriver();
10522 bool PS4Linker;
10523 StringRef LinkerOptName;
10524 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10525 LinkerOptName = A->getValue();
10526 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10527 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10528 }
10529
10530 if (LinkerOptName == "gold")
10531 PS4Linker = false;
10532 else if (LinkerOptName == "ps4")
10533 PS4Linker = true;
10534 else
10535 PS4Linker = !Args.hasArg(options::OPT_shared);
10536
10537 if (PS4Linker)
10538 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10539 else
10540 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10541}