blob: 20a1035bd582aede0113dd57a6f4af608ff106c1 [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);
1424
1425 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1426 // pass the correct option to the backend while calling the frontend
1427 // option the same.
1428 // TODO: Change the LLVM backend option maybe?
1429 if (Name == "mfcrf")
1430 Name = "mfocrf";
1431
1432 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1433 }
1434
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001435 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1436 if (FloatABI == ppc::FloatABI::Soft &&
1437 !(Triple.getArch() == llvm::Triple::ppc64 ||
1438 Triple.getArch() == llvm::Triple::ppc64le))
1439 Features.push_back("+soft-float");
1440 else if (FloatABI == ppc::FloatABI::Soft &&
1441 (Triple.getArch() == llvm::Triple::ppc64 ||
1442 Triple.getArch() == llvm::Triple::ppc64le))
1443 D.Diag(diag::err_drv_invalid_mfloat_abi)
1444 << "soft float is not supported for ppc64";
1445
Eric Christopher643bb6a2013-10-16 20:40:08 +00001446 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001447 AddTargetFeature(Args, Features, options::OPT_faltivec,
1448 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001449}
1450
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001451ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1452 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1453 if (Arg *A =
1454 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1455 options::OPT_mfloat_abi_EQ)) {
1456 if (A->getOption().matches(options::OPT_msoft_float))
1457 ABI = ppc::FloatABI::Soft;
1458 else if (A->getOption().matches(options::OPT_mhard_float))
1459 ABI = ppc::FloatABI::Hard;
1460 else {
1461 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1462 .Case("soft", ppc::FloatABI::Soft)
1463 .Case("hard", ppc::FloatABI::Hard)
1464 .Default(ppc::FloatABI::Invalid);
1465 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1466 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1467 ABI = ppc::FloatABI::Hard;
1468 }
1469 }
1470 }
1471
1472 // If unspecified, choose the default based on the platform.
1473 if (ABI == ppc::FloatABI::Invalid) {
1474 ABI = ppc::FloatABI::Hard;
1475 }
1476
1477 return ABI;
1478}
1479
Ulrich Weigand8afad612014-07-28 13:17:52 +00001480void Clang::AddPPCTargetArgs(const ArgList &Args,
1481 ArgStringList &CmdArgs) const {
1482 // Select the ABI to use.
1483 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001484 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001485 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001486 case llvm::Triple::ppc64: {
1487 // When targeting a processor that supports QPX, or if QPX is
1488 // specifically enabled, default to using the ABI that supports QPX (so
1489 // long as it is not specifically disabled).
1490 bool HasQPX = false;
1491 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1492 HasQPX = A->getValue() == StringRef("a2q");
1493 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1494 if (HasQPX) {
1495 ABIName = "elfv1-qpx";
1496 break;
1497 }
1498
Ulrich Weigand8afad612014-07-28 13:17:52 +00001499 ABIName = "elfv1";
1500 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001501 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001502 case llvm::Triple::ppc64le:
1503 ABIName = "elfv2";
1504 break;
1505 default:
1506 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001507 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001508
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001509 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1510 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1511 // the option if given as we don't have backend support for any targets
1512 // that don't use the altivec abi.
1513 if (StringRef(A->getValue()) != "altivec")
1514 ABIName = A->getValue();
1515
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001516 ppc::FloatABI FloatABI =
1517 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1518
1519 if (FloatABI == ppc::FloatABI::Soft) {
1520 // Floating point operations and argument passing are soft.
1521 CmdArgs.push_back("-msoft-float");
1522 CmdArgs.push_back("-mfloat-abi");
1523 CmdArgs.push_back("soft");
1524 } else {
1525 // Floating point operations and argument passing are hard.
1526 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1527 CmdArgs.push_back("-mfloat-abi");
1528 CmdArgs.push_back("hard");
1529 }
1530
Ulrich Weigand8afad612014-07-28 13:17:52 +00001531 if (ABIName) {
1532 CmdArgs.push_back("-target-abi");
1533 CmdArgs.push_back(ABIName);
1534 }
1535}
1536
1537bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1538 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1539 return A && (A->getValue() == StringRef(Value));
1540}
1541
Tom Stellard6674c702013-04-01 20:56:53 +00001542/// Get the (LLVM) name of the R600 gpu we are targeting.
1543static std::string getR600TargetGPU(const ArgList &Args) {
1544 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001545 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001546 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001547 .Cases("rv630", "rv635", "r600")
1548 .Cases("rv610", "rv620", "rs780", "rs880")
1549 .Case("rv740", "rv770")
1550 .Case("palm", "cedar")
1551 .Cases("sumo", "sumo2", "sumo")
1552 .Case("hemlock", "cypress")
1553 .Case("aruba", "cayman")
1554 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001555 }
1556 return "";
1557}
1558
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001560 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001562 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001563
James Y Knightb2406522015-06-15 20:51:24 +00001564 bool SoftFloatABI = false;
1565 if (Arg *A =
1566 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001568 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001569 }
1570
James Y Knightb2406522015-06-15 20:51:24 +00001571 // Only the hard-float ABI on Sparc is standardized, and it is the
1572 // default. GCC also supports a nonstandard soft-float ABI mode, and
1573 // perhaps LLVM should implement that, too. However, since llvm
1574 // currently does not support Sparc soft-float, at all, display an
1575 // error if it's requested.
1576 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001577 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1578 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001579 }
1580}
1581
Richard Sandiford4652d892013-07-19 16:51:51 +00001582static const char *getSystemZTargetCPU(const ArgList &Args) {
1583 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1584 return A->getValue();
1585 return "z10";
1586}
1587
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001588static void getSystemZTargetFeatures(const ArgList &Args,
1589 std::vector<const char *> &Features) {
1590 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001591 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001592 if (A->getOption().matches(options::OPT_mhtm))
1593 Features.push_back("+transactional-execution");
1594 else
1595 Features.push_back("-transactional-execution");
1596 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001598 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001599 if (A->getOption().matches(options::OPT_mvx))
1600 Features.push_back("+vector");
1601 else
1602 Features.push_back("-vector");
1603 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001604}
1605
Chandler Carruth953fb082013-01-13 11:46:33 +00001606static const char *getX86TargetCPU(const ArgList &Args,
1607 const llvm::Triple &Triple) {
1608 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001610 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001611 return "core-avx2";
1612
Chandler Carruth953fb082013-01-13 11:46:33 +00001613 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001614 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001615
1616 // FIXME: Reject attempts to use -march=native unless the target matches
1617 // the host.
1618 //
1619 // FIXME: We should also incorporate the detected target features for use
1620 // with -native.
1621 std::string CPU = llvm::sys::getHostCPUName();
1622 if (!CPU.empty() && CPU != "generic")
1623 return Args.MakeArgString(CPU);
1624 }
1625
Reid Kleckner3123eff2015-06-30 16:32:04 +00001626 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1627 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1628 StringRef Arch = A->getValue();
1629 const char *CPU;
1630 if (Triple.getArch() == llvm::Triple::x86) {
1631 CPU = llvm::StringSwitch<const char *>(Arch)
1632 .Case("IA32", "i386")
1633 .Case("SSE", "pentium3")
1634 .Case("SSE2", "pentium4")
1635 .Case("AVX", "sandybridge")
1636 .Case("AVX2", "haswell")
1637 .Default(nullptr);
1638 } else {
1639 CPU = llvm::StringSwitch<const char *>(Arch)
1640 .Case("AVX", "sandybridge")
1641 .Case("AVX2", "haswell")
1642 .Default(nullptr);
1643 }
1644 if (CPU)
1645 return CPU;
1646 }
1647
Chandler Carruth953fb082013-01-13 11:46:33 +00001648 // Select the default CPU if none was given (or detection failed).
1649
1650 if (Triple.getArch() != llvm::Triple::x86_64 &&
1651 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001652 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001653
1654 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1655
1656 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001657 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001658 if (Triple.getArchName() == "x86_64h")
1659 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001660 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001661 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001662
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001663 // Set up default CPU name for PS4 compilers.
1664 if (Triple.isPS4CPU())
1665 return "btver2";
1666
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001668 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001669 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001670
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001671 // Everything else goes to x86-64 in 64-bit mode.
1672 if (Is64Bit)
1673 return "x86-64";
1674
1675 switch (Triple.getOS()) {
1676 case llvm::Triple::FreeBSD:
1677 case llvm::Triple::NetBSD:
1678 case llvm::Triple::OpenBSD:
1679 return "i486";
1680 case llvm::Triple::Haiku:
1681 return "i586";
1682 case llvm::Triple::Bitrig:
1683 return "i686";
1684 default:
1685 // Fallback to p4.
1686 return "pentium4";
1687 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001688}
1689
Dan Gohmanc2853072015-09-03 22:51:53 +00001690/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1691static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1692 // If we have -mcpu=, use that.
1693 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1694 StringRef CPU = A->getValue();
1695
1696#ifdef __wasm__
1697 // Handle "native" by examining the host. "native" isn't meaningful when
1698 // cross compiling, so only support this when the host is also WebAssembly.
1699 if (CPU == "native")
1700 return llvm::sys::getHostCPUName();
1701#endif
1702
1703 return CPU;
1704 }
1705
1706 return "generic";
1707}
1708
Renato Golin7c542b42015-07-27 23:44:45 +00001709static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1710 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001711 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001712 default:
1713 return "";
1714
Amara Emerson703da2e2013-10-31 09:32:33 +00001715 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001716 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001717 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001718
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001720 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001721 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001722 case llvm::Triple::thumbeb: {
1723 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001724 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001725 return arm::getARMTargetCPU(MCPU, MArch, T);
1726 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001727 case llvm::Triple::mips:
1728 case llvm::Triple::mipsel:
1729 case llvm::Triple::mips64:
1730 case llvm::Triple::mips64el: {
1731 StringRef CPUName;
1732 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001733 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001734 return CPUName;
1735 }
1736
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001737 case llvm::Triple::nvptx:
1738 case llvm::Triple::nvptx64:
1739 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1740 return A->getValue();
1741 return "";
1742
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001743 case llvm::Triple::ppc:
1744 case llvm::Triple::ppc64:
1745 case llvm::Triple::ppc64le: {
1746 std::string TargetCPUName = getPPCTargetCPU(Args);
1747 // LLVM may default to generating code for the native CPU,
1748 // but, like gcc, we default to a more generic option for
1749 // each architecture. (except on Darwin)
1750 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1751 if (T.getArch() == llvm::Triple::ppc64)
1752 TargetCPUName = "ppc64";
1753 else if (T.getArch() == llvm::Triple::ppc64le)
1754 TargetCPUName = "ppc64le";
1755 else
1756 TargetCPUName = "ppc";
1757 }
1758 return TargetCPUName;
1759 }
1760
1761 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001762 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001763 case llvm::Triple::sparcv9:
1764 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001765 return A->getValue();
1766 return "";
1767
1768 case llvm::Triple::x86:
1769 case llvm::Triple::x86_64:
1770 return getX86TargetCPU(Args, T);
1771
1772 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001773 return "hexagon" +
1774 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001775
1776 case llvm::Triple::systemz:
1777 return getSystemZTargetCPU(Args);
1778
1779 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001780 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001781 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001782
1783 case llvm::Triple::wasm32:
1784 case llvm::Triple::wasm64:
1785 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001786 }
1787}
1788
Alp Tokerce365ca2013-12-02 12:43:03 +00001789static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001790 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001791 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1792 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1793 // forward.
1794 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001795 std::string Plugin =
1796 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001797 CmdArgs.push_back(Args.MakeArgString(Plugin));
1798
1799 // Try to pass driver level flags relevant to LTO code generation down to
1800 // the plugin.
1801
1802 // Handle flags for selecting CPU variants.
1803 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1804 if (!CPU.empty())
1805 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001806
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001807 if (IsThinLTO)
1808 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001809}
1810
Sanjay Patel2987c292015-06-11 14:53:41 +00001811/// This is a helper function for validating the optional refinement step
1812/// parameter in reciprocal argument strings. Return false if there is an error
1813/// parsing the refinement step. Otherwise, return true and set the Position
1814/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001815static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001816 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001817 const char RefinementStepToken = ':';
1818 Position = In.find(RefinementStepToken);
1819 if (Position != StringRef::npos) {
1820 StringRef Option = A.getOption().getName();
1821 StringRef RefStep = In.substr(Position + 1);
1822 // Allow exactly one numeric character for the additional refinement
1823 // step parameter. This is reasonable for all currently-supported
1824 // operations and architectures because we would expect that a larger value
1825 // of refinement steps would cause the estimate "optimization" to
1826 // under-perform the native operation. Also, if the estimate does not
1827 // converge quickly, it probably will not ever converge, so further
1828 // refinement steps will not produce a better answer.
1829 if (RefStep.size() != 1) {
1830 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1831 return false;
1832 }
1833 char RefStepChar = RefStep[0];
1834 if (RefStepChar < '0' || RefStepChar > '9') {
1835 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1836 return false;
1837 }
1838 }
1839 return true;
1840}
1841
1842/// The -mrecip flag requires processing of many optional parameters.
1843static void ParseMRecip(const Driver &D, const ArgList &Args,
1844 ArgStringList &OutStrings) {
1845 StringRef DisabledPrefixIn = "!";
1846 StringRef DisabledPrefixOut = "!";
1847 StringRef EnabledPrefixOut = "";
1848 StringRef Out = "-mrecip=";
1849
1850 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1851 if (!A)
1852 return;
1853
1854 unsigned NumOptions = A->getNumValues();
1855 if (NumOptions == 0) {
1856 // No option is the same as "all".
1857 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1858 return;
1859 }
1860
1861 // Pass through "all", "none", or "default" with an optional refinement step.
1862 if (NumOptions == 1) {
1863 StringRef Val = A->getValue(0);
1864 size_t RefStepLoc;
1865 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1866 return;
1867 StringRef ValBase = Val.slice(0, RefStepLoc);
1868 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1869 OutStrings.push_back(Args.MakeArgString(Out + Val));
1870 return;
1871 }
1872 }
1873
1874 // Each reciprocal type may be enabled or disabled individually.
1875 // Check each input value for validity, concatenate them all back together,
1876 // and pass through.
1877
1878 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001879 OptionStrings.insert(std::make_pair("divd", false));
1880 OptionStrings.insert(std::make_pair("divf", false));
1881 OptionStrings.insert(std::make_pair("vec-divd", false));
1882 OptionStrings.insert(std::make_pair("vec-divf", false));
1883 OptionStrings.insert(std::make_pair("sqrtd", false));
1884 OptionStrings.insert(std::make_pair("sqrtf", false));
1885 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1886 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001887
1888 for (unsigned i = 0; i != NumOptions; ++i) {
1889 StringRef Val = A->getValue(i);
1890
1891 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1892 // Ignore the disablement token for string matching.
1893 if (IsDisabled)
1894 Val = Val.substr(1);
1895
1896 size_t RefStep;
1897 if (!getRefinementStep(Val, D, *A, RefStep))
1898 return;
1899
1900 StringRef ValBase = Val.slice(0, RefStep);
1901 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1902 if (OptionIter == OptionStrings.end()) {
1903 // Try again specifying float suffix.
1904 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1905 if (OptionIter == OptionStrings.end()) {
1906 // The input name did not match any known option string.
1907 D.Diag(diag::err_drv_unknown_argument) << Val;
1908 return;
1909 }
1910 // The option was specified without a float or double suffix.
1911 // Make sure that the double entry was not already specified.
1912 // The float entry will be checked below.
1913 if (OptionStrings[ValBase.str() + 'd']) {
1914 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1915 return;
1916 }
1917 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001918
Sanjay Patel2987c292015-06-11 14:53:41 +00001919 if (OptionIter->second == true) {
1920 // Duplicate option specified.
1921 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1922 return;
1923 }
1924
1925 // Mark the matched option as found. Do not allow duplicate specifiers.
1926 OptionIter->second = true;
1927
1928 // If the precision was not specified, also mark the double entry as found.
1929 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1930 OptionStrings[ValBase.str() + 'd'] = true;
1931
1932 // Build the output string.
1933 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1934 Out = Args.MakeArgString(Out + Prefix + Val);
1935 if (i != NumOptions - 1)
1936 Out = Args.MakeArgString(Out + ",");
1937 }
1938
1939 OutStrings.push_back(Args.MakeArgString(Out));
1940}
1941
Eric Christopherc54920a2015-03-23 19:26:05 +00001942static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001943 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001944 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001945 // If -march=native, autodetect the feature list.
1946 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1947 if (StringRef(A->getValue()) == "native") {
1948 llvm::StringMap<bool> HostFeatures;
1949 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1950 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001951 Features.push_back(
1952 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001953 }
1954 }
1955
Jim Grosbach82eee262013-11-16 00:53:35 +00001956 if (Triple.getArchName() == "x86_64h") {
1957 // x86_64h implies quite a few of the more modern subtarget features
1958 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1959 Features.push_back("-rdrnd");
1960 Features.push_back("-aes");
1961 Features.push_back("-pclmul");
1962 Features.push_back("-rtm");
1963 Features.push_back("-hle");
1964 Features.push_back("-fsgsbase");
1965 }
1966
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001967 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001968 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001969 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001970 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001971 Features.push_back("+sse4.2");
1972 Features.push_back("+popcnt");
1973 } else
1974 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001975 }
1976
Eric Christopherc54920a2015-03-23 19:26:05 +00001977 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001978 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1979 StringRef Arch = A->getValue();
1980 bool ArchUsed = false;
1981 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001982 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001983 if (Arch == "AVX" || Arch == "AVX2") {
1984 ArchUsed = true;
1985 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1986 }
1987 }
1988 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001989 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001990 if (Arch == "IA32") {
1991 ArchUsed = true;
1992 } else if (Arch == "SSE" || Arch == "SSE2") {
1993 ArchUsed = true;
1994 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1995 }
1996 }
1997 if (!ArchUsed)
1998 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1999 }
2000
Jim Grosbach82eee262013-11-16 00:53:35 +00002001 // Now add any that the user explicitly requested on the command line,
2002 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00002003 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
2004 StringRef Name = A->getOption().getName();
2005 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002006
2007 // Skip over "-m".
2008 assert(Name.startswith("m") && "Invalid feature name.");
2009 Name = Name.substr(1);
2010
2011 bool IsNegative = Name.startswith("no-");
2012 if (IsNegative)
2013 Name = Name.substr(3);
2014
2015 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2016 }
2017}
2018
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002019void Clang::AddX86TargetArgs(const ArgList &Args,
2020 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002021 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002022 Args.hasArg(options::OPT_mkernel) ||
2023 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002024 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002025
Bob Wilson2616e2e2013-02-10 16:01:41 +00002026 // Default to avoid implicit floating-point for kernel/kext code, but allow
2027 // that to be overridden with -mno-soft-float.
2028 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2029 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 if (Arg *A = Args.getLastArg(
2031 options::OPT_msoft_float, options::OPT_mno_soft_float,
2032 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002033 const Option &O = A->getOption();
2034 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2035 O.matches(options::OPT_msoft_float));
2036 }
2037 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002038 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002039
2040 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2041 StringRef Value = A->getValue();
2042 if (Value == "intel" || Value == "att") {
2043 CmdArgs.push_back("-mllvm");
2044 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2045 } else {
2046 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2047 << A->getOption().getName() << Value;
2048 }
2049 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002050}
2051
Tony Linthicum76329bf2011-12-12 21:14:55 +00002052void Clang::AddHexagonTargetArgs(const ArgList &Args,
2053 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002054 CmdArgs.push_back("-mqdsp6-compat");
2055 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002056
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002057 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2058 std::string N = llvm::utostr(G.getValue());
2059 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002060 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002061 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002062 }
2063
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002064 if (!Args.hasArg(options::OPT_fno_short_enums))
2065 CmdArgs.push_back("-fshort-enums");
2066 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002067 CmdArgs.push_back("-mllvm");
2068 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002069 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002070 CmdArgs.push_back("-mllvm");
2071 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002072}
2073
Kevin Qin110db6f2014-07-18 07:03:22 +00002074// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002075static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002076 std::vector<const char *> &Features) {
2077 SmallVector<StringRef, 8> Split;
2078 text.split(Split, StringRef("+"), -1, false);
2079
Benjamin Kramer72e64312015-09-24 14:48:49 +00002080 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002081 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002082 .Case("fp", "+fp-armv8")
2083 .Case("simd", "+neon")
2084 .Case("crc", "+crc")
2085 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002086 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002087 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002088 .Case("nofp", "-fp-armv8")
2089 .Case("nosimd", "-neon")
2090 .Case("nocrc", "-crc")
2091 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002092 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002093 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002094 .Default(nullptr);
2095 if (result)
2096 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002097 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002098 D.Diag(diag::err_drv_no_neon_modifier);
2099 else
2100 return false;
2101 }
2102 return true;
2103}
2104
2105// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2106// decode CPU and feature.
2107static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2108 std::vector<const char *> &Features) {
2109 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2110 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002111 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Christof Doumaba13ad52015-12-02 12:03:42 +00002112 CPU == "cortex-a72" || CPU == "cortex-a35") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002113 Features.push_back("+neon");
2114 Features.push_back("+crc");
2115 Features.push_back("+crypto");
2116 } else if (CPU == "generic") {
2117 Features.push_back("+neon");
2118 } else {
2119 return false;
2120 }
2121
2122 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2123 return false;
2124
2125 return true;
2126}
2127
2128static bool
2129getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2130 const ArgList &Args,
2131 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002132 std::string MarchLowerCase = March.lower();
2133 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002134
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002135 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002136 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002137 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002138 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002139 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2140 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002141 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002142 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002143 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002144
2145 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2146 return false;
2147
2148 return true;
2149}
2150
2151static bool
2152getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2153 const ArgList &Args,
2154 std::vector<const char *> &Features) {
2155 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002156 std::string McpuLowerCase = Mcpu.lower();
2157 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002158 return false;
2159
2160 return true;
2161}
2162
2163static bool
2164getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2165 const ArgList &Args,
2166 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002167 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002168 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002169 if (MtuneLowerCase == "native")
2170 MtuneLowerCase = llvm::sys::getHostCPUName();
2171 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002172 Features.push_back("+zcm");
2173 Features.push_back("+zcz");
2174 }
2175 return true;
2176}
2177
2178static bool
2179getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2180 const ArgList &Args,
2181 std::vector<const char *> &Features) {
2182 StringRef CPU;
2183 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002184 std::string McpuLowerCase = Mcpu.lower();
2185 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002186 return false;
2187
2188 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2189}
2190
Justin Bognerf9052562015-11-13 23:07:31 +00002191static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002192 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002193 Arg *A;
2194 bool success = true;
2195 // Enable NEON by default.
2196 Features.push_back("+neon");
2197 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2198 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2199 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2200 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002201 else if (Args.hasArg(options::OPT_arch))
2202 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2203 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002204
2205 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2206 success =
2207 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2208 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2209 success =
2210 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002211 else if (Args.hasArg(options::OPT_arch))
2212 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2213 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002214
2215 if (!success)
2216 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002217
2218 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2219 Features.push_back("-fp-armv8");
2220 Features.push_back("-crypto");
2221 Features.push_back("-neon");
2222 }
Bradley Smith418c5932014-05-02 15:17:51 +00002223
2224 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002225 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002226 if (A->getOption().matches(options::OPT_mcrc))
2227 Features.push_back("+crc");
2228 else
2229 Features.push_back("-crc");
2230 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002231
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002232 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2233 options::OPT_munaligned_access))
2234 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2235 Features.push_back("+strict-align");
2236
Justin Bognerf9052562015-11-13 23:07:31 +00002237 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002238 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002239}
2240
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002241static void getHexagonTargetFeatures(const ArgList &Args,
2242 std::vector<const char *> &Features) {
2243 bool HasHVX = false, HasHVXD = false;
2244
2245 for (auto &A : Args) {
2246 auto &Opt = A->getOption();
2247 if (Opt.matches(options::OPT_mhexagon_hvx))
2248 HasHVX = true;
2249 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2250 HasHVXD = HasHVX = false;
2251 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2252 HasHVXD = HasHVX = true;
2253 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2254 HasHVXD = false;
2255 else
2256 continue;
2257 A->claim();
2258 }
2259
2260 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2261 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2262}
2263
Dan Gohmanc2853072015-09-03 22:51:53 +00002264static void getWebAssemblyTargetFeatures(const ArgList &Args,
2265 std::vector<const char *> &Features) {
2266 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2267 StringRef Name = A->getOption().getName();
2268 A->claim();
2269
2270 // Skip over "-m".
2271 assert(Name.startswith("m") && "Invalid feature name.");
2272 Name = Name.substr(1);
2273
2274 bool IsNegative = Name.startswith("no-");
2275 if (IsNegative)
2276 Name = Name.substr(3);
2277
2278 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2279 }
2280}
2281
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002282static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002283 const ArgList &Args, ArgStringList &CmdArgs,
2284 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002285 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002286 std::vector<const char *> Features;
2287 switch (Triple.getArch()) {
2288 default:
2289 break;
2290 case llvm::Triple::mips:
2291 case llvm::Triple::mipsel:
2292 case llvm::Triple::mips64:
2293 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002294 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002295 break;
2296
2297 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002298 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002299 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002300 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002301 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002302 break;
2303
2304 case llvm::Triple::ppc:
2305 case llvm::Triple::ppc64:
2306 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002307 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002308 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002309 case llvm::Triple::systemz:
2310 getSystemZTargetFeatures(Args, Features);
2311 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002312 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002313 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002314 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002315 break;
2316 case llvm::Triple::x86:
2317 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002318 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002319 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002320 case llvm::Triple::hexagon:
2321 getHexagonTargetFeatures(Args, Features);
2322 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002323 case llvm::Triple::wasm32:
2324 case llvm::Triple::wasm64:
2325 getWebAssemblyTargetFeatures(Args, Features);
2326 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002327 }
Rafael Espindola43964802013-08-21 17:34:32 +00002328
2329 // Find the last of each feature.
2330 llvm::StringMap<unsigned> LastOpt;
2331 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2332 const char *Name = Features[I];
2333 assert(Name[0] == '-' || Name[0] == '+');
2334 LastOpt[Name + 1] = I;
2335 }
2336
2337 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2338 // If this feature was overridden, ignore it.
2339 const char *Name = Features[I];
2340 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2341 assert(LastI != LastOpt.end());
2342 unsigned Last = LastI->second;
2343 if (Last != I)
2344 continue;
2345
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002346 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002347 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002348 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002349}
2350
David Majnemerae394812014-12-09 00:12:30 +00002351static bool
2352shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2353 const llvm::Triple &Triple) {
2354 // We use the zero-cost exception tables for Objective-C if the non-fragile
2355 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2356 // later.
2357 if (runtime.isNonFragile())
2358 return true;
2359
2360 if (!Triple.isMacOSX())
2361 return false;
2362
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002363 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002364 (Triple.getArch() == llvm::Triple::x86_64 ||
2365 Triple.getArch() == llvm::Triple::arm));
2366}
2367
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002368/// Adds exception related arguments to the driver command arguments. There's a
2369/// master flag, -fexceptions and also language specific flags to enable/disable
2370/// C++ and Objective-C exceptions. This makes it possible to for example
2371/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002372static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002373 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002374 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002375 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002376 const Driver &D = TC.getDriver();
2377 const llvm::Triple &Triple = TC.getTriple();
2378
Chad Rosier4fab82c2012-03-26 22:04:46 +00002379 if (KernelOrKext) {
2380 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2381 // arguments now to avoid warnings about unused arguments.
2382 Args.ClaimAllArgs(options::OPT_fexceptions);
2383 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2384 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2385 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2386 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2387 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002388 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002389 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002390
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002391 // See if the user explicitly enabled exceptions.
2392 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2393 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002394
David Majnemerae394812014-12-09 00:12:30 +00002395 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2396 // is not necessarily sensible, but follows GCC.
2397 if (types::isObjC(InputType) &&
2398 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002399 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002400 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002401
David Majnemerae394812014-12-09 00:12:30 +00002402 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002403 }
2404
2405 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002406 // Disable C++ EH by default on XCore, PS4, and MSVC.
2407 // FIXME: Remove MSVC from this list once things work.
2408 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2409 !Triple.isPS4CPU() &&
2410 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002411 Arg *ExceptionArg = Args.getLastArg(
2412 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2413 options::OPT_fexceptions, options::OPT_fno_exceptions);
2414 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002415 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002416 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2417 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002418
2419 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002420 if (Triple.isPS4CPU()) {
2421 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2422 assert(ExceptionArg &&
2423 "On the PS4 exceptions should only be enabled if passing "
2424 "an argument");
2425 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2426 const Arg *RTTIArg = TC.getRTTIArg();
2427 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2428 D.Diag(diag::err_drv_argument_not_allowed_with)
2429 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2430 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2431 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2432 } else
2433 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2434
Anders Carlssone96ab552011-02-28 02:27:16 +00002435 CmdArgs.push_back("-fcxx-exceptions");
2436
David Majnemer8de68642014-12-05 08:11:58 +00002437 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002438 }
2439 }
2440
David Majnemer8de68642014-12-05 08:11:58 +00002441 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002442 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002443}
2444
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002445static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002446 bool Default = true;
2447 if (TC.getTriple().isOSDarwin()) {
2448 // The native darwin assembler doesn't support the linker_option directives,
2449 // so we disable them if we think the .s file will be passed to it.
2450 Default = TC.useIntegratedAs();
2451 }
2452 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2453 Default);
2454}
2455
Ted Kremenek62093662013-03-12 17:02:12 +00002456static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2457 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002458 bool UseDwarfDirectory =
2459 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2460 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002461 return !UseDwarfDirectory;
2462}
2463
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002464/// \brief Check whether the given input tree contains any compilation actions.
2465static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002466 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002467 return true;
2468
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002469 for (const auto &Act : *A)
2470 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002471 return true;
2472
2473 return false;
2474}
2475
2476/// \brief Check if -relax-all should be passed to the internal assembler.
2477/// This is done by default when compiling non-assembler source with -O0.
2478static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2479 bool RelaxDefault = true;
2480
2481 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2482 RelaxDefault = A->getOption().matches(options::OPT_O0);
2483
2484 if (RelaxDefault) {
2485 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002486 for (const auto &Act : C.getActions()) {
2487 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002488 RelaxDefault = true;
2489 break;
2490 }
2491 }
2492 }
2493
2494 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002495 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002496}
2497
Douglas Katzman3459ce22015-10-08 04:24:12 +00002498// Extract the integer N from a string spelled "-dwarf-N", returning 0
2499// on mismatch. The StringRef input (rather than an Arg) allows
2500// for use by the "-Xassembler" option parser.
2501static unsigned DwarfVersionNum(StringRef ArgValue) {
2502 return llvm::StringSwitch<unsigned>(ArgValue)
2503 .Case("-gdwarf-2", 2)
2504 .Case("-gdwarf-3", 3)
2505 .Case("-gdwarf-4", 4)
2506 .Default(0);
2507}
2508
2509static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2510 CodeGenOptions::DebugInfoKind DebugInfoKind,
2511 unsigned DwarfVersion) {
2512 switch (DebugInfoKind) {
2513 case CodeGenOptions::DebugLineTablesOnly:
2514 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2515 break;
2516 case CodeGenOptions::LimitedDebugInfo:
2517 CmdArgs.push_back("-debug-info-kind=limited");
2518 break;
2519 case CodeGenOptions::FullDebugInfo:
2520 CmdArgs.push_back("-debug-info-kind=standalone");
2521 break;
2522 default:
2523 break;
2524 }
2525 if (DwarfVersion > 0)
2526 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002527 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002528}
2529
David Blaikie9260ed62013-07-25 21:19:01 +00002530static void CollectArgsForIntegratedAssembler(Compilation &C,
2531 const ArgList &Args,
2532 ArgStringList &CmdArgs,
2533 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002534 if (UseRelaxAll(C, Args))
2535 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002536
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002537 // When passing -I arguments to the assembler we sometimes need to
2538 // unconditionally take the next argument. For example, when parsing
2539 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2540 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2541 // arg after parsing the '-I' arg.
2542 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002543
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002544 // When using an integrated assembler, translate -Wa, and -Xassembler
2545 // options.
2546 bool CompressDebugSections = false;
2547 for (const Arg *A :
2548 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2549 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002550
Benjamin Kramer72e64312015-09-24 14:48:49 +00002551 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002552 if (TakeNextArg) {
2553 CmdArgs.push_back(Value.data());
2554 TakeNextArg = false;
2555 continue;
2556 }
David Blaikie9260ed62013-07-25 21:19:01 +00002557
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002558 switch (C.getDefaultToolChain().getArch()) {
2559 default:
2560 break;
2561 case llvm::Triple::mips:
2562 case llvm::Triple::mipsel:
2563 case llvm::Triple::mips64:
2564 case llvm::Triple::mips64el:
2565 if (Value == "--trap") {
2566 CmdArgs.push_back("-target-feature");
2567 CmdArgs.push_back("+use-tcc-in-div");
2568 continue;
2569 }
2570 if (Value == "--break") {
2571 CmdArgs.push_back("-target-feature");
2572 CmdArgs.push_back("-use-tcc-in-div");
2573 continue;
2574 }
2575 if (Value.startswith("-msoft-float")) {
2576 CmdArgs.push_back("-target-feature");
2577 CmdArgs.push_back("+soft-float");
2578 continue;
2579 }
2580 if (Value.startswith("-mhard-float")) {
2581 CmdArgs.push_back("-target-feature");
2582 CmdArgs.push_back("-soft-float");
2583 continue;
2584 }
2585 break;
2586 }
2587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002588 if (Value == "-force_cpusubtype_ALL") {
2589 // Do nothing, this is the default and we don't support anything else.
2590 } else if (Value == "-L") {
2591 CmdArgs.push_back("-msave-temp-labels");
2592 } else if (Value == "--fatal-warnings") {
2593 CmdArgs.push_back("-massembler-fatal-warnings");
2594 } else if (Value == "--noexecstack") {
2595 CmdArgs.push_back("-mnoexecstack");
2596 } else if (Value == "-compress-debug-sections" ||
2597 Value == "--compress-debug-sections") {
2598 CompressDebugSections = true;
2599 } else if (Value == "-nocompress-debug-sections" ||
2600 Value == "--nocompress-debug-sections") {
2601 CompressDebugSections = false;
2602 } else if (Value.startswith("-I")) {
2603 CmdArgs.push_back(Value.data());
2604 // We need to consume the next argument if the current arg is a plain
2605 // -I. The next arg will be the include directory.
2606 if (Value == "-I")
2607 TakeNextArg = true;
2608 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002609 // "-gdwarf-N" options are not cc1as options.
2610 unsigned DwarfVersion = DwarfVersionNum(Value);
2611 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2612 CmdArgs.push_back(Value.data());
2613 } else {
2614 RenderDebugEnablingArgs(
2615 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2616 }
Renato Golin7c542b42015-07-27 23:44:45 +00002617 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2618 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2619 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002620 } else {
2621 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002622 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002623 }
2624 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002625 }
2626 if (CompressDebugSections) {
2627 if (llvm::zlib::isAvailable())
2628 CmdArgs.push_back("-compress-debug-sections");
2629 else
2630 D.Diag(diag::warn_debug_compression_unavailable);
2631 }
David Blaikie9260ed62013-07-25 21:19:01 +00002632}
2633
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002634// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002635// FIXME: Make sure we can also emit shared objects if they're requested
2636// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002637static void addClangRT(const ToolChain &TC, const ArgList &Args,
2638 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002639 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002640}
2641
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002642namespace {
2643enum OpenMPRuntimeKind {
2644 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2645 /// without knowing what runtime to target.
2646 OMPRT_Unknown,
2647
2648 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2649 /// the default for Clang.
2650 OMPRT_OMP,
2651
2652 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2653 /// this runtime but can swallow the pragmas, and find and link against the
2654 /// runtime library itself.
2655 OMPRT_GOMP,
2656
Chandler Carruthc6625c62015-05-28 21:10:31 +00002657 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002658 /// OpenMP runtime. We support this mode for users with existing dependencies
2659 /// on this runtime library name.
2660 OMPRT_IOMP5
2661};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002662}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002663
2664/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002665static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2666 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002667 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2668
2669 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2670 if (A)
2671 RuntimeName = A->getValue();
2672
2673 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002674 .Case("libomp", OMPRT_OMP)
2675 .Case("libgomp", OMPRT_GOMP)
2676 .Case("libiomp5", OMPRT_IOMP5)
2677 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002678
2679 if (RT == OMPRT_Unknown) {
2680 if (A)
2681 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002682 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002683 else
2684 // FIXME: We could use a nicer diagnostic here.
2685 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2686 }
2687
2688 return RT;
2689}
2690
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002691static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2692 const ArgList &Args) {
2693 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2694 options::OPT_fno_openmp, false))
2695 return;
2696
2697 switch (getOpenMPRuntime(TC, Args)) {
2698 case OMPRT_OMP:
2699 CmdArgs.push_back("-lomp");
2700 break;
2701 case OMPRT_GOMP:
2702 CmdArgs.push_back("-lgomp");
2703 break;
2704 case OMPRT_IOMP5:
2705 CmdArgs.push_back("-liomp5");
2706 break;
2707 case OMPRT_Unknown:
2708 // Already diagnosed.
2709 break;
2710 }
2711}
2712
Alexey Samsonov52550342014-09-15 19:58:40 +00002713static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2714 ArgStringList &CmdArgs, StringRef Sanitizer,
2715 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002716 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002717 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002718 if (!IsShared) CmdArgs.push_back("-whole-archive");
2719 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2720 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002721}
2722
Alexey Samsonov52550342014-09-15 19:58:40 +00002723// Tries to use a file with the list of dynamic symbols that need to be exported
2724// from the runtime library. Returns true if the file was found.
2725static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2726 ArgStringList &CmdArgs,
2727 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002728 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002729 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2730 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002731 return true;
2732 }
2733 return false;
2734}
2735
2736static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2737 ArgStringList &CmdArgs) {
2738 // Force linking against the system libraries sanitizers depends on
2739 // (see PR15823 why this is necessary).
2740 CmdArgs.push_back("--no-as-needed");
2741 CmdArgs.push_back("-lpthread");
2742 CmdArgs.push_back("-lrt");
2743 CmdArgs.push_back("-lm");
2744 // There's no libdl on FreeBSD.
2745 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2746 CmdArgs.push_back("-ldl");
2747}
2748
2749static void
2750collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2751 SmallVectorImpl<StringRef> &SharedRuntimes,
2752 SmallVectorImpl<StringRef> &StaticRuntimes,
2753 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2754 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2755 // Collect shared runtimes.
2756 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2757 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002758 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002759
Alexey Samsonov52550342014-09-15 19:58:40 +00002760 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002761 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002762 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002763 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002764 }
2765 if (SanArgs.needsAsanRt()) {
2766 if (SanArgs.needsSharedAsanRt()) {
2767 HelperStaticRuntimes.push_back("asan-preinit");
2768 } else {
2769 StaticRuntimes.push_back("asan");
2770 if (SanArgs.linkCXXRuntimes())
2771 StaticRuntimes.push_back("asan_cxx");
2772 }
2773 }
2774 if (SanArgs.needsDfsanRt())
2775 StaticRuntimes.push_back("dfsan");
2776 if (SanArgs.needsLsanRt())
2777 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002778 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002779 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002780 if (SanArgs.linkCXXRuntimes())
2781 StaticRuntimes.push_back("msan_cxx");
2782 }
2783 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002784 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002785 if (SanArgs.linkCXXRuntimes())
2786 StaticRuntimes.push_back("tsan_cxx");
2787 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002788 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002789 StaticRuntimes.push_back("ubsan_standalone");
2790 if (SanArgs.linkCXXRuntimes())
2791 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002792 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002793 if (SanArgs.needsSafeStackRt())
2794 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002795 if (SanArgs.needsCfiRt())
2796 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002797 if (SanArgs.needsCfiDiagRt())
2798 StaticRuntimes.push_back("cfi_diag");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002799}
2800
Alexey Samsonov52550342014-09-15 19:58:40 +00002801// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2802// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2803static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002804 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002805 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2806 HelperStaticRuntimes;
2807 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2808 HelperStaticRuntimes);
2809 for (auto RT : SharedRuntimes)
2810 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2811 for (auto RT : HelperStaticRuntimes)
2812 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2813 bool AddExportDynamic = false;
2814 for (auto RT : StaticRuntimes) {
2815 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2816 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2817 }
2818 // If there is a static runtime with no dynamic list, force all the symbols
2819 // to be dynamic to be sure we export sanitizer interface functions.
2820 if (AddExportDynamic)
2821 CmdArgs.push_back("-export-dynamic");
2822 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002823}
2824
Reid Kleckner86ea7702015-02-04 23:45:07 +00002825static bool areOptimizationsEnabled(const ArgList &Args) {
2826 // Find the last -O arg and see if it is non-zero.
2827 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2828 return !A->getOption().matches(options::OPT_O0);
2829 // Defaults to -O0.
2830 return false;
2831}
2832
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002833static bool shouldUseFramePointerForTarget(const ArgList &Args,
2834 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002835 switch (Triple.getArch()) {
2836 case llvm::Triple::xcore:
2837 case llvm::Triple::wasm32:
2838 case llvm::Triple::wasm64:
2839 // XCore never wants frame pointers, regardless of OS.
2840 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002841 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002842 default:
2843 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002844 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002845
2846 if (Triple.isOSLinux()) {
2847 switch (Triple.getArch()) {
2848 // Don't use a frame pointer on linux if optimizing for certain targets.
2849 case llvm::Triple::mips64:
2850 case llvm::Triple::mips64el:
2851 case llvm::Triple::mips:
2852 case llvm::Triple::mipsel:
2853 case llvm::Triple::systemz:
2854 case llvm::Triple::x86:
2855 case llvm::Triple::x86_64:
2856 return !areOptimizationsEnabled(Args);
2857 default:
2858 return true;
2859 }
2860 }
2861
2862 if (Triple.isOSWindows()) {
2863 switch (Triple.getArch()) {
2864 case llvm::Triple::x86:
2865 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002866 case llvm::Triple::arm:
2867 case llvm::Triple::thumb:
2868 // Windows on ARM builds with FPO disabled to aid fast stack walking
2869 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002870 default:
2871 // All other supported Windows ISAs use xdata unwind information, so frame
2872 // pointers are not generally useful.
2873 return false;
2874 }
2875 }
2876
2877 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002878}
2879
Rafael Espindola224dd632011-12-14 21:02:23 +00002880static bool shouldUseFramePointer(const ArgList &Args,
2881 const llvm::Triple &Triple) {
2882 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2883 options::OPT_fomit_frame_pointer))
2884 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002885 if (Args.hasArg(options::OPT_pg))
2886 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002887
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002888 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002889}
2890
Eric Christopherb7d97e92013-04-03 01:58:53 +00002891static bool shouldUseLeafFramePointer(const ArgList &Args,
2892 const llvm::Triple &Triple) {
2893 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2894 options::OPT_momit_leaf_frame_pointer))
2895 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002896 if (Args.hasArg(options::OPT_pg))
2897 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002898
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002899 if (Triple.isPS4CPU())
2900 return false;
2901
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002902 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002903}
2904
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002905/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002906static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002907 SmallString<128> cwd;
2908 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002909 CmdArgs.push_back("-fdebug-compilation-dir");
2910 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002911 }
2912}
2913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002914static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002915 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2916 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2917 SmallString<128> T(FinalOutput->getValue());
2918 llvm::sys::path::replace_extension(T, "dwo");
2919 return Args.MakeArgString(T);
2920 } else {
2921 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002922 SmallString<128> T(
2923 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002924 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002925 llvm::sys::path::replace_extension(F, "dwo");
2926 T += F;
2927 return Args.MakeArgString(F);
2928 }
2929}
2930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002931static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2932 const JobAction &JA, const ArgList &Args,
2933 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002934 ArgStringList ExtractArgs;
2935 ExtractArgs.push_back("--extract-dwo");
2936
2937 ArgStringList StripArgs;
2938 StripArgs.push_back("--strip-dwo");
2939
2940 // Grabbing the output of the earlier compile step.
2941 StripArgs.push_back(Output.getFilename());
2942 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002943 ExtractArgs.push_back(OutFile);
2944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002945 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002946 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002947
2948 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002949 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002950
2951 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002952 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002953}
2954
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002955/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002956/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2957static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002958 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002959 if (A->getOption().matches(options::OPT_O4) ||
2960 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002961 return true;
2962
2963 if (A->getOption().matches(options::OPT_O0))
2964 return false;
2965
2966 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2967
Rafael Espindola91780de2013-08-26 14:05:41 +00002968 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002969 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002970 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002971 return true;
2972
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002973 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002974 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002975 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002976
2977 unsigned OptLevel = 0;
2978 if (S.getAsInteger(10, OptLevel))
2979 return false;
2980
2981 return OptLevel > 1;
2982 }
2983
2984 return false;
2985}
2986
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002987/// Add -x lang to \p CmdArgs for \p Input.
2988static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2989 ArgStringList &CmdArgs) {
2990 // When using -verify-pch, we don't want to provide the type
2991 // 'precompiled-header' if it was inferred from the file extension
2992 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2993 return;
2994
2995 CmdArgs.push_back("-x");
2996 if (Args.hasArg(options::OPT_rewrite_objc))
2997 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2998 else
2999 CmdArgs.push_back(types::getTypeName(Input.getType()));
3000}
3001
David Majnemerc371ff02015-03-22 08:39:22 +00003002static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003003 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003004 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003005
3006 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003007 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003008
3009 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003010 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003011 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003012 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003013}
3014
Rafael Espindola577637a2015-01-03 00:06:04 +00003015// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003016// options that build systems might add but are unused when assembling or only
3017// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003018static void claimNoWarnArgs(const ArgList &Args) {
3019 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003020 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003021 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003022 Args.ClaimAllArgs(options::OPT_flto);
3023 Args.ClaimAllArgs(options::OPT_fno_lto);
3024}
3025
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003026static void appendUserToPath(SmallVectorImpl<char> &Result) {
3027#ifdef LLVM_ON_UNIX
3028 const char *Username = getenv("LOGNAME");
3029#else
3030 const char *Username = getenv("USERNAME");
3031#endif
3032 if (Username) {
3033 // Validate that LoginName can be used in a path, and get its length.
3034 size_t Len = 0;
3035 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003036 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003037 Username = nullptr;
3038 break;
3039 }
3040 }
3041
3042 if (Username && Len > 0) {
3043 Result.append(Username, Username + Len);
3044 return;
3045 }
3046 }
3047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003048// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003049#ifdef LLVM_ON_UNIX
3050 std::string UID = llvm::utostr(getuid());
3051#else
3052 // FIXME: Windows seems to have an 'SID' that might work.
3053 std::string UID = "9999";
3054#endif
3055 Result.append(UID.begin(), UID.end());
3056}
3057
David Majnemere11d3732015-06-08 00:22:46 +00003058VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3059 const llvm::Triple &Triple,
3060 const llvm::opt::ArgList &Args,
3061 bool IsWindowsMSVC) {
3062 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3063 IsWindowsMSVC) ||
3064 Args.hasArg(options::OPT_fmsc_version) ||
3065 Args.hasArg(options::OPT_fms_compatibility_version)) {
3066 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3067 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003068 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003069
3070 if (MSCVersion && MSCompatibilityVersion) {
3071 if (D)
3072 D->Diag(diag::err_drv_argument_not_allowed_with)
3073 << MSCVersion->getAsString(Args)
3074 << MSCompatibilityVersion->getAsString(Args);
3075 return VersionTuple();
3076 }
3077
3078 if (MSCompatibilityVersion) {
3079 VersionTuple MSVT;
3080 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3081 D->Diag(diag::err_drv_invalid_value)
3082 << MSCompatibilityVersion->getAsString(Args)
3083 << MSCompatibilityVersion->getValue();
3084 return MSVT;
3085 }
3086
3087 if (MSCVersion) {
3088 unsigned Version = 0;
3089 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3090 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3091 << MSCVersion->getValue();
3092 return getMSCompatibilityVersion(Version);
3093 }
3094
3095 unsigned Major, Minor, Micro;
3096 Triple.getEnvironmentVersion(Major, Minor, Micro);
3097 if (Major || Minor || Micro)
3098 return VersionTuple(Major, Minor, Micro);
3099
3100 return VersionTuple(18);
3101 }
3102 return VersionTuple();
3103}
3104
Diego Novilloa0545962015-07-10 18:00:07 +00003105static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3106 const InputInfo &Output, const ArgList &Args,
3107 ArgStringList &CmdArgs) {
3108 auto *ProfileGenerateArg = Args.getLastArg(
3109 options::OPT_fprofile_instr_generate,
3110 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003111 options::OPT_fprofile_generate_EQ,
3112 options::OPT_fno_profile_instr_generate);
3113 if (ProfileGenerateArg &&
3114 ProfileGenerateArg->getOption().matches(
3115 options::OPT_fno_profile_instr_generate))
3116 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003117
3118 auto *ProfileUseArg = Args.getLastArg(
3119 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003120 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3121 options::OPT_fno_profile_instr_use);
3122 if (ProfileUseArg &&
3123 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3124 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003125
3126 if (ProfileGenerateArg && ProfileUseArg)
3127 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003128 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003129
Diego Novillo758f3f52015-08-05 21:49:51 +00003130 if (ProfileGenerateArg) {
3131 if (ProfileGenerateArg->getOption().matches(
3132 options::OPT_fprofile_instr_generate_EQ))
3133 ProfileGenerateArg->render(Args, CmdArgs);
3134 else if (ProfileGenerateArg->getOption().matches(
3135 options::OPT_fprofile_generate_EQ)) {
3136 SmallString<128> Path(ProfileGenerateArg->getValue());
3137 llvm::sys::path::append(Path, "default.profraw");
3138 CmdArgs.push_back(
3139 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3140 } else
3141 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3142 }
Diego Novilloa0545962015-07-10 18:00:07 +00003143
Diego Novillo758f3f52015-08-05 21:49:51 +00003144 if (ProfileUseArg) {
3145 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3146 ProfileUseArg->render(Args, CmdArgs);
3147 else if ((ProfileUseArg->getOption().matches(
3148 options::OPT_fprofile_use_EQ) ||
3149 ProfileUseArg->getOption().matches(
3150 options::OPT_fprofile_instr_use))) {
3151 SmallString<128> Path(
3152 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3153 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3154 llvm::sys::path::append(Path, "default.profdata");
3155 CmdArgs.push_back(
3156 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3157 }
Diego Novilloa0545962015-07-10 18:00:07 +00003158 }
3159
3160 if (Args.hasArg(options::OPT_ftest_coverage) ||
3161 Args.hasArg(options::OPT_coverage))
3162 CmdArgs.push_back("-femit-coverage-notes");
3163 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3164 false) ||
3165 Args.hasArg(options::OPT_coverage))
3166 CmdArgs.push_back("-femit-coverage-data");
3167
Diego Novilloc4b94da2015-08-05 23:27:40 +00003168 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3169 options::OPT_fno_coverage_mapping, false) &&
3170 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003171 D.Diag(diag::err_drv_argument_only_allowed_with)
3172 << "-fcoverage-mapping"
3173 << "-fprofile-instr-generate";
3174
Diego Novilloc4b94da2015-08-05 23:27:40 +00003175 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3176 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003177 CmdArgs.push_back("-fcoverage-mapping");
3178
3179 if (C.getArgs().hasArg(options::OPT_c) ||
3180 C.getArgs().hasArg(options::OPT_S)) {
3181 if (Output.isFilename()) {
3182 CmdArgs.push_back("-coverage-file");
3183 SmallString<128> CoverageFilename;
3184 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3185 CoverageFilename = FinalOutput->getValue();
3186 } else {
3187 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3188 }
3189 if (llvm::sys::path::is_relative(CoverageFilename)) {
3190 SmallString<128> Pwd;
3191 if (!llvm::sys::fs::current_path(Pwd)) {
3192 llvm::sys::path::append(Pwd, CoverageFilename);
3193 CoverageFilename.swap(Pwd);
3194 }
3195 }
3196 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3197 }
3198 }
3199}
3200
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003201/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3202/// smooshes them together with platform defaults, to decide whether
3203/// this compile should be using PIC mode or not. Returns a tuple of
3204/// (RelocationModel, PICLevel, IsPIE).
3205static std::tuple<llvm::Reloc::Model, unsigned, bool>
3206ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3207 const ArgList &Args) {
3208 // FIXME: why does this code...and so much everywhere else, use both
3209 // ToolChain.getTriple() and Triple?
3210 bool PIE = ToolChain.isPIEDefault();
3211 bool PIC = PIE || ToolChain.isPICDefault();
3212 bool IsPICLevelTwo = PIC;
3213
3214 bool KernelOrKext =
3215 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3216
3217 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003218 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003219 switch (ToolChain.getArch()) {
3220 case llvm::Triple::arm:
3221 case llvm::Triple::armeb:
3222 case llvm::Triple::thumb:
3223 case llvm::Triple::thumbeb:
3224 case llvm::Triple::aarch64:
3225 case llvm::Triple::mips:
3226 case llvm::Triple::mipsel:
3227 case llvm::Triple::mips64:
3228 case llvm::Triple::mips64el:
3229 PIC = true; // "-fpic"
3230 break;
3231
3232 case llvm::Triple::x86:
3233 case llvm::Triple::x86_64:
3234 PIC = true; // "-fPIC"
3235 IsPICLevelTwo = true;
3236 break;
3237
3238 default:
3239 break;
3240 }
3241 }
3242
3243 // OpenBSD-specific defaults for PIE
3244 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3245 switch (ToolChain.getArch()) {
3246 case llvm::Triple::mips64:
3247 case llvm::Triple::mips64el:
3248 case llvm::Triple::sparcel:
3249 case llvm::Triple::x86:
3250 case llvm::Triple::x86_64:
3251 IsPICLevelTwo = false; // "-fpie"
3252 break;
3253
3254 case llvm::Triple::ppc:
3255 case llvm::Triple::sparc:
3256 case llvm::Triple::sparcv9:
3257 IsPICLevelTwo = true; // "-fPIE"
3258 break;
3259
3260 default:
3261 break;
3262 }
3263 }
3264
3265 // The last argument relating to either PIC or PIE wins, and no
3266 // other argument is used. If the last argument is any flavor of the
3267 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3268 // option implicitly enables PIC at the same level.
3269 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3270 options::OPT_fpic, options::OPT_fno_pic,
3271 options::OPT_fPIE, options::OPT_fno_PIE,
3272 options::OPT_fpie, options::OPT_fno_pie);
3273 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3274 // is forced, then neither PIC nor PIE flags will have no effect.
3275 if (!ToolChain.isPICDefaultForced()) {
3276 if (LastPICArg) {
3277 Option O = LastPICArg->getOption();
3278 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3279 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3280 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3281 PIC =
3282 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3283 IsPICLevelTwo =
3284 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3285 } else {
3286 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003287 if (Triple.isPS4CPU()) {
3288 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3289 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3290 if (Model != "kernel") {
3291 PIC = true;
3292 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3293 << LastPICArg->getSpelling();
3294 }
3295 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003296 }
3297 }
3298 }
3299
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003300 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3301 // PIC level would've been set to level 1, force it back to level 2 PIC
3302 // instead.
3303 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003304 IsPICLevelTwo |= ToolChain.isPICDefault();
3305
James Y Knightc4015d32015-08-21 04:14:55 +00003306 // This kernel flags are a trump-card: they will disable PIC/PIE
3307 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003308 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3309 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003310 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003311
3312 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3313 // This is a very special mode. It trumps the other modes, almost no one
3314 // uses it, and it isn't even valid on any OS but Darwin.
3315 if (!ToolChain.getTriple().isOSDarwin())
3316 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3317 << A->getSpelling() << ToolChain.getTriple().str();
3318
3319 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3320
3321 // Only a forced PIC mode can cause the actual compile to have PIC defines
3322 // etc., no flags are sufficient. This behavior was selected to closely
3323 // match that of llvm-gcc and Apple GCC before that.
3324 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3325
3326 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3327 }
3328
3329 if (PIC)
3330 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3331
3332 return std::make_tuple(llvm::Reloc::Static, 0, false);
3333}
3334
3335static const char *RelocationModelName(llvm::Reloc::Model Model) {
3336 switch (Model) {
3337 case llvm::Reloc::Default:
3338 return nullptr;
3339 case llvm::Reloc::Static:
3340 return "static";
3341 case llvm::Reloc::PIC_:
3342 return "pic";
3343 case llvm::Reloc::DynamicNoPIC:
3344 return "dynamic-no-pic";
3345 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003346 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003347}
3348
3349static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3350 ArgStringList &CmdArgs) {
3351 llvm::Reloc::Model RelocationModel;
3352 unsigned PICLevel;
3353 bool IsPIE;
3354 std::tie(RelocationModel, PICLevel, IsPIE) =
3355 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3356
3357 if (RelocationModel != llvm::Reloc::Static)
3358 CmdArgs.push_back("-KPIC");
3359}
3360
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003361void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003362 const InputInfo &Output, const InputInfoList &Inputs,
3363 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003364 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3365 const llvm::Triple Triple(TripleStr);
3366
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003367 bool KernelOrKext =
3368 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003369 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003370 ArgStringList CmdArgs;
3371
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003372 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003373 bool IsWindowsCygnus =
3374 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003375 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003376 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003377
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003378 // Check number of inputs for sanity. We need at least one input.
3379 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003380 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003381 // CUDA compilation may have multiple inputs (source file + results of
3382 // device-side compilations). All other jobs are expected to have exactly one
3383 // input.
3384 bool IsCuda = types::isCuda(Input.getType());
3385 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003386
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003387 // Invoke ourselves in -cc1 mode.
3388 //
3389 // FIXME: Implement custom jobs for internal actions.
3390 CmdArgs.push_back("-cc1");
3391
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003392 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003393 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003394 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003395
Artem Belevichfa11ab52015-11-17 22:28:46 +00003396 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003397 if (IsCuda) {
3398 // FIXME: We need a (better) way to pass information about
3399 // particular compilation pass we're constructing here. For now we
3400 // can check which toolchain we're using and pick the other one to
3401 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003402 if (&getToolChain() == C.getCudaDeviceToolChain())
3403 AuxToolChain = C.getCudaHostToolChain();
3404 else if (&getToolChain() == C.getCudaHostToolChain())
3405 AuxToolChain = C.getCudaDeviceToolChain();
3406 else
3407 llvm_unreachable("Can't figure out CUDA compilation mode.");
3408 assert(AuxToolChain != nullptr && "No aux toolchain.");
3409 CmdArgs.push_back("-aux-triple");
3410 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003411 CmdArgs.push_back("-fcuda-target-overloads");
3412 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003413 }
3414
James Y Knight2db38f32015-08-15 03:45:25 +00003415 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3416 Triple.getArch() == llvm::Triple::thumb)) {
3417 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003418 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003419 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003420 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003421 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003422 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003423 }
3424
Tim Northover336f1892014-03-29 13:16:12 +00003425 // Push all default warning arguments that are specific to
3426 // the given target. These come before user provided warning options
3427 // are provided.
3428 getToolChain().addClangWarningOptions(CmdArgs);
3429
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003430 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003431 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003432
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003433 if (isa<AnalyzeJobAction>(JA)) {
3434 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3435 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003436 } else if (isa<MigrateJobAction>(JA)) {
3437 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003438 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003439 if (Output.getType() == types::TY_Dependencies)
3440 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003441 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003442 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003443 if (Args.hasArg(options::OPT_rewrite_objc) &&
3444 !Args.hasArg(options::OPT_g_Group))
3445 CmdArgs.push_back("-P");
3446 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003447 } else if (isa<AssembleJobAction>(JA)) {
3448 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003449
David Blaikie9260ed62013-07-25 21:19:01 +00003450 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003451
3452 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003453 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003454 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003455 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003456 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003457
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003458 if (JA.getType() == types::TY_Nothing)
3459 CmdArgs.push_back("-fsyntax-only");
3460 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003461 CmdArgs.push_back("-emit-pch");
3462 else
3463 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003464 } else if (isa<VerifyPCHJobAction>(JA)) {
3465 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003466 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003467 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3468 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003469 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003470 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003471 } else if (JA.getType() == types::TY_LLVM_IR ||
3472 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003473 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003474 } else if (JA.getType() == types::TY_LLVM_BC ||
3475 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003476 CmdArgs.push_back("-emit-llvm-bc");
3477 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003478 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003479 } else if (JA.getType() == types::TY_AST) {
3480 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003481 } else if (JA.getType() == types::TY_ModuleFile) {
3482 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003483 } else if (JA.getType() == types::TY_RewrittenObjC) {
3484 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003485 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003486 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3487 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003488 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003489 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003490 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003491 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003492
3493 // Preserve use-list order by default when emitting bitcode, so that
3494 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3495 // same result as running passes here. For LTO, we don't need to preserve
3496 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003497 if (JA.getType() == types::TY_LLVM_BC)
3498 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003499
3500 if (D.isUsingLTO())
3501 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003502 }
3503
Teresa Johnsonaff22322015-12-07 19:21:34 +00003504 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3505 if (!types::isLLVMIR(Input.getType()))
3506 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3507 << "-x ir";
3508 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3509 }
3510
Justin Bognera88f0122014-06-20 22:59:50 +00003511 // We normally speed up the clang process a bit by skipping destructors at
3512 // exit, but when we're generating diagnostics we can rely on some of the
3513 // cleanup.
3514 if (!C.isForDiagnostics())
3515 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003516
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003517// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003518#ifdef NDEBUG
3519 CmdArgs.push_back("-disable-llvm-verifier");
3520#endif
3521
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003522 // Set the main file name, so that debug info works even with
3523 // -save-temps.
3524 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003525 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003526
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003527 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003528 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003529 if (Args.hasArg(options::OPT_static))
3530 CmdArgs.push_back("-static-define");
3531
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003532 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003533 // Enable region store model by default.
3534 CmdArgs.push_back("-analyzer-store=region");
3535
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003536 // Treat blocks as analysis entry points.
3537 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3538
Ted Kremenek49c79792011-03-24 00:28:47 +00003539 CmdArgs.push_back("-analyzer-eagerly-assume");
3540
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003541 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003542 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003543 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003544
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003545 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003546 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003547
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003548 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003549 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003550
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003551 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003552
Artem Belevichba558952015-05-06 18:20:23 +00003553 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003554 CmdArgs.push_back("-analyzer-checker=cplusplus");
3555
Nico Webere8e53112014-05-11 01:04:02 +00003556 // Enable the following experimental checkers for testing.
3557 CmdArgs.push_back(
3558 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003559 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3560 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003561 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003562 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3563 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003564
3565 // Default nullability checks.
3566 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3567 CmdArgs.push_back(
3568 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003569 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003570
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003571 // Set the output format. The default is plist, for (lame) historical
3572 // reasons.
3573 CmdArgs.push_back("-analyzer-output");
3574 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003575 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003576 else
3577 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003578
Ted Kremenekfe449a22010-03-22 22:32:05 +00003579 // Disable the presentation of standard compiler warnings when
3580 // using --analyze. We only want to show static analyzer diagnostics
3581 // or frontend errors.
3582 CmdArgs.push_back("-w");
3583
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003584 // Add -Xanalyzer arguments when running as analyzer.
3585 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003586 }
3587
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003588 CheckCodeGenerationOptions(D, Args);
3589
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003590 llvm::Reloc::Model RelocationModel;
3591 unsigned PICLevel;
3592 bool IsPIE;
3593 std::tie(RelocationModel, PICLevel, IsPIE) =
3594 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003595
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003596 const char *RMName = RelocationModelName(RelocationModel);
3597 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003598 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003599 CmdArgs.push_back(RMName);
3600 }
3601 if (PICLevel > 0) {
3602 CmdArgs.push_back("-pic-level");
3603 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3604 if (IsPIE) {
3605 CmdArgs.push_back("-pie-level");
3606 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003607 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003608 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003609
Renato Golin4854d802015-11-09 12:40:41 +00003610 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3611 CmdArgs.push_back("-meabi");
3612 CmdArgs.push_back(A->getValue());
3613 }
3614
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003615 CmdArgs.push_back("-mthread-model");
3616 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3617 CmdArgs.push_back(A->getValue());
3618 else
3619 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3620
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003621 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3622
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003623 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3624 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003625 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003626
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003627 // LLVM Code Generator Options.
3628
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003629 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3630 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003631 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3632 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003633 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003634 CmdArgs.push_back(A->getValue());
3635 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003636 }
3637 }
3638
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003639 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3640 StringRef v = A->getValue();
3641 CmdArgs.push_back("-mllvm");
3642 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3643 A->claim();
3644 }
3645
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003646 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3647 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003648 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003649 }
3650
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003651 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3652 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003653 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003654 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003655 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003656 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3657 CmdArgs.push_back("-fpcc-struct-return");
3658 } else {
3659 assert(A->getOption().matches(options::OPT_freg_struct_return));
3660 CmdArgs.push_back("-freg-struct-return");
3661 }
3662 }
3663
Roman Divacky65b88cd2011-03-01 17:40:53 +00003664 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3665 CmdArgs.push_back("-mrtd");
3666
Rafael Espindola224dd632011-12-14 21:02:23 +00003667 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003668 CmdArgs.push_back("-mdisable-fp-elim");
3669 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3670 options::OPT_fno_zero_initialized_in_bss))
3671 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003672
3673 bool OFastEnabled = isOptimizationLevelFast(Args);
3674 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3675 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003676 OptSpecifier StrictAliasingAliasOption =
3677 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003678 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3679 // doesn't do any TBAA.
3680 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003681 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003682 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003683 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003684 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3685 options::OPT_fno_struct_path_tbaa))
3686 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003687 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3688 false))
3689 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003690 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3691 options::OPT_fno_strict_vtable_pointers,
3692 false))
3693 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003694 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3695 options::OPT_fno_optimize_sibling_calls))
3696 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003697
Eric Christopher006208c2013-04-04 06:29:47 +00003698 // Handle segmented stacks.
3699 if (Args.hasArg(options::OPT_fsplit_stack))
3700 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003701
3702 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3703 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003704 OptSpecifier FastMathAliasOption =
3705 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3706
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003707 // Handle various floating point optimization flags, mapping them to the
3708 // appropriate LLVM code generation flags. The pattern for all of these is to
3709 // default off the codegen optimizations, and if any flag enables them and no
3710 // flag disables them after the flag enabling them, enable the codegen
3711 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003712 if (Arg *A = Args.getLastArg(
3713 options::OPT_ffast_math, FastMathAliasOption,
3714 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3715 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3716 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003717 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3718 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003719 A->getOption().getID() != options::OPT_fhonor_infinities)
3720 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003721 if (Arg *A = Args.getLastArg(
3722 options::OPT_ffast_math, FastMathAliasOption,
3723 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3724 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3725 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003726 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3727 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003728 A->getOption().getID() != options::OPT_fhonor_nans)
3729 CmdArgs.push_back("-menable-no-nans");
3730
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003731 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3732 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003733 if (Arg *A =
3734 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3735 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3736 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003737 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3738 // However, turning *off* -ffast_math merely restores the toolchain default
3739 // (which may be false).
3740 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3741 A->getOption().getID() == options::OPT_ffast_math ||
3742 A->getOption().getID() == options::OPT_Ofast)
3743 MathErrno = false;
3744 else if (A->getOption().getID() == options::OPT_fmath_errno)
3745 MathErrno = true;
3746 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003747 if (MathErrno)
3748 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003749
3750 // There are several flags which require disabling very specific
3751 // optimizations. Any of these being disabled forces us to turn off the
3752 // entire set of LLVM optimizations, so collect them through all the flag
3753 // madness.
3754 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003755 if (Arg *A = Args.getLastArg(
3756 options::OPT_ffast_math, FastMathAliasOption,
3757 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3758 options::OPT_fno_unsafe_math_optimizations,
3759 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003760 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3761 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003762 A->getOption().getID() != options::OPT_fno_associative_math)
3763 AssociativeMath = true;
3764 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003765 if (Arg *A = Args.getLastArg(
3766 options::OPT_ffast_math, FastMathAliasOption,
3767 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3768 options::OPT_fno_unsafe_math_optimizations,
3769 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003770 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3771 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003772 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3773 ReciprocalMath = true;
3774 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003775 if (Arg *A = Args.getLastArg(
3776 options::OPT_ffast_math, FastMathAliasOption,
3777 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3778 options::OPT_fno_unsafe_math_optimizations,
3779 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003780 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3781 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003782 A->getOption().getID() != options::OPT_fsigned_zeros)
3783 SignedZeros = false;
3784 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003785 if (Arg *A = Args.getLastArg(
3786 options::OPT_ffast_math, FastMathAliasOption,
3787 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3788 options::OPT_fno_unsafe_math_optimizations,
3789 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003790 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3791 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003792 A->getOption().getID() != options::OPT_ftrapping_math)
3793 TrappingMath = false;
3794 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3795 !TrappingMath)
3796 CmdArgs.push_back("-menable-unsafe-fp-math");
3797
Sanjay Patel76c9e092015-01-23 16:40:50 +00003798 if (!SignedZeros)
3799 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003800
Sanjay Patel359b1052015-04-09 15:03:23 +00003801 if (ReciprocalMath)
3802 CmdArgs.push_back("-freciprocal-math");
3803
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003804 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003805 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003806 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003807 options::OPT_ffp_contract)) {
3808 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003809 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003810 if (Val == "fast" || Val == "on" || Val == "off") {
3811 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3812 } else {
3813 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003814 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003815 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003816 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3817 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003818 // If fast-math is set then set the fp-contract mode to fast.
3819 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3820 }
3821 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003822
Sanjay Patel2987c292015-06-11 14:53:41 +00003823 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003824
Bob Wilson6a039162012-07-19 03:52:53 +00003825 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3826 // and if we find them, tell the frontend to provide the appropriate
3827 // preprocessor macros. This is distinct from enabling any optimizations as
3828 // these options induce language changes which must survive serialization
3829 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003830 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3831 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003832 if (!A->getOption().matches(options::OPT_fno_fast_math))
3833 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003834 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3835 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003836 if (A->getOption().matches(options::OPT_ffinite_math_only))
3837 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003838
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003839 // Decide whether to use verbose asm. Verbose assembly is the default on
3840 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003841 bool IsIntegratedAssemblerDefault =
3842 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003843 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003844 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003845 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003846 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003847
Rafael Espindolab8a12932015-05-22 20:44:03 +00003848 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3849 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003850 CmdArgs.push_back("-no-integrated-as");
3851
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003852 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3853 CmdArgs.push_back("-mdebug-pass");
3854 CmdArgs.push_back("Structure");
3855 }
3856 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3857 CmdArgs.push_back("-mdebug-pass");
3858 CmdArgs.push_back("Arguments");
3859 }
3860
John McCall8517abc2010-02-19 02:45:38 +00003861 // Enable -mconstructor-aliases except on darwin, where we have to
3862 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003863 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003864 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003865
John McCall7ef5cb32011-03-18 02:56:14 +00003866 // Darwin's kernel doesn't support guard variables; just die if we
3867 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003868 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003869 CmdArgs.push_back("-fforbid-guard-variables");
3870
Akira Hatanaka02028482015-11-12 17:21:22 +00003871 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3872 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003873 CmdArgs.push_back("-mms-bitfields");
3874 }
John McCall8517abc2010-02-19 02:45:38 +00003875
Daniel Dunbar306945d2009-09-16 06:17:29 +00003876 // This is a coarse approximation of what llvm-gcc actually does, both
3877 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3878 // complicated ways.
3879 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003880 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3881 options::OPT_fno_asynchronous_unwind_tables,
3882 (getToolChain().IsUnwindTablesDefault() ||
3883 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3884 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003885 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3886 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003887 CmdArgs.push_back("-munwind-tables");
3888
Chandler Carruth05fb5852012-11-21 23:40:23 +00003889 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003890
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003891 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3892 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003893 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003894 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003895
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003896 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003897 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003898
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003899 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003900 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003901 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003902 }
3903
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003904 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003905 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003906 if (!CPU.empty()) {
3907 CmdArgs.push_back("-target-cpu");
3908 CmdArgs.push_back(Args.MakeArgString(CPU));
3909 }
3910
Rafael Espindolaeb265472013-08-21 21:59:03 +00003911 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3912 CmdArgs.push_back("-mfpmath");
3913 CmdArgs.push_back(A->getValue());
3914 }
3915
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003916 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003917 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003918
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003919 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003920 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003921 default:
3922 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003923
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003924 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003925 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003926 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003927 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003928 // Use the effective triple, which takes into account the deployment target.
3929 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003930 break;
3931
Tim Northover573cbee2014-05-24 12:52:07 +00003932 case llvm::Triple::aarch64:
3933 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003934 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003935 break;
3936
Eric Christopher0b26a612010-03-02 02:41:08 +00003937 case llvm::Triple::mips:
3938 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003939 case llvm::Triple::mips64:
3940 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003941 AddMIPSTargetArgs(Args, CmdArgs);
3942 break;
3943
Ulrich Weigand8afad612014-07-28 13:17:52 +00003944 case llvm::Triple::ppc:
3945 case llvm::Triple::ppc64:
3946 case llvm::Triple::ppc64le:
3947 AddPPCTargetArgs(Args, CmdArgs);
3948 break;
3949
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003950 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003951 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003952 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003953 AddSparcTargetArgs(Args, CmdArgs);
3954 break;
3955
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003956 case llvm::Triple::x86:
3957 case llvm::Triple::x86_64:
3958 AddX86TargetArgs(Args, CmdArgs);
3959 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003960
3961 case llvm::Triple::hexagon:
3962 AddHexagonTargetArgs(Args, CmdArgs);
3963 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003964 }
3965
Douglas Katzman3459ce22015-10-08 04:24:12 +00003966 // The 'g' groups options involve a somewhat intricate sequence of decisions
3967 // about what to pass from the driver to the frontend, but by the time they
3968 // reach cc1 they've been factored into two well-defined orthogonal choices:
3969 // * what level of debug info to generate
3970 // * what dwarf version to write
3971 // This avoids having to monkey around further in cc1 other than to disable
3972 // codeview if not running in a Windows environment. Perhaps even that
3973 // decision should be made in the driver as well though.
3974 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3975 CodeGenOptions::NoDebugInfo;
3976 // These two are potentially updated by AddClangCLArgs.
3977 unsigned DwarfVersion = 0;
3978 bool EmitCodeView = false;
3979
Hans Wennborg75958c42013-08-08 00:17:41 +00003980 // Add clang-cl arguments.
3981 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003982 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003983
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003984 // Pass the linker version in use.
3985 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3986 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003987 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003988 }
3989
Eric Christopherb7d97e92013-04-03 01:58:53 +00003990 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003991 CmdArgs.push_back("-momit-leaf-frame-pointer");
3992
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003993 // Explicitly error on some things we know we don't support and can't just
3994 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003995 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003996 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3997 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003998 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003999 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004000 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4001 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004002 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004003 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004004 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004005 }
4006
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004007 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004008 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004009 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004010 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004011 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4012 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004013 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004014 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004015 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004016
Chad Rosierbe10f982011-08-02 17:58:04 +00004017 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004018 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004019 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4020 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004021 }
4022
Rafael Espindola08a692a2010-03-07 04:46:18 +00004023 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004024 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004025 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004026 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
4027 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
4028 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00004029 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00004030 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004031 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00004032 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00004033 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004034 // Some 'g' group option other than one expressly disabling debug info
4035 // must have been the final (winning) one. They're all equivalent.
4036 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00004037 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004038 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004039
Douglas Katzman3459ce22015-10-08 04:24:12 +00004040 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
4041 // (because that would mean that "-g0" was the rightmost 'g' group option).
4042 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
4043 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
4044 // exists of removing the gdwarf options from the g_group.
4045 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
4046 options::OPT_gdwarf_4))
4047 DwarfVersion = DwarfVersionNum(A->getSpelling());
4048
Reid Kleckner124955a2015-08-05 18:51:13 +00004049 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004050 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4051 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4052 // DwarfVersion remains at 0 if no explicit choice was made.
4053 CmdArgs.push_back("-gcodeview");
4054 } else if (DwarfVersion == 0 &&
4055 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4056 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4057 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004058
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004059 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4060 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004061
4062 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004063 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004064 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004065 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004066
Eric Christopher138c32b2013-09-13 22:37:55 +00004067 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004068 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004069 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004070 CmdArgs.push_back("-dwarf-ext-refs");
4071 CmdArgs.push_back("-fmodule-format=obj");
4072 }
4073
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004074 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4075 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004076 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004077 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004078 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004079 CmdArgs.push_back("-backend-option");
4080 CmdArgs.push_back("-split-dwarf=Enable");
4081 }
4082
Douglas Katzman3459ce22015-10-08 04:24:12 +00004083 // After we've dealt with all combinations of things that could
4084 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4085 // figure out if we need to "upgrade" it to standalone debug info.
4086 // We parse these two '-f' options whether or not they will be used,
4087 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4088 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4089 options::OPT_fno_standalone_debug,
4090 getToolChain().GetDefaultStandaloneDebug());
4091 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4092 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4093 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
4094
Eric Christopher138c32b2013-09-13 22:37:55 +00004095 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4096 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4097 CmdArgs.push_back("-backend-option");
4098 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4099 }
Eric Christophereec89c22013-06-18 00:03:50 +00004100
Eric Christopher0d403d22014-02-14 01:27:03 +00004101 // -gdwarf-aranges turns on the emission of the aranges section in the
4102 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004103 // Always enabled on the PS4.
4104 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004105 CmdArgs.push_back("-backend-option");
4106 CmdArgs.push_back("-generate-arange-section");
4107 }
4108
David Blaikief36d9ba2014-01-27 18:52:43 +00004109 if (Args.hasFlag(options::OPT_fdebug_types_section,
4110 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004111 CmdArgs.push_back("-backend-option");
4112 CmdArgs.push_back("-generate-type-units");
4113 }
Eric Christophereec89c22013-06-18 00:03:50 +00004114
Ed Schouten6e576152015-03-26 17:50:28 +00004115 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4116 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4117
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004118 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004119 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004120 CmdArgs.push_back("-ffunction-sections");
4121 }
4122
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004123 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4124 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004125 CmdArgs.push_back("-fdata-sections");
4126 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004127
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004128 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004129 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004130 CmdArgs.push_back("-fno-unique-section-names");
4131
Chris Lattner3c77a352010-06-22 00:03:40 +00004132 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4133
Diego Novilloa0545962015-07-10 18:00:07 +00004134 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004135
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004136 // Pass options for controlling the default header search paths.
4137 if (Args.hasArg(options::OPT_nostdinc)) {
4138 CmdArgs.push_back("-nostdsysteminc");
4139 CmdArgs.push_back("-nobuiltininc");
4140 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004141 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004142 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004143 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4144 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4145 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004146
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004147 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004148 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004149 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004150
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004151 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4152
Ted Kremenekf7639e12012-03-06 20:06:33 +00004153 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004154 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004155 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004156 options::OPT_ccc_arcmt_modify,
4157 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004158 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004159 switch (A->getOption().getID()) {
4160 default:
4161 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004162 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004163 CmdArgs.push_back("-arcmt-check");
4164 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004165 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004166 CmdArgs.push_back("-arcmt-modify");
4167 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004168 case options::OPT_ccc_arcmt_migrate:
4169 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004170 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004171 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004172
4173 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4174 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004175 break;
John McCalld70fb982011-06-15 23:25:17 +00004176 }
4177 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004178 } else {
4179 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4180 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4181 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004182 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004183
Ted Kremenekf7639e12012-03-06 20:06:33 +00004184 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4185 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004186 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4187 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004188 }
4189 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004190 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004191
4192 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004193 options::OPT_objcmt_migrate_subscripting,
4194 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004195 // None specified, means enable them all.
4196 CmdArgs.push_back("-objcmt-migrate-literals");
4197 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004198 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004199 } else {
4200 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4201 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004202 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004203 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004204 } else {
4205 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4206 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4207 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4208 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4209 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4210 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004211 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004212 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4213 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4214 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4215 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4216 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4217 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4218 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004219 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004220 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004221 }
4222
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004223 // Add preprocessing options like -I, -D, etc. if we are using the
4224 // preprocessor.
4225 //
4226 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004227 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004228 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4229 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004230
Rafael Espindolaa7431922011-07-21 23:40:37 +00004231 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4232 // that "The compiler can only warn and ignore the option if not recognized".
4233 // When building with ccache, it will pass -D options to clang even on
4234 // preprocessed inputs and configure concludes that -fPIC is not supported.
4235 Args.ClaimAllArgs(options::OPT_D);
4236
Alp Toker7874bdc2013-11-15 20:40:58 +00004237 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004238 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4239 if (A->getOption().matches(options::OPT_O4)) {
4240 CmdArgs.push_back("-O3");
4241 D.Diag(diag::warn_O4_is_O3);
4242 } else {
4243 A->render(Args, CmdArgs);
4244 }
4245 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004246
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004247 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004248 for (const Arg *A :
4249 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4250 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004251 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004252 }
4253
Rafael Espindola577637a2015-01-03 00:06:04 +00004254 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004255
Richard Smith3be1cb22014-08-07 00:24:21 +00004256 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004257 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004258 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4259 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004260 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004261 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004262
4263 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004264 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004265 //
4266 // If a std is supplied, only add -trigraphs if it follows the
4267 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004268 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004269 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4270 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004271 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004272 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004273 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004274 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004275 else
4276 Std->render(Args, CmdArgs);
4277
Nico Weber00721502014-12-23 22:32:37 +00004278 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004279 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004280 options::OPT_ftrigraphs,
4281 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004282 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004283 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004284 } else {
4285 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004286 //
4287 // FIXME: Clang doesn't correctly handle -std= when the input language
4288 // doesn't match. For the time being just ignore this for C++ inputs;
4289 // eventually we want to do all the standard defaulting here instead of
4290 // splitting it between the driver and clang -cc1.
4291 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004292 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4293 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004294 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004295 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004296
Nico Weber00721502014-12-23 22:32:37 +00004297 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4298 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004299 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004300
Richard Smith282b4492013-09-04 22:50:31 +00004301 // GCC's behavior for -Wwrite-strings is a bit strange:
4302 // * In C, this "warning flag" changes the types of string literals from
4303 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4304 // for the discarded qualifier.
4305 // * In C++, this is just a normal warning flag.
4306 //
4307 // Implementing this warning correctly in C is hard, so we follow GCC's
4308 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4309 // a non-const char* in C, rather than using this crude hack.
4310 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004311 // FIXME: This should behave just like a warning flag, and thus should also
4312 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4313 Arg *WriteStrings =
4314 Args.getLastArg(options::OPT_Wwrite_strings,
4315 options::OPT_Wno_write_strings, options::OPT_w);
4316 if (WriteStrings &&
4317 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004318 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004319 }
4320
Chandler Carruth61fbf622011-04-23 09:27:53 +00004321 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004322 // during C++ compilation, which it is by default. GCC keeps this define even
4323 // in the presence of '-w', match this behavior bug-for-bug.
4324 if (types::isCXX(InputType) &&
4325 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4326 true)) {
4327 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004328 }
4329
Chandler Carruthe0391482010-05-22 02:21:53 +00004330 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4331 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4332 if (Asm->getOption().matches(options::OPT_fasm))
4333 CmdArgs.push_back("-fgnu-keywords");
4334 else
4335 CmdArgs.push_back("-fno-gnu-keywords");
4336 }
4337
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004338 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4339 CmdArgs.push_back("-fno-dwarf-directory-asm");
4340
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004341 if (ShouldDisableAutolink(Args, getToolChain()))
4342 CmdArgs.push_back("-fno-autolink");
4343
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004344 // Add in -fdebug-compilation-dir if necessary.
4345 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004346
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004347 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4348 StringRef Map = A->getValue();
4349 if (Map.find('=') == StringRef::npos)
4350 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4351 else
4352 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4353 A->claim();
4354 }
4355
Richard Smith9a568822011-11-21 19:36:32 +00004356 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4357 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004358 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004359 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004360 }
4361
Richard Smith79c927b2013-11-06 19:31:51 +00004362 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4363 CmdArgs.push_back("-foperator-arrow-depth");
4364 CmdArgs.push_back(A->getValue());
4365 }
4366
Richard Smith9a568822011-11-21 19:36:32 +00004367 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4368 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004369 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004370 }
4371
Richard Smitha3d3bd22013-05-08 02:12:03 +00004372 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4373 CmdArgs.push_back("-fconstexpr-steps");
4374 CmdArgs.push_back(A->getValue());
4375 }
4376
Richard Smithb3a14522013-02-22 01:59:51 +00004377 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4378 CmdArgs.push_back("-fbracket-depth");
4379 CmdArgs.push_back(A->getValue());
4380 }
4381
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004382 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4383 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004384 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004385 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004386 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4387 } else
4388 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004389 }
4390
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004391 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004392 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004393
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004394 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4395 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004396 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004397 }
David Chisnall5778fce2009-08-31 16:41:57 +00004398
Chris Lattnere23003d2010-01-09 21:54:33 +00004399 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4400 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004401 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004402 }
4403
Chris Lattnerb35583d2010-04-07 20:49:23 +00004404 CmdArgs.push_back("-ferror-limit");
4405 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004406 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004407 else
4408 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004409
Chandler Carrutha77a7272010-05-06 04:55:18 +00004410 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4411 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004412 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004413 }
4414
4415 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4416 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004417 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004418 }
4419
Richard Smithf6f003a2011-12-16 19:06:07 +00004420 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4421 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004422 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004423 }
4424
Nick Lewycky24653262014-12-16 21:39:02 +00004425 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4426 CmdArgs.push_back("-fspell-checking-limit");
4427 CmdArgs.push_back(A->getValue());
4428 }
4429
Daniel Dunbar2c978472009-11-04 06:24:47 +00004430 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004431 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004432 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004433 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004434 } else {
4435 // If -fmessage-length=N was not specified, determine whether this is a
4436 // terminal and, if so, implicitly define -fmessage-length appropriately.
4437 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004438 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004439 }
4440
John McCallb4a99d32013-02-19 01:57:35 +00004441 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4442 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4443 options::OPT_fvisibility_ms_compat)) {
4444 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4445 CmdArgs.push_back("-fvisibility");
4446 CmdArgs.push_back(A->getValue());
4447 } else {
4448 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4449 CmdArgs.push_back("-fvisibility");
4450 CmdArgs.push_back("hidden");
4451 CmdArgs.push_back("-ftype-visibility");
4452 CmdArgs.push_back("default");
4453 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004454 }
4455
Douglas Gregor08329632010-06-15 17:05:35 +00004456 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004457
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004458 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4459
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004460 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004461 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4462 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004463 CmdArgs.push_back("-ffreestanding");
4464
Daniel Dunbare357d562009-12-03 18:42:11 +00004465 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004466 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004467 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004468 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004469 // Emulated TLS is enabled by default on Android, and can be enabled manually
4470 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004471 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004472 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4473 EmulatedTLSDefault))
4474 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004475 // AltiVec-like language extensions aren't relevant for assembling.
4476 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004477 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004478 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4479 }
Richard Trieu91844232012-06-26 18:18:47 +00004480 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4481 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004482
Alexey Bataevdb390212015-05-20 04:24:19 +00004483 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004484 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4485 options::OPT_fno_openmp, false))
4486 switch (getOpenMPRuntime(getToolChain(), Args)) {
4487 case OMPRT_OMP:
4488 case OMPRT_IOMP5:
4489 // Clang can generate useful OpenMP code for these two runtime libraries.
4490 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004491
4492 // If no option regarding the use of TLS in OpenMP codegeneration is
4493 // given, decide a default based on the target. Otherwise rely on the
4494 // options and pass the right information to the frontend.
4495 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004496 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004497 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004498 break;
4499 default:
4500 // By default, if Clang doesn't know how to generate useful OpenMP code
4501 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4502 // down to the actual compilation.
4503 // FIXME: It would be better to have a mode which *only* omits IR
4504 // generation based on the OpenMP support so that we get consistent
4505 // semantic analysis, etc.
4506 break;
4507 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004508
Peter Collingbourne32701642013-11-01 18:16:25 +00004509 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004510 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004511
Eric Christopher459d2712013-02-19 06:16:53 +00004512 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004513 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4514 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4515 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4516 Arch == llvm::Triple::ppc64le))
4517 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4518 << "ppc/ppc64/ppc64le";
4519 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004520
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004521 // -fzvector is incompatible with -faltivec.
4522 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4523 if (Args.hasArg(options::OPT_faltivec))
4524 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4525 << "-faltivec";
4526
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004527 if (getToolChain().SupportsProfiling())
4528 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004529
4530 // -flax-vector-conversions is default.
4531 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4532 options::OPT_fno_lax_vector_conversions))
4533 CmdArgs.push_back("-fno-lax-vector-conversions");
4534
John Brawna7b4ec02015-08-10 11:11:28 +00004535 if (Args.getLastArg(options::OPT_fapple_kext) ||
4536 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004537 CmdArgs.push_back("-fapple-kext");
4538
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004539 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004540 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004541 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004542 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4543 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004544
4545 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4546 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004547 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004548 }
4549
Bob Wilson14adb362012-02-03 06:27:22 +00004550 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004551
Chandler Carruth6e501032011-03-27 00:04:55 +00004552 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4553 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004554 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004555 if (A->getOption().matches(options::OPT_fwrapv))
4556 CmdArgs.push_back("-fwrapv");
4557 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4558 options::OPT_fno_strict_overflow)) {
4559 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4560 CmdArgs.push_back("-fwrapv");
4561 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004562
4563 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4564 options::OPT_fno_reroll_loops))
4565 if (A->getOption().matches(options::OPT_freroll_loops))
4566 CmdArgs.push_back("-freroll-loops");
4567
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004568 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004569 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4570 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004571
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004572 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4573
Daniel Dunbar4930e332009-11-17 08:07:36 +00004574 // -stack-protector=0 is default.
4575 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004576 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4577 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4578 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4579 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4580 Args.ClaimAllArgs(options::OPT_fstack_protector);
4581 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004582 options::OPT_fstack_protector_all,
4583 options::OPT_fstack_protector_strong,
4584 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004585 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004586 StackProtectorLevel = std::max<unsigned>(
4587 LangOptions::SSPOn,
4588 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004589 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004590 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004591 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004592 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004593 } else {
4594 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004595 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004596 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004597 if (StackProtectorLevel) {
4598 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004599 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004600 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004601
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004602 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004603 for (const Arg *A : Args.filtered(options::OPT__param)) {
4604 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004605 if (Str.startswith("ssp-buffer-size=")) {
4606 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004607 CmdArgs.push_back("-stack-protector-buffer-size");
4608 // FIXME: Verify the argument is a valid integer.
4609 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004610 }
Sean Silva14facf32015-06-09 01:57:17 +00004611 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004612 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004613 }
4614
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004615 // Translate -mstackrealign
4616 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004617 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004618 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004619
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004620 if (Args.hasArg(options::OPT_mstack_alignment)) {
4621 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4622 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004623 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004624
Hans Wennborg77dc2362015-01-20 19:45:50 +00004625 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4626 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4627
4628 if (!Size.empty())
4629 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4630 else
4631 CmdArgs.push_back("-mstack-probe-size=0");
4632 }
4633
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004634 switch (getToolChain().getArch()) {
4635 case llvm::Triple::aarch64:
4636 case llvm::Triple::aarch64_be:
4637 case llvm::Triple::arm:
4638 case llvm::Triple::armeb:
4639 case llvm::Triple::thumb:
4640 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004641 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004642 break;
4643
4644 default:
4645 break;
4646 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004647
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004648 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4649 options::OPT_mno_restrict_it)) {
4650 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4651 CmdArgs.push_back("-backend-option");
4652 CmdArgs.push_back("-arm-restrict-it");
4653 } else {
4654 CmdArgs.push_back("-backend-option");
4655 CmdArgs.push_back("-arm-no-restrict-it");
4656 }
James Y Knight2db38f32015-08-15 03:45:25 +00004657 } else if (Triple.isOSWindows() &&
4658 (Triple.getArch() == llvm::Triple::arm ||
4659 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004660 // Windows on ARM expects restricted IT blocks
4661 CmdArgs.push_back("-backend-option");
4662 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004663 }
4664
Daniel Dunbard18049a2009-04-07 21:16:11 +00004665 // Forward -f options with positive and negative forms; we translate
4666 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004667 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4668 StringRef fname = A->getValue();
4669 if (!llvm::sys::fs::exists(fname))
4670 D.Diag(diag::err_drv_no_such_file) << fname;
4671 else
4672 A->render(Args, CmdArgs);
4673 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004674
John Brawna7b4ec02015-08-10 11:11:28 +00004675 // -fbuiltin is default unless -mkernel is used
4676 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4677 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004678 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004679
Nuno Lopes13c88c72009-12-16 16:59:22 +00004680 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4681 options::OPT_fno_assume_sane_operator_new))
4682 CmdArgs.push_back("-fno-assume-sane-operator-new");
4683
Daniel Dunbar4930e332009-11-17 08:07:36 +00004684 // -fblocks=0 is default.
4685 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004686 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004687 (Args.hasArg(options::OPT_fgnu_runtime) &&
4688 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4689 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004690 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004691
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004692 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004693 !getToolChain().hasBlocksRuntime())
4694 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004695 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004696
Richard Smith47972af2015-06-16 00:08:24 +00004697 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004698 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004699 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004700 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004701 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004702 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4703 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004704 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004705 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004706 HaveModules = true;
4707 }
4708 }
4709
Richard Smith47972af2015-06-16 00:08:24 +00004710 // -fmodule-maps enables implicit reading of module map files. By default,
4711 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004712 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4713 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004714 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004715 }
4716
Daniel Jasperac42b752013-10-21 06:34:34 +00004717 // -fmodules-decluse checks that modules used are declared so (off by
4718 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004719 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004720 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004721 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004722 }
4723
Daniel Jasper962b38e2014-04-11 11:47:45 +00004724 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4725 // all #included headers are part of modules.
4726 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004727 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004728 CmdArgs.push_back("-fmodules-strict-decluse");
4729 }
4730
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004731 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4732 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4733 options::OPT_fno_implicit_modules)) {
4734 CmdArgs.push_back("-fno-implicit-modules");
4735 }
4736
Daniel Jasperac42b752013-10-21 06:34:34 +00004737 // -fmodule-name specifies the module that is currently being built (or
4738 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004739 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004740
Richard Smith9887d792014-10-17 01:42:53 +00004741 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004742 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004743 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004744
Richard Smithe842a472014-10-22 02:05:46 +00004745 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004746 if (HaveModules)
4747 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4748 else
4749 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004750
4751 // -fmodule-cache-path specifies where our implicitly-built module files
4752 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004753 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004754 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004755 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004756 if (HaveModules) {
4757 if (C.isForDiagnostics()) {
4758 // When generating crash reports, we want to emit the modules along with
4759 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004760 Path = Output.getFilename();
4761 llvm::sys::path::replace_extension(Path, ".cache");
4762 llvm::sys::path::append(Path, "modules");
4763 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004764 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004765 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004766 llvm::sys::path::append(Path, "org.llvm.clang.");
4767 appendUserToPath(Path);
4768 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004769 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004770 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004771 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4772 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004773 }
4774
4775 // When building modules and generating crashdumps, we need to dump a module
4776 // dependency VFS alongside the output.
4777 if (HaveModules && C.isForDiagnostics()) {
4778 SmallString<128> VFSDir(Output.getFilename());
4779 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004780 // Add the cache directory as a temp so the crash diagnostics pick it up.
4781 C.addTempFile(Args.MakeArgString(VFSDir));
4782
Justin Bognera88f0122014-06-20 22:59:50 +00004783 llvm::sys::path::append(VFSDir, "vfs");
4784 CmdArgs.push_back("-module-dependency-dir");
4785 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004786 }
4787
Richard Smith9887d792014-10-17 01:42:53 +00004788 if (HaveModules)
4789 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004790
Douglas Gregor35b04d62013-02-07 19:01:24 +00004791 // Pass through all -fmodules-ignore-macro arguments.
4792 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004793 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4794 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004795
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004796 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4797
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004798 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4799 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4800 D.Diag(diag::err_drv_argument_not_allowed_with)
4801 << A->getAsString(Args) << "-fbuild-session-timestamp";
4802
4803 llvm::sys::fs::file_status Status;
4804 if (llvm::sys::fs::status(A->getValue(), Status))
4805 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004806 CmdArgs.push_back(Args.MakeArgString(
4807 "-fbuild-session-timestamp=" +
4808 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004809 }
4810
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004811 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004812 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4813 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004814 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4815
4816 Args.AddLastArg(CmdArgs,
4817 options::OPT_fmodules_validate_once_per_build_session);
4818 }
4819
Ben Langmuirdcf73862014-03-12 00:06:17 +00004820 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4821
John McCalldfea9982010-04-09 19:12:06 +00004822 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004823 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004824 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004825 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004826
Anders Carlssond470fef2010-11-21 00:09:52 +00004827 // -felide-constructors is the default.
4828 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004829 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004830 CmdArgs.push_back("-fno-elide-constructors");
4831
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004832 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004833
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004834 if (KernelOrKext || (types::isCXX(InputType) &&
4835 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4836 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004837 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004838
Tony Linthicum76329bf2011-12-12 21:14:55 +00004839 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004840 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4841 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004842 CmdArgs.push_back("-fshort-enums");
4843
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004844 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004845 if (Arg *A = Args.getLastArg(
4846 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4847 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4848 if (A->getOption().matches(options::OPT_funsigned_char) ||
4849 A->getOption().matches(options::OPT_fno_signed_char)) {
4850 CmdArgs.push_back("-fno-signed-char");
4851 }
4852 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004853 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004854 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004855
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004856 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004857 if (!Args.hasFlag(
4858 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4859 !IsWindowsCygnus && !IsWindowsGNU &&
4860 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4861 getToolChain().getArch() != llvm::Triple::hexagon &&
4862 getToolChain().getArch() != llvm::Triple::xcore &&
4863 ((getToolChain().getTriple().getVendor() !=
4864 llvm::Triple::MipsTechnologies) ||
4865 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004866 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004867 CmdArgs.push_back("-fno-use-cxa-atexit");
4868
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004869 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004870 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004871 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004872 CmdArgs.push_back("-fms-extensions");
4873
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004874 // -fno-use-line-directives is default.
4875 if (Args.hasFlag(options::OPT_fuse_line_directives,
4876 options::OPT_fno_use_line_directives, false))
4877 CmdArgs.push_back("-fuse-line-directives");
4878
Francois Pichet1b4f1632011-09-17 04:32:15 +00004879 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004880 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004881 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004882 (IsWindowsMSVC &&
4883 Args.hasFlag(options::OPT_fms_extensions,
4884 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004885 CmdArgs.push_back("-fms-compatibility");
4886
David Majnemerc371ff02015-03-22 08:39:22 +00004887 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004888 VersionTuple MSVT = visualstudio::getMSVCVersion(
4889 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4890 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004891 CmdArgs.push_back(
4892 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004893
David Majnemer8db91762015-05-18 04:49:30 +00004894 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4895 if (ImplyVCPPCXXVer) {
4896 if (IsMSVC2015Compatible)
4897 CmdArgs.push_back("-std=c++14");
4898 else
4899 CmdArgs.push_back("-std=c++11");
4900 }
4901
Eric Christopher5ecce122013-02-18 00:38:31 +00004902 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004903 if (Args.hasFlag(options::OPT_fborland_extensions,
4904 options::OPT_fno_borland_extensions, false))
4905 CmdArgs.push_back("-fborland-extensions");
4906
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004907 // -fno-declspec is default, except for PS4.
4908 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4909 getToolChain().getTriple().isPS4()))
4910 CmdArgs.push_back("-fdeclspec");
4911 else if (Args.hasArg(options::OPT_fno_declspec))
4912 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4913
David Majnemerc371ff02015-03-22 08:39:22 +00004914 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4915 // than 19.
4916 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4917 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004918 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004919 CmdArgs.push_back("-fno-threadsafe-statics");
4920
Francois Pichet02744872011-09-01 16:38:08 +00004921 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4922 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004923 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004924 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004925 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004926
Chandler Carruthe03aa552010-04-17 20:17:31 +00004927 // -fgnu-keywords default varies depending on language; only pass if
4928 // specified.
4929 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004930 options::OPT_fno_gnu_keywords))
4931 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004933 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004934 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004935 CmdArgs.push_back("-fgnu89-inline");
4936
Chad Rosier9c76d242012-03-15 22:31:42 +00004937 if (Args.hasArg(options::OPT_fno_inline))
4938 CmdArgs.push_back("-fno-inline");
4939
Chad Rosier64d6be92012-03-06 21:17:19 +00004940 if (Args.hasArg(options::OPT_fno_inline_functions))
4941 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004942
John McCall5fb5df92012-06-20 06:18:46 +00004943 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004944
John McCall5fb5df92012-06-20 06:18:46 +00004945 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004946 // legacy is the default. Except for deployment taget of 10.5,
4947 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4948 // gets ignored silently.
4949 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004950 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4951 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004952 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004953 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004954 if (getToolChain().UseObjCMixedDispatch())
4955 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4956 else
4957 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4958 }
4959 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004960
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004961 // When ObjectiveC legacy runtime is in effect on MacOSX,
4962 // turn on the option to do Array/Dictionary subscripting
4963 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004964 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004965 getToolChain().getTriple().isMacOSX() &&
4966 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4967 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004968 objcRuntime.isNeXTFamily())
4969 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004970
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004971 // -fencode-extended-block-signature=1 is default.
4972 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4973 CmdArgs.push_back("-fencode-extended-block-signature");
4974 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004975
John McCall24fc0de2011-07-06 00:26:06 +00004976 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4977 // NOTE: This logic is duplicated in ToolChains.cpp.
4978 bool ARC = isObjCAutoRefCount(Args);
4979 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004980 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004981
John McCall24fc0de2011-07-06 00:26:06 +00004982 CmdArgs.push_back("-fobjc-arc");
4983
Chandler Carruth491db322011-11-04 07:34:47 +00004984 // FIXME: It seems like this entire block, and several around it should be
4985 // wrapped in isObjC, but for now we just use it here as this is where it
4986 // was being used previously.
4987 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4988 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4989 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4990 else
4991 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4992 }
4993
John McCall24fc0de2011-07-06 00:26:06 +00004994 // Allow the user to enable full exceptions code emission.
4995 // We define off for Objective-CC, on for Objective-C++.
4996 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4997 options::OPT_fno_objc_arc_exceptions,
4998 /*default*/ types::isCXX(InputType)))
4999 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005000
John McCall24fc0de2011-07-06 00:26:06 +00005001 }
5002
5003 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5004 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005005 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005006 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005007
John McCall24fc0de2011-07-06 00:26:06 +00005008 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5009 // takes precedence.
5010 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5011 if (!GCArg)
5012 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5013 if (GCArg) {
5014 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005015 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005016 } else if (getToolChain().SupportsObjCGC()) {
5017 GCArg->render(Args, CmdArgs);
5018 } else {
5019 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005020 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005021 }
5022 }
5023
John McCallfbe5ed72015-11-05 19:19:56 +00005024 // Pass down -fobjc-weak or -fno-objc-weak if present.
5025 if (types::isObjC(InputType)) {
5026 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5027 options::OPT_fno_objc_weak);
5028 if (!WeakArg) {
5029 // nothing to do
5030 } else if (GCArg) {
5031 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5032 D.Diag(diag::err_objc_weak_with_gc);
5033 } else if (!objcRuntime.allowsWeak()) {
5034 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5035 D.Diag(diag::err_objc_weak_unsupported);
5036 } else {
5037 WeakArg->render(Args, CmdArgs);
5038 }
5039 }
5040
Bob Wilsonb111ec92015-03-02 19:01:14 +00005041 if (Args.hasFlag(options::OPT_fapplication_extension,
5042 options::OPT_fno_application_extension, false))
5043 CmdArgs.push_back("-fapplication-extension");
5044
Reid Klecknerc542d372014-06-27 17:02:02 +00005045 // Handle GCC-style exception args.
5046 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005047 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5048 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005049
Tim Northovere931f9f2015-10-30 16:30:41 +00005050 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005051 CmdArgs.push_back("-fsjlj-exceptions");
5052
5053 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005054 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5055 options::OPT_fno_assume_sane_operator_new))
5056 CmdArgs.push_back("-fno-assume-sane-operator-new");
5057
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005058 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5059 // most platforms.
5060 if (Args.hasFlag(options::OPT_fsized_deallocation,
5061 options::OPT_fno_sized_deallocation, false))
5062 CmdArgs.push_back("-fsized-deallocation");
5063
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005064 // -fconstant-cfstrings is default, and may be subject to argument translation
5065 // on Darwin.
5066 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5067 options::OPT_fno_constant_cfstrings) ||
5068 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5069 options::OPT_mno_constant_cfstrings))
5070 CmdArgs.push_back("-fno-constant-cfstrings");
5071
John Thompsoned4e2952009-11-05 20:14:16 +00005072 // -fshort-wchar default varies depending on platform; only
5073 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005074 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5075 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005076 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005077
Hans Wennborg28c96312013-07-31 23:39:13 +00005078 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005079 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005080 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005081 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005082
Daniel Dunbar096ed292011-10-05 21:04:55 +00005083 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5084 // -fno-pack-struct doesn't apply to -fpack-struct=.
5085 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005086 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005087 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005088 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005089 } else if (Args.hasFlag(options::OPT_fpack_struct,
5090 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005091 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005092 }
5093
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005094 // Handle -fmax-type-align=N and -fno-type-align
5095 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5096 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5097 if (!SkipMaxTypeAlign) {
5098 std::string MaxTypeAlignStr = "-fmax-type-align=";
5099 MaxTypeAlignStr += A->getValue();
5100 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5101 }
5102 } else if (getToolChain().getTriple().isOSDarwin()) {
5103 if (!SkipMaxTypeAlign) {
5104 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5105 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5106 }
5107 }
5108
John Brawna7b4ec02015-08-10 11:11:28 +00005109 // -fcommon is the default unless compiling kernel code or the target says so
5110 bool NoCommonDefault =
5111 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5112 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5113 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005114 CmdArgs.push_back("-fno-common");
5115
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005116 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005117 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005118 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005119 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005120 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005121 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005122
Daniel Dunbar6358d682010-10-15 22:30:42 +00005123 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005124 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005125 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005126 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005127
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005128 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005129 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5130 StringRef value = inputCharset->getValue();
5131 if (value != "UTF-8")
5132 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5133 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005134 }
5135
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005136 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005137 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5138 StringRef value = execCharset->getValue();
5139 if (value != "UTF-8")
5140 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5141 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005142 }
5143
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005144 // -fcaret-diagnostics is default.
5145 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5146 options::OPT_fno_caret_diagnostics, true))
5147 CmdArgs.push_back("-fno-caret-diagnostics");
5148
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005149 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005150 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005151 options::OPT_fno_diagnostics_fixit_info))
5152 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005153
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005154 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005155 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005156 options::OPT_fno_diagnostics_show_option))
5157 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005158
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005159 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005160 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005161 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005162 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005163 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005164
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005165 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005166 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005167 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005168 }
5169
Chandler Carruthb6766f02011-03-27 01:50:55 +00005170 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005171 options::OPT_fdiagnostics_show_note_include_stack,
5172 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005173 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005174 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005175 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5176 else
5177 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5178 }
5179
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005180 // Color diagnostics are the default, unless the terminal doesn't support
5181 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005182 // Support both clang's -f[no-]color-diagnostics and gcc's
5183 // -f[no-]diagnostics-colors[=never|always|auto].
5184 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005185 for (const auto &Arg : Args) {
5186 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005187 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5188 !O.matches(options::OPT_fdiagnostics_color) &&
5189 !O.matches(options::OPT_fno_color_diagnostics) &&
5190 !O.matches(options::OPT_fno_diagnostics_color) &&
5191 !O.matches(options::OPT_fdiagnostics_color_EQ))
5192 continue;
5193
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005194 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005195 if (O.matches(options::OPT_fcolor_diagnostics) ||
5196 O.matches(options::OPT_fdiagnostics_color)) {
5197 ShowColors = Colors_On;
5198 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5199 O.matches(options::OPT_fno_diagnostics_color)) {
5200 ShowColors = Colors_Off;
5201 } else {
5202 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005203 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005204 if (value == "always")
5205 ShowColors = Colors_On;
5206 else if (value == "never")
5207 ShowColors = Colors_Off;
5208 else if (value == "auto")
5209 ShowColors = Colors_Auto;
5210 else
5211 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005212 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005213 }
5214 }
5215 if (ShowColors == Colors_On ||
5216 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005217 CmdArgs.push_back("-fcolor-diagnostics");
5218
Nico Rieck7857d462013-09-11 00:38:02 +00005219 if (Args.hasArg(options::OPT_fansi_escape_codes))
5220 CmdArgs.push_back("-fansi-escape-codes");
5221
Daniel Dunbardb097022009-06-08 21:13:54 +00005222 if (!Args.hasFlag(options::OPT_fshow_source_location,
5223 options::OPT_fno_show_source_location))
5224 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005225
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005226 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005227 true))
5228 CmdArgs.push_back("-fno-show-column");
5229
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005230 if (!Args.hasFlag(options::OPT_fspell_checking,
5231 options::OPT_fno_spell_checking))
5232 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005233
Chad Rosierc8e56e82012-12-05 21:08:21 +00005234 // -fno-asm-blocks is default.
5235 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5236 false))
5237 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005238
Steven Wucb0d13f2015-01-16 23:05:28 +00005239 // -fgnu-inline-asm is default.
5240 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5241 options::OPT_fno_gnu_inline_asm, true))
5242 CmdArgs.push_back("-fno-gnu-inline-asm");
5243
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005244 // Enable vectorization per default according to the optimization level
5245 // selected. For optimization levels that want vectorization we use the alias
5246 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005247 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005248 OptSpecifier VectorizeAliasOption =
5249 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005250 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005251 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005252 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005253
Chad Rosier136d67d2014-04-28 19:30:57 +00005254 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005255 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005256 OptSpecifier SLPVectAliasOption =
5257 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005258 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005259 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005260 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005261
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005262 // -fno-slp-vectorize-aggressive is default.
5263 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005264 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005265 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005266
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005267 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5268 A->render(Args, CmdArgs);
5269
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005270 // -fdollars-in-identifiers default varies depending on platform and
5271 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005272 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005273 options::OPT_fno_dollars_in_identifiers)) {
5274 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005275 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005276 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005277 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005278 }
5279
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005280 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5281 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005282 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005283 options::OPT_fno_unit_at_a_time)) {
5284 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005285 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005286 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005287
Eli Friedman055c9702011-11-02 01:53:16 +00005288 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5289 options::OPT_fno_apple_pragma_pack, false))
5290 CmdArgs.push_back("-fapple-pragma-pack");
5291
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005292 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005293 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5294 // by default.
5295 if (getToolChain().getArch() == llvm::Triple::le32) {
5296 CmdArgs.push_back("-fno-math-builtin");
5297 }
5298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005299// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5300//
5301// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005302#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005303 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005304 (getToolChain().getArch() == llvm::Triple::arm ||
5305 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005306 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5307 CmdArgs.push_back("-fno-builtin-strcat");
5308 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5309 CmdArgs.push_back("-fno-builtin-strcpy");
5310 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005311#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005312
Justin Bognera88f0122014-06-20 22:59:50 +00005313 // Enable rewrite includes if the user's asked for it or if we're generating
5314 // diagnostics.
5315 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5316 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005317 if (Args.hasFlag(options::OPT_frewrite_includes,
5318 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005319 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005320 CmdArgs.push_back("-frewrite-includes");
5321
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005322 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005323 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005324 options::OPT_traditional_cpp)) {
5325 if (isa<PreprocessJobAction>(JA))
5326 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005327 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005328 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005329 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005330
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005331 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005332 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005333
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005334 // Handle serialized diagnostics.
5335 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5336 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005337 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005338 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005339
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005340 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5341 CmdArgs.push_back("-fretain-comments-from-system-headers");
5342
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005343 // Forward -fcomment-block-commands to -cc1.
5344 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005345 // Forward -fparse-all-comments to -cc1.
5346 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005347
John Brawnad31ace2015-09-23 13:55:40 +00005348 // Turn -fplugin=name.so into -load name.so
5349 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5350 CmdArgs.push_back("-load");
5351 CmdArgs.push_back(A->getValue());
5352 A->claim();
5353 }
5354
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005355 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5356 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005357 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005358 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5359 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005360
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005361 // We translate this by hand to the -cc1 argument, since nightly test uses
5362 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005363 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005364 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005365 } else
Sean Silva14facf32015-06-09 01:57:17 +00005366 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005367 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005368
Bob Wilson23a55f12014-12-21 07:00:00 +00005369 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005370 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5371 // by the frontend.
5372 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5373 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005374
Daniel Dunbard67a3222009-03-30 06:36:42 +00005375 if (Output.getType() == types::TY_Dependencies) {
5376 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005377 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005378 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005379 CmdArgs.push_back(Output.getFilename());
5380 } else {
5381 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005382 }
5383
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005384 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005385
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005386 if (Input.isFilename())
5387 CmdArgs.push_back(Input.getFilename());
5388 else
5389 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005390
Chris Lattnere9d7d782009-11-03 19:50:27 +00005391 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5392
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005393 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005394
5395 // Optionally embed the -cc1 level arguments into the debug info, for build
5396 // analysis.
5397 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005398 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005399 for (const auto &Arg : Args)
5400 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005401
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005402 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005403 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005404 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005405 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005406 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005407 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005408 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005409 }
5410 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005411 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005412 }
5413
Eric Christopherd3804002013-02-22 20:12:52 +00005414 // Add the split debug info name to the command lines here so we
5415 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005416 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005417 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5418 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005419 const char *SplitDwarfOut;
5420 if (SplitDwarf) {
5421 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005422 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005423 CmdArgs.push_back(SplitDwarfOut);
5424 }
5425
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005426 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5427 // Include them with -fcuda-include-gpubinary.
5428 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005429 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005430 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005431 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005432 }
5433
Eric Christopherd3804002013-02-22 20:12:52 +00005434 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005435 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005436 Output.getType() == types::TY_Object &&
5437 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005438 auto CLCommand =
5439 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005440 C.addCommand(llvm::make_unique<FallbackCommand>(
5441 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005442 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005443 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005444 }
5445
Eric Christopherf1545832013-02-22 23:50:16 +00005446 // Handle the debug info splitting at object creation time if we're
5447 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005448 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005449 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005450 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005451
Roman Divacky178e01602011-02-10 16:52:03 +00005452 if (Arg *A = Args.getLastArg(options::OPT_pg))
5453 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005454 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5455 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005456
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005457 // Claim some arguments which clang supports automatically.
5458
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005459 // -fpch-preprocess is used with gcc to add a special marker in the output to
5460 // include the PCH file. Clang's PTH solution is completely transparent, so we
5461 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005462 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005463
Daniel Dunbar17731772009-03-23 19:03:36 +00005464 // Claim some arguments which clang doesn't support, but we don't
5465 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005466 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5467 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005468
Rafael Espindolab0092d72013-09-04 19:37:35 +00005469 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005470 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005471}
5472
John McCall5fb5df92012-06-20 06:18:46 +00005473/// Add options related to the Objective-C runtime/ABI.
5474///
5475/// Returns true if the runtime is non-fragile.
5476ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5477 ArgStringList &cmdArgs,
5478 RewriteKind rewriteKind) const {
5479 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005480 Arg *runtimeArg =
5481 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5482 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005483
5484 // Just forward -fobjc-runtime= to the frontend. This supercedes
5485 // options about fragility.
5486 if (runtimeArg &&
5487 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5488 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005489 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005490 if (runtime.tryParse(value)) {
5491 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005492 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005493 }
5494
5495 runtimeArg->render(args, cmdArgs);
5496 return runtime;
5497 }
5498
5499 // Otherwise, we'll need the ABI "version". Version numbers are
5500 // slightly confusing for historical reasons:
5501 // 1 - Traditional "fragile" ABI
5502 // 2 - Non-fragile ABI, version 1
5503 // 3 - Non-fragile ABI, version 2
5504 unsigned objcABIVersion = 1;
5505 // If -fobjc-abi-version= is present, use that to set the version.
5506 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005507 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005508 if (value == "1")
5509 objcABIVersion = 1;
5510 else if (value == "2")
5511 objcABIVersion = 2;
5512 else if (value == "3")
5513 objcABIVersion = 3;
5514 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005515 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005516 } else {
5517 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005518 bool nonFragileABIIsDefault =
5519 (rewriteKind == RK_NonFragile ||
5520 (rewriteKind == RK_None &&
5521 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005522 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5523 options::OPT_fno_objc_nonfragile_abi,
5524 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005525// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005526#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5527 unsigned nonFragileABIVersion = 1;
5528#else
5529 unsigned nonFragileABIVersion = 2;
5530#endif
5531
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005532 if (Arg *abiArg =
5533 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005534 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005535 if (value == "1")
5536 nonFragileABIVersion = 1;
5537 else if (value == "2")
5538 nonFragileABIVersion = 2;
5539 else
5540 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005541 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005542 }
5543
5544 objcABIVersion = 1 + nonFragileABIVersion;
5545 } else {
5546 objcABIVersion = 1;
5547 }
5548 }
5549
5550 // We don't actually care about the ABI version other than whether
5551 // it's non-fragile.
5552 bool isNonFragile = objcABIVersion != 1;
5553
5554 // If we have no runtime argument, ask the toolchain for its default runtime.
5555 // However, the rewriter only really supports the Mac runtime, so assume that.
5556 ObjCRuntime runtime;
5557 if (!runtimeArg) {
5558 switch (rewriteKind) {
5559 case RK_None:
5560 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5561 break;
5562 case RK_Fragile:
5563 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5564 break;
5565 case RK_NonFragile:
5566 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5567 break;
5568 }
5569
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005571 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5572 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005573 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005574 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5575
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005576 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005577 } else {
5578 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5579 }
5580
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005581 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005582 } else {
5583 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005584 // Legacy behaviour is to target the gnustep runtime if we are i
5585 // non-fragile mode or the GCC runtime in fragile mode.
5586 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005587 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005588 else
5589 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005590 }
5591
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005592 cmdArgs.push_back(
5593 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005594 return runtime;
5595}
5596
Reid Klecknerc542d372014-06-27 17:02:02 +00005597static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5598 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5599 I += HaveDash;
5600 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005601}
Reid Klecknerc542d372014-06-27 17:02:02 +00005602
Benjamin Kramere003ca22015-10-28 13:54:16 +00005603namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005604struct EHFlags {
5605 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5606 bool Synch;
5607 bool Asynch;
5608 bool NoExceptC;
5609};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005610} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005611
5612/// /EH controls whether to run destructor cleanups when exceptions are
5613/// thrown. There are three modifiers:
5614/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5615/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5616/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5617/// - c: Assume that extern "C" functions are implicitly noexcept. This
5618/// modifier is an optimization, so we ignore it for now.
5619/// The default is /EHs-c-, meaning cleanups are disabled.
5620static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5621 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005622
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005623 std::vector<std::string> EHArgs =
5624 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005625 for (auto EHVal : EHArgs) {
5626 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5627 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005628 case 'a':
5629 EH.Asynch = maybeConsumeDash(EHVal, I);
5630 continue;
5631 case 'c':
5632 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5633 continue;
5634 case 's':
5635 EH.Synch = maybeConsumeDash(EHVal, I);
5636 continue;
5637 default:
5638 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005639 }
5640 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5641 break;
5642 }
5643 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005644
Reid Klecknerc542d372014-06-27 17:02:02 +00005645 return EH;
5646}
5647
Douglas Katzman3459ce22015-10-08 04:24:12 +00005648void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5649 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5650 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005651 unsigned RTOptionID = options::OPT__SLASH_MT;
5652
Hans Wennborgf1a74252013-09-10 20:18:04 +00005653 if (Args.hasArg(options::OPT__SLASH_LDd))
5654 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5655 // but defining _DEBUG is sticky.
5656 RTOptionID = options::OPT__SLASH_MTd;
5657
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005658 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005659 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005660
David Majnemere2afb472015-07-24 06:49:13 +00005661 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005662 switch (RTOptionID) {
5663 case options::OPT__SLASH_MD:
5664 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005665 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005666 CmdArgs.push_back("-D_MT");
5667 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005668 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005669 break;
5670 case options::OPT__SLASH_MDd:
5671 CmdArgs.push_back("-D_DEBUG");
5672 CmdArgs.push_back("-D_MT");
5673 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005674 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005675 break;
5676 case options::OPT__SLASH_MT:
5677 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005678 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005679 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005680 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005681 break;
5682 case options::OPT__SLASH_MTd:
5683 CmdArgs.push_back("-D_DEBUG");
5684 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005685 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005686 break;
5687 default:
5688 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005689 }
5690
David Majnemere2afb472015-07-24 06:49:13 +00005691 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5692 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5693 } else {
5694 CmdArgs.push_back(FlagForCRT.data());
5695
5696 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5697 // users want. The /Za flag to cl.exe turns this off, but it's not
5698 // implemented in clang.
5699 CmdArgs.push_back("--dependent-lib=oldnames");
5700 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005701
Hans Wennborg8858a032014-07-21 23:42:07 +00005702 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5703 // would produce interleaved output, so ignore /showIncludes in such cases.
5704 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5705 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5706 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005707
David Majnemerf6072342014-07-01 22:24:56 +00005708 // This controls whether or not we emit RTTI data for polymorphic types.
5709 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5710 /*default=*/false))
5711 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005712
Reid Kleckner124955a2015-08-05 18:51:13 +00005713 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005714 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005715 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5716 // If we are emitting CV but not DWARF, don't build information that LLVM
5717 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005718 if (*EmitCodeView && !EmitDwarf)
5719 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5720 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005721 CmdArgs.push_back("-gcodeview");
5722
Reid Klecknerc542d372014-06-27 17:02:02 +00005723 const Driver &D = getToolChain().getDriver();
5724 EHFlags EH = parseClangCLEHFlags(D, Args);
5725 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005726 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005727 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005728 CmdArgs.push_back("-fexceptions");
5729 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005730
Hans Wennborge50cec32014-06-13 20:59:54 +00005731 // /EP should expand to -E -P.
5732 if (Args.hasArg(options::OPT__SLASH_EP)) {
5733 CmdArgs.push_back("-E");
5734 CmdArgs.push_back("-P");
5735 }
5736
David Majnemera5b195a2015-02-14 01:35:12 +00005737 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005738 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5739 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005740 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5741 else
5742 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5743
5744 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5745 VolatileOptionID = A->getOption().getID();
5746
5747 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5748 CmdArgs.push_back("-fms-volatile");
5749
David Majnemer86c318f2014-02-11 21:05:00 +00005750 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5751 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5752 if (MostGeneralArg && BestCaseArg)
5753 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5754 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5755
5756 if (MostGeneralArg) {
5757 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5758 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5759 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5760
5761 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5762 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5763 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5764 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5765 << FirstConflict->getAsString(Args)
5766 << SecondConflict->getAsString(Args);
5767
5768 if (SingleArg)
5769 CmdArgs.push_back("-fms-memptr-rep=single");
5770 else if (MultipleArg)
5771 CmdArgs.push_back("-fms-memptr-rep=multiple");
5772 else
5773 CmdArgs.push_back("-fms-memptr-rep=virtual");
5774 }
5775
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005776 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5777 A->render(Args, CmdArgs);
5778
Hans Wennborg81f74482013-09-10 01:07:07 +00005779 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5780 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005781 if (Args.hasArg(options::OPT__SLASH_fallback))
5782 CmdArgs.push_back("msvc-fallback");
5783 else
5784 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005785 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005786}
5787
Douglas Katzman95354292015-06-23 20:42:09 +00005788visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005789 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005790 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005791 return CLFallback.get();
5792}
5793
Daniel Sanders7f933f42015-01-30 17:35:23 +00005794void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5795 ArgStringList &CmdArgs) const {
5796 StringRef CPUName;
5797 StringRef ABIName;
5798 const llvm::Triple &Triple = getToolChain().getTriple();
5799 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5800
5801 CmdArgs.push_back("-target-abi");
5802 CmdArgs.push_back(ABIName.data());
5803}
5804
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005805void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005806 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005807 const ArgList &Args,
5808 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005809 ArgStringList CmdArgs;
5810
5811 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5812 const InputInfo &Input = Inputs[0];
5813
James Y Knight2db38f32015-08-15 03:45:25 +00005814 std::string TripleStr =
5815 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5816 const llvm::Triple Triple(TripleStr);
5817
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005818 // Don't warn about "clang -w -c foo.s"
5819 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005820 // and "clang -emit-llvm -c foo.s"
5821 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005822
Rafael Espindola577637a2015-01-03 00:06:04 +00005823 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005824
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005825 // Invoke ourselves in -cc1as mode.
5826 //
5827 // FIXME: Implement custom jobs for internal actions.
5828 CmdArgs.push_back("-cc1as");
5829
5830 // Add the "effective" target triple.
5831 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005832 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5833
5834 // Set the output mode, we currently only expect to be used as a real
5835 // assembler.
5836 CmdArgs.push_back("-filetype");
5837 CmdArgs.push_back("obj");
5838
Eric Christopher45f2e712012-12-18 00:31:10 +00005839 // Set the main file name, so that debug info works even with
5840 // -save-temps or preprocessed assembly.
5841 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005842 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005843
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005844 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005845 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005846 if (!CPU.empty()) {
5847 CmdArgs.push_back("-target-cpu");
5848 CmdArgs.push_back(Args.MakeArgString(CPU));
5849 }
5850
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005851 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005852 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005853
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005854 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005855 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005856
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005857 // Pass along any -I options so we get proper .include search paths.
5858 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5859
Eric Christopherfc3ee562012-01-10 00:38:01 +00005860 // Determine the original source input.
5861 const Action *SourceAction = &JA;
5862 while (SourceAction->getKind() != Action::InputClass) {
5863 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5864 SourceAction = SourceAction->getInputs()[0];
5865 }
5866
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005867 // Forward -g and handle debug info related flags, assuming we are dealing
5868 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005869 if (SourceAction->getType() == types::TY_Asm ||
5870 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005871 bool WantDebug = false;
5872 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005873 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005874 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5875 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005876 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005877 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005878 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005879 if (DwarfVersion == 0)
5880 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005881 RenderDebugEnablingArgs(Args, CmdArgs,
5882 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5883 : CodeGenOptions::NoDebugInfo),
5884 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005885
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005886 // Add the -fdebug-compilation-dir flag if needed.
5887 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005888
5889 // Set the AT_producer to the clang version when using the integrated
5890 // assembler on assembly source files.
5891 CmdArgs.push_back("-dwarf-debug-producer");
5892 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005893
5894 // And pass along -I options
5895 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005896 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005897
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005898 // Handle -fPIC et al -- the relocation-model affects the assembler
5899 // for some targets.
5900 llvm::Reloc::Model RelocationModel;
5901 unsigned PICLevel;
5902 bool IsPIE;
5903 std::tie(RelocationModel, PICLevel, IsPIE) =
5904 ParsePICArgs(getToolChain(), Triple, Args);
5905
5906 const char *RMName = RelocationModelName(RelocationModel);
5907 if (RMName) {
5908 CmdArgs.push_back("-mrelocation-model");
5909 CmdArgs.push_back(RMName);
5910 }
5911
Kevin Enderby292dc082011-12-22 19:31:58 +00005912 // Optionally embed the -cc1as level arguments into the debug info, for build
5913 // analysis.
5914 if (getToolChain().UseDwarfDebugFlags()) {
5915 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005916 for (const auto &Arg : Args)
5917 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005918
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005919 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005920 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5921 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005922 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005923 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005924 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005925 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005926 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005927 }
5928 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005929 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005930 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005931
5932 // FIXME: Add -static support, once we have it.
5933
Daniel Sanders7f933f42015-01-30 17:35:23 +00005934 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005935 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005936 default:
5937 break;
5938
5939 case llvm::Triple::mips:
5940 case llvm::Triple::mipsel:
5941 case llvm::Triple::mips64:
5942 case llvm::Triple::mips64el:
5943 AddMIPSTargetArgs(Args, CmdArgs);
5944 break;
5945 }
5946
David Blaikie372d9502014-01-17 03:17:40 +00005947 // Consume all the warning flags. Usually this would be handled more
5948 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5949 // doesn't handle that so rather than warning about unused flags that are
5950 // actually used, we'll lie by omission instead.
5951 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005952 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5953 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005954
David Blaikie9260ed62013-07-25 21:19:01 +00005955 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5956 getToolChain().getDriver());
5957
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005958 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005959
5960 assert(Output.isFilename() && "Unexpected lipo output.");
5961 CmdArgs.push_back("-o");
5962 CmdArgs.push_back(Output.getFilename());
5963
Daniel Dunbarb440f562010-08-02 02:38:21 +00005964 assert(Input.isFilename() && "Invalid input.");
5965 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005966
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005967 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005968 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005969
5970 // Handle the debug info splitting at object creation time if we're
5971 // creating an object.
5972 // TODO: Currently only works on linux with newer objcopy.
5973 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005974 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005975 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005976 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005977}
5978
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005979void GnuTool::anchor() {}
5980
Daniel Dunbara3246a02009-03-18 08:07:30 +00005981void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005982 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005983 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005984 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005985 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005986 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005987
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005988 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005989 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005990 // Don't forward any -g arguments to assembly steps.
5991 if (isa<AssembleJobAction>(JA) &&
5992 A->getOption().matches(options::OPT_g_Group))
5993 continue;
5994
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005995 // Don't forward any -W arguments to assembly and link steps.
5996 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5997 A->getOption().matches(options::OPT_W_Group))
5998 continue;
5999
Daniel Dunbar2da02722009-03-19 07:55:12 +00006000 // It is unfortunate that we have to claim here, as this means
6001 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00006002 // platforms using a generic gcc, even if we are just using gcc
6003 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006004 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006005 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006006 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006007 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006008
Daniel Dunbar4e295052010-01-25 22:35:08 +00006009 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006010
6011 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006012 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006013 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006014 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006015 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006016 }
6017
Daniel Dunbar5716d872009-05-02 21:41:52 +00006018 // Try to force gcc to match the tool chain we want, if we recognize
6019 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006020 //
6021 // FIXME: The triple class should directly provide the information we want
6022 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006023 switch (getToolChain().getArch()) {
6024 default:
6025 break;
6026 case llvm::Triple::x86:
6027 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006028 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006029 break;
6030 case llvm::Triple::x86_64:
6031 case llvm::Triple::ppc64:
6032 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006033 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006034 break;
6035 case llvm::Triple::sparcel:
6036 CmdArgs.push_back("-EL");
6037 break;
6038 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006039
Daniel Dunbarb440f562010-08-02 02:38:21 +00006040 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006041 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006042 CmdArgs.push_back(Output.getFilename());
6043 } else {
6044 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006045 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006046 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006048 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006049
6050 // Only pass -x if gcc will understand it; otherwise hope gcc
6051 // understands the suffix correctly. The main use case this would go
6052 // wrong in is for linker inputs if they happened to have an odd
6053 // suffix; really the only way to get this to happen is a command
6054 // like '-x foobar a.c' which will treat a.c like a linker input.
6055 //
6056 // FIXME: For the linker case specifically, can we safely convert
6057 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006058 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006059 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006060 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006061 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006062 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006063 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006064 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006065 else if (II.getType() == types::TY_ModuleFile)
6066 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006067 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006068
Daniel Dunbara3246a02009-03-18 08:07:30 +00006069 if (types::canTypeBeUserSpecified(II.getType())) {
6070 CmdArgs.push_back("-x");
6071 CmdArgs.push_back(types::getTypeName(II.getType()));
6072 }
6073
Daniel Dunbarb440f562010-08-02 02:38:21 +00006074 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006075 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006076 else {
6077 const Arg &A = II.getInputArg();
6078
6079 // Reverse translate some rewritten options.
6080 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6081 CmdArgs.push_back("-lstdc++");
6082 continue;
6083 }
6084
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006085 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006086 A.render(Args, CmdArgs);
6087 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006088 }
6089
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006090 const std::string customGCCName = D.getCCCGenericGCCName();
6091 const char *GCCName;
6092 if (!customGCCName.empty())
6093 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006094 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006095 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006096 } else
6097 GCCName = "gcc";
6098
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006099 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006100 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006101}
6102
Douglas Katzman95354292015-06-23 20:42:09 +00006103void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6104 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006105 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006106}
6107
Douglas Katzman95354292015-06-23 20:42:09 +00006108void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6109 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006110 const Driver &D = getToolChain().getDriver();
6111
Eric Christophercc7ff502015-01-29 00:56:17 +00006112 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006113 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006114 case types::TY_LLVM_IR:
6115 case types::TY_LTO_IR:
6116 case types::TY_LLVM_BC:
6117 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006118 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006119 break;
6120 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006121 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006122 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006123 case types::TY_Nothing:
6124 CmdArgs.push_back("-fsyntax-only");
6125 break;
6126 default:
6127 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006128 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006129}
6130
Douglas Katzman95354292015-06-23 20:42:09 +00006131void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6132 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006133 // The types are (hopefully) good enough.
6134}
6135
Tony Linthicum76329bf2011-12-12 21:14:55 +00006136// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006137void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006138 ArgStringList &CmdArgs) const {
6139}
6140
Douglas Katzman95354292015-06-23 20:42:09 +00006141void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6142 const InputInfo &Output,
6143 const InputInfoList &Inputs,
6144 const ArgList &Args,
6145 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006146 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006147
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006148 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6149 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006150 ArgStringList CmdArgs;
6151
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006152 std::string MArchString = "-march=hexagon";
6153 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006154
6155 RenderExtraToolArgs(JA, CmdArgs);
6156
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006157 std::string AsName = "hexagon-llvm-mc";
6158 std::string MCpuString = "-mcpu=hexagon" +
6159 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6160 CmdArgs.push_back("-filetype=obj");
6161 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6162
Tony Linthicum76329bf2011-12-12 21:14:55 +00006163 if (Output.isFilename()) {
6164 CmdArgs.push_back("-o");
6165 CmdArgs.push_back(Output.getFilename());
6166 } else {
6167 assert(Output.isNothing() && "Unexpected output");
6168 CmdArgs.push_back("-fsyntax-only");
6169 }
6170
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006171 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6172 std::string N = llvm::utostr(G.getValue());
6173 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6174 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006176 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006177
Tony Linthicum76329bf2011-12-12 21:14:55 +00006178 // Only pass -x if gcc will understand it; otherwise hope gcc
6179 // understands the suffix correctly. The main use case this would go
6180 // wrong in is for linker inputs if they happened to have an odd
6181 // suffix; really the only way to get this to happen is a command
6182 // like '-x foobar a.c' which will treat a.c like a linker input.
6183 //
6184 // FIXME: For the linker case specifically, can we safely convert
6185 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006186 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006187 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006188 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006189 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006190 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006191 else if (II.getType() == types::TY_AST)
6192 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006193 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006194 else if (II.getType() == types::TY_ModuleFile)
6195 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006196 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006197
6198 if (II.isFilename())
6199 CmdArgs.push_back(II.getFilename());
6200 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006201 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006202 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006203 II.getInputArg().render(Args, CmdArgs);
6204 }
6205
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006206 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006207 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006209
Douglas Katzman95354292015-06-23 20:42:09 +00006210void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6211 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006212}
6213
Douglas Katzman54366072015-07-27 16:53:08 +00006214static void
6215constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006216 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006217 const InputInfo &Output, const InputInfoList &Inputs,
6218 const ArgList &Args, ArgStringList &CmdArgs,
6219 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006220
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006221 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006222
Matthew Curtise689b052012-12-06 15:46:07 +00006223 //----------------------------------------------------------------------------
6224 //
6225 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006226 bool IsStatic = Args.hasArg(options::OPT_static);
6227 bool IsShared = Args.hasArg(options::OPT_shared);
6228 bool IsPIE = Args.hasArg(options::OPT_pie);
6229 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6230 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6231 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6232 bool UseG0 = false;
6233 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006234
Matthew Curtise689b052012-12-06 15:46:07 +00006235 //----------------------------------------------------------------------------
6236 // Silence warnings for various options
6237 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006238 Args.ClaimAllArgs(options::OPT_g_Group);
6239 Args.ClaimAllArgs(options::OPT_emit_llvm);
6240 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6241 // handled somewhere else.
6242 Args.ClaimAllArgs(options::OPT_static_libgcc);
6243
6244 //----------------------------------------------------------------------------
6245 //
6246 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006247 if (Args.hasArg(options::OPT_s))
6248 CmdArgs.push_back("-s");
6249
6250 if (Args.hasArg(options::OPT_r))
6251 CmdArgs.push_back("-r");
6252
6253 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006254 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006256 CmdArgs.push_back("-march=hexagon");
6257 std::string CpuVer =
6258 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6259 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6260 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006261
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006262 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006263 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006264 // The following should be the default, but doing as hexagon-gcc does.
6265 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006266 }
6267
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006268 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006269 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006270
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006271 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006272 CmdArgs.push_back("-pie");
6273
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006274 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6275 std::string N = llvm::utostr(G.getValue());
6276 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6277 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006278 }
6279
Matthew Curtise689b052012-12-06 15:46:07 +00006280 //----------------------------------------------------------------------------
6281 //
6282 //----------------------------------------------------------------------------
6283 CmdArgs.push_back("-o");
6284 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006285
Matthew Curtise689b052012-12-06 15:46:07 +00006286 //----------------------------------------------------------------------------
6287 // moslib
6288 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006289 std::vector<std::string> OsLibs;
6290 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006291
Sean Silva14facf32015-06-09 01:57:17 +00006292 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6293 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006294 OsLibs.emplace_back(A->getValue());
6295 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006296 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006297 if (OsLibs.empty()) {
6298 OsLibs.push_back("standalone");
6299 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006300 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006301
Matthew Curtise689b052012-12-06 15:46:07 +00006302 //----------------------------------------------------------------------------
6303 // Start Files
6304 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006305 const std::string MCpuSuffix = "/" + CpuVer;
6306 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6307 const std::string RootDir =
6308 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6309 const std::string StartSubDir =
6310 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006311
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006312 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6313 const char *Name) -> std::string {
6314 std::string RelName = SubDir + Name;
6315 std::string P = HTC.GetFilePath(RelName.c_str());
6316 if (llvm::sys::fs::exists(P))
6317 return P;
6318 return RootDir + RelName;
6319 };
6320
6321 if (IncStdLib && IncStartFiles) {
6322 if (!IsShared) {
6323 if (HasStandalone) {
6324 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6325 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006326 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006327 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6328 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006329 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006330 std::string Init = UseShared
6331 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6332 : Find(RootDir, StartSubDir, "/init.o");
6333 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006334 }
6335
6336 //----------------------------------------------------------------------------
6337 // Library Search Paths
6338 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006339 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6340 for (const auto &LibPath : LibPaths)
6341 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006342
6343 //----------------------------------------------------------------------------
6344 //
6345 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006346 Args.AddAllArgs(CmdArgs,
6347 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6348 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006349
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006351
6352 //----------------------------------------------------------------------------
6353 // Libraries
6354 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006355 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006356 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006357 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006358 CmdArgs.push_back("-lm");
6359 }
6360
6361 CmdArgs.push_back("--start-group");
6362
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006363 if (!IsShared) {
6364 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006365 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006366 CmdArgs.push_back("-lc");
6367 }
6368 CmdArgs.push_back("-lgcc");
6369
6370 CmdArgs.push_back("--end-group");
6371 }
6372
6373 //----------------------------------------------------------------------------
6374 // End files
6375 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006376 if (IncStdLib && IncStartFiles) {
6377 std::string Fini = UseShared
6378 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6379 : Find(RootDir, StartSubDir, "/fini.o");
6380 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006381 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006382}
6383
Douglas Katzman95354292015-06-23 20:42:09 +00006384void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6385 const InputInfo &Output,
6386 const InputInfoList &Inputs,
6387 const ArgList &Args,
6388 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006389 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006390
6391 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006392 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006393 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006394
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006395 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006396 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006397 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398}
6399// Hexagon tools end.
6400
Tom Stellard8fa33092015-07-18 01:49:05 +00006401void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6402 const InputInfo &Output,
6403 const InputInfoList &Inputs,
6404 const ArgList &Args,
6405 const char *LinkingOutput) const {
6406
6407 std::string Linker = getToolChain().GetProgramPath(getShortName());
6408 ArgStringList CmdArgs;
6409 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006410 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006411 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006412 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006413 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6414 CmdArgs.push_back("-o");
6415 CmdArgs.push_back(Output.getFilename());
6416 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6417 CmdArgs, Inputs));
6418}
6419// AMDGPU tools end.
6420
Renato Golin7c542b42015-07-27 23:44:45 +00006421const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006422 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006423 if (!Arch.empty())
6424 MArch = Arch;
6425 else
Bernard Ogden31561762013-12-12 13:27:11 +00006426 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006427 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006428
6429 // Handle -march=native.
6430 if (MArch == "native") {
6431 std::string CPU = llvm::sys::getHostCPUName();
6432 if (CPU != "generic") {
6433 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006434 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006435 // If there is no valid architecture suffix for this CPU we don't know how
6436 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006437 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006438 MArch = "";
6439 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006440 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006441 }
6442 }
6443
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006444 return MArch;
6445}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006446
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006447/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006448StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006449 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006450 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6451 // here means an -march=native that we can't handle, so instead return no CPU.
6452 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006453 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006454
John Brawna95c1a82015-05-08 12:52:18 +00006455 // We need to return an empty string here on invalid MArch values as the
6456 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006457 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006458}
6459
6460/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006461std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006462 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006463 // FIXME: Warn on inconsistent use of -mcpu and -march.
6464 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006465 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006466 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006467 // Handle -mcpu=native.
6468 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006469 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006470 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006471 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006472 }
6473
Renato Goline17c5802015-07-27 23:44:42 +00006474 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006475}
6476
6477/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006478/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006479// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006480StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6481 const llvm::Triple &Triple) {
6482 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006483 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006484 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006485 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006486 if (ArchKind == llvm::ARM::AK_INVALID)
6487 // In case of generic Arch, i.e. "arm",
6488 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006489 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006490 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006491 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6492 // armv7k triple if it's actually been specified via "-arch armv7k".
6493 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006494 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006495 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006496 }
Renato Golin3c007252015-05-28 15:05:53 +00006497 if (ArchKind == llvm::ARM::AK_INVALID)
6498 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006499 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006500}
6501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006502void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006503 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006504 if (Args.hasArg(options::OPT_r))
6505 return;
6506
John Brawn94fd9632015-05-21 12:19:49 +00006507 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6508 // to generate BE-8 executables.
6509 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6510 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006511}
6512
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006513mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006514 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6515 // was first introduced in Release 3. However, other compilers have
6516 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006517 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6518 .Case("mips1", NanLegacy)
6519 .Case("mips2", NanLegacy)
6520 .Case("mips3", NanLegacy)
6521 .Case("mips4", NanLegacy)
6522 .Case("mips5", NanLegacy)
6523 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006524 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006525 .Case("mips32r3", NanLegacy | Nan2008)
6526 .Case("mips32r5", NanLegacy | Nan2008)
6527 .Case("mips32r6", Nan2008)
6528 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006529 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006530 .Case("mips64r3", NanLegacy | Nan2008)
6531 .Case("mips64r5", NanLegacy | Nan2008)
6532 .Case("mips64r6", Nan2008)
6533 .Default(NanLegacy);
6534}
6535
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006536bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6537 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6538 return A && (A->getValue() == StringRef(Value));
6539}
6540
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006541bool mips::isUCLibc(const ArgList &Args) {
6542 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006543 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006544}
6545
Daniel Sanders2bf13662014-07-10 14:40:57 +00006546bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006547 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6548 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006549 .Case("2008", true)
6550 .Case("legacy", false)
6551 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006552
6553 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006554 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006555 .Cases("mips32r6", "mips64r6", true)
6556 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006557
6558 return false;
6559}
6560
Daniel Sanders379d44b2014-07-16 11:52:23 +00006561bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006562 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006563 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006564 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006565 return false;
6566
6567 if (ABIName != "32")
6568 return false;
6569
Toma Tabacu94ea6862015-06-16 13:54:13 +00006570 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6571 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006572 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006573 return false;
6574
Daniel Sanders379d44b2014-07-16 11:52:23 +00006575 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006576 .Cases("mips2", "mips3", "mips4", "mips5", true)
6577 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6578 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6579 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006580}
6581
Toma Tabacu94ea6862015-06-16 13:54:13 +00006582bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6583 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006584 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006585 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6586
6587 // FPXX shouldn't be used if -msingle-float is present.
6588 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6589 options::OPT_mdouble_float))
6590 if (A->getOption().matches(options::OPT_msingle_float))
6591 UseFPXX = false;
6592
6593 return UseFPXX;
6594}
6595
Tim Northover157d9112014-01-16 08:48:16 +00006596llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006597 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6598 // archs which Darwin doesn't use.
6599
6600 // The matching this routine does is fairly pointless, since it is neither the
6601 // complete architecture list, nor a reasonable subset. The problem is that
6602 // historically the driver driver accepts this and also ties its -march=
6603 // handling to the architecture name, so we need to be careful before removing
6604 // support for it.
6605
6606 // This code must be kept in sync with Clang's Darwin specific argument
6607 // translation.
6608
6609 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006610 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6611 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6612 .Case("ppc64", llvm::Triple::ppc64)
6613 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6614 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6615 llvm::Triple::x86)
6616 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6617 // This is derived from the driver driver.
6618 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6619 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6620 .Cases("armv7s", "xscale", llvm::Triple::arm)
6621 .Case("arm64", llvm::Triple::aarch64)
6622 .Case("r600", llvm::Triple::r600)
6623 .Case("amdgcn", llvm::Triple::amdgcn)
6624 .Case("nvptx", llvm::Triple::nvptx)
6625 .Case("nvptx64", llvm::Triple::nvptx64)
6626 .Case("amdil", llvm::Triple::amdil)
6627 .Case("spir", llvm::Triple::spir)
6628 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006629}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006630
Tim Northover157d9112014-01-16 08:48:16 +00006631void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006632 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006633 T.setArch(Arch);
6634
6635 if (Str == "x86_64h")
6636 T.setArchName(Str);
6637 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6638 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006639 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006640 }
6641}
6642
Bob Wilsondecc03e2012-11-23 06:14:39 +00006643const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006644 const InputInfo &Input) {
6645 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006646}
6647
Bob Wilsondecc03e2012-11-23 06:14:39 +00006648const char *Clang::getBaseInputStem(const ArgList &Args,
6649 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006650 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006651
Chris Lattner906bb902011-01-16 08:14:11 +00006652 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006653 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006654
6655 return Str;
6656}
6657
Bob Wilsondecc03e2012-11-23 06:14:39 +00006658const char *Clang::getDependencyFileName(const ArgList &Args,
6659 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006660 // FIXME: Think about this more.
6661 std::string Res;
6662
6663 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006664 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006665 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006666 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006667 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006668 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006669 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006670}
6671
Douglas Katzman95354292015-06-23 20:42:09 +00006672void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6673 const InputInfo &Output,
6674 const InputInfoList &Inputs,
6675 const ArgList &Args,
6676 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006677 const ToolChain &ToolChain = getToolChain();
6678 const Driver &D = ToolChain.getDriver();
6679 ArgStringList CmdArgs;
6680
6681 // Silence warning for "clang -g foo.o -o foo"
6682 Args.ClaimAllArgs(options::OPT_g_Group);
6683 // and "clang -emit-llvm foo.o -o foo"
6684 Args.ClaimAllArgs(options::OPT_emit_llvm);
6685 // and for "clang -w foo.o -o foo". Other warning options are already
6686 // handled somewhere else.
6687 Args.ClaimAllArgs(options::OPT_w);
6688
6689 if (!D.SysRoot.empty())
6690 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6691
6692 // CloudABI only supports static linkage.
6693 CmdArgs.push_back("-Bstatic");
6694 CmdArgs.push_back("--eh-frame-hdr");
6695 CmdArgs.push_back("--gc-sections");
6696
6697 if (Output.isFilename()) {
6698 CmdArgs.push_back("-o");
6699 CmdArgs.push_back(Output.getFilename());
6700 } else {
6701 assert(Output.isNothing() && "Invalid output.");
6702 }
6703
Douglas Katzman78b37b02015-11-17 20:28:07 +00006704 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006705 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6706 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6707 }
6708
6709 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006710 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006711 Args.AddAllArgs(CmdArgs,
6712 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6713 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006714
Teresa Johnson945bc502015-10-15 20:35:53 +00006715 if (D.isUsingLTO())
6716 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006717
6718 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6719
Douglas Katzman78b37b02015-11-17 20:28:07 +00006720 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006721 if (D.CCCIsCXX())
6722 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6723 CmdArgs.push_back("-lc");
6724 CmdArgs.push_back("-lcompiler_rt");
6725 }
6726
Douglas Katzman78b37b02015-11-17 20:28:07 +00006727 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006728 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6729
6730 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006731 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006732}
6733
Douglas Katzman95354292015-06-23 20:42:09 +00006734void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6735 const InputInfo &Output,
6736 const InputInfoList &Inputs,
6737 const ArgList &Args,
6738 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006739 ArgStringList CmdArgs;
6740
6741 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6742 const InputInfo &Input = Inputs[0];
6743
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006744 // Determine the original source input.
6745 const Action *SourceAction = &JA;
6746 while (SourceAction->getKind() != Action::InputClass) {
6747 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6748 SourceAction = SourceAction->getInputs()[0];
6749 }
6750
Eric Christopherf5a8f492015-12-08 00:10:10 +00006751 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006752 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006753 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6754 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006755 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006756 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006757 const llvm::Triple &T(getToolChain().getTriple());
6758 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006759 CmdArgs.push_back("-Q");
6760 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006761
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006762 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006763 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006764 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006765 if (Args.hasArg(options::OPT_gstabs))
6766 CmdArgs.push_back("--gstabs");
6767 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006768 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006769 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006770
Daniel Dunbarbe220842009-03-20 16:06:39 +00006771 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006772 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006773
Daniel Dunbar6d484762010-07-22 01:47:22 +00006774 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006775 if (getToolChain().getArch() == llvm::Triple::x86 ||
6776 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006777 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6778 CmdArgs.push_back("-force_cpusubtype_ALL");
6779
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006780 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006781 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006782 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006783 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006784 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006785 CmdArgs.push_back("-static");
6786
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006787 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006788
6789 assert(Output.isFilename() && "Unexpected lipo output.");
6790 CmdArgs.push_back("-o");
6791 CmdArgs.push_back(Output.getFilename());
6792
Daniel Dunbarb440f562010-08-02 02:38:21 +00006793 assert(Input.isFilename() && "Invalid input.");
6794 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006795
6796 // asm_final spec is empty.
6797
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006798 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006799 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006800}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006801
Tim Northover157d9112014-01-16 08:48:16 +00006802void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006803
Tim Northover157d9112014-01-16 08:48:16 +00006804void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6805 ArgStringList &CmdArgs) const {
6806 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006807
Daniel Dunbarc1964212009-03-26 16:23:12 +00006808 // Derived from darwin_arch spec.
6809 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006810 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006811
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006812 // FIXME: Is this needed anymore?
6813 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006814 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006815}
6816
Douglas Katzman95354292015-06-23 20:42:09 +00006817bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006818 // We only need to generate a temp path for LTO if we aren't compiling object
6819 // files. When compiling source files, we run 'dsymutil' after linking. We
6820 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006821 for (const auto &Input : Inputs)
6822 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006823 return true;
6824
6825 return false;
6826}
6827
Douglas Katzman95354292015-06-23 20:42:09 +00006828void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6829 ArgStringList &CmdArgs,
6830 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006831 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006832 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006833
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006834 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006835 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6836 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006837 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6838 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006839 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006840 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006841 }
6842
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006843 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006844 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006845 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6846 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006847
Bob Wilson3d27dad2013-08-02 22:25:34 +00006848 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6849 CmdArgs.push_back("-export_dynamic");
6850
Bob Wilsonb111ec92015-03-02 19:01:14 +00006851 // If we are using App Extension restrictions, pass a flag to the linker
6852 // telling it that the compiled code has been audited.
6853 if (Args.hasFlag(options::OPT_fapplication_extension,
6854 options::OPT_fno_application_extension, false))
6855 CmdArgs.push_back("-application_extension");
6856
Teresa Johnson945bc502015-10-15 20:35:53 +00006857 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006858 // If we are using LTO, then automatically create a temporary file path for
6859 // the linker to use, so that it's lifetime will extend past a possible
6860 // dsymutil step.
6861 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6862 const char *TmpPath = C.getArgs().MakeArgString(
6863 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6864 C.addTempFile(TmpPath);
6865 CmdArgs.push_back("-object_path_lto");
6866 CmdArgs.push_back(TmpPath);
6867 }
6868
6869 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6870 // it in clang installed libraries. If not found, the option is not used
6871 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6872 if (Version[0] >= 133) {
6873 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6874 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6875 SmallString<128> LibLTOPath(P);
6876 llvm::sys::path::append(LibLTOPath, "lib");
6877 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6878 if (llvm::sys::fs::exists(LibLTOPath)) {
6879 CmdArgs.push_back("-lto_library");
6880 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6881 } else {
6882 D.Diag(diag::warn_drv_lto_libpath);
6883 }
6884 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006885 }
6886
Daniel Dunbarc1964212009-03-26 16:23:12 +00006887 // Derived from the "link" spec.
6888 Args.AddAllArgs(CmdArgs, options::OPT_static);
6889 if (!Args.hasArg(options::OPT_static))
6890 CmdArgs.push_back("-dynamic");
6891 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6892 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6893 // here. How do we wish to handle such things?
6894 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006895
Daniel Dunbarc1964212009-03-26 16:23:12 +00006896 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006897 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006898 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006899 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006900
6901 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6902 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6903 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6904
6905 Arg *A;
6906 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6907 (A = Args.getLastArg(options::OPT_current__version)) ||
6908 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006909 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6910 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006911
6912 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6913 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6914 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6915 } else {
6916 CmdArgs.push_back("-dylib");
6917
6918 Arg *A;
6919 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6920 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6921 (A = Args.getLastArg(options::OPT_client__name)) ||
6922 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6923 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6924 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006925 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6926 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006927
Daniel Dunbarc1964212009-03-26 16:23:12 +00006928 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6929 "-dylib_compatibility_version");
6930 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6931 "-dylib_current_version");
6932
Tim Northover157d9112014-01-16 08:48:16 +00006933 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006934
6935 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6936 "-dylib_install_name");
6937 }
6938
6939 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6940 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6941 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006942 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006943 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006944 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6945 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6946 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6947 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6948 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6949 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006950 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006951 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6952 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6953 Args.AddAllArgs(CmdArgs, options::OPT_init);
6954
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006955 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006956 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006957
Daniel Dunbarc1964212009-03-26 16:23:12 +00006958 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6959 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6960 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6961 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6962 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006963
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006964 if (const Arg *A =
6965 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6966 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006967 if (A->getOption().matches(options::OPT_fpie) ||
6968 A->getOption().matches(options::OPT_fPIE))
6969 CmdArgs.push_back("-pie");
6970 else
6971 CmdArgs.push_back("-no_pie");
6972 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006973
6974 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6975 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6976 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6977 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6978 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6979 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6980 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6981 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6982 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6983 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6984 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6985 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6986 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6987 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6988 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6989 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006990
Daniel Dunbar84384642011-05-02 21:03:47 +00006991 // Give --sysroot= preference, over the Apple specific behavior to also use
6992 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006993 StringRef sysroot = C.getSysRoot();
6994 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006995 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006996 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006997 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6998 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006999 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007000 }
7001
Daniel Dunbarc1964212009-03-26 16:23:12 +00007002 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7003 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7004 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7005 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7006 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007007 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007008 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7009 Args.AddAllArgs(CmdArgs, options::OPT_y);
7010 Args.AddLastArg(CmdArgs, options::OPT_w);
7011 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7012 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7013 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7014 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7015 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7016 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7017 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7018 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7019 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7020 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7021 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7022 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7023}
7024
Douglas Katzman95354292015-06-23 20:42:09 +00007025void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7026 const InputInfo &Output,
7027 const InputInfoList &Inputs,
7028 const ArgList &Args,
7029 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007030 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007031
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007032 // If the number of arguments surpasses the system limits, we will encode the
7033 // input files in a separate file, shortening the command line. To this end,
7034 // build a list of input file names that can be passed via a file with the
7035 // -filelist linker option.
7036 llvm::opt::ArgStringList InputFileList;
7037
Daniel Dunbarc1964212009-03-26 16:23:12 +00007038 // The logic here is derived from gcc's behavior; most of which
7039 // comes from specs (starting with link_command). Consult gcc for
7040 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007041 ArgStringList CmdArgs;
7042
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007043 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7044 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7045 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007046 for (const auto &Arg : Args)
7047 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007048 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007049 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007050 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007051 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007052 return;
7053 }
7054
Daniel Dunbarc1964212009-03-26 16:23:12 +00007055 // I'm not sure why this particular decomposition exists in gcc, but
7056 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007057 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007058
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007059 // It seems that the 'e' option is completely ignored for dynamic executables
7060 // (the default), and with static executables, the last one wins, as expected.
7061 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7062 options::OPT_Z_Flag, options::OPT_u_Group,
7063 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007064
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007065 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7066 // members of static archive libraries which implement Objective-C classes or
7067 // categories.
7068 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7069 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007070
Daniel Dunbarc1964212009-03-26 16:23:12 +00007071 CmdArgs.push_back("-o");
7072 CmdArgs.push_back(Output.getFilename());
7073
Douglas Katzman78b37b02015-11-17 20:28:07 +00007074 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007075 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007076
Peter Collingbournec4122c12015-06-15 21:08:13 +00007077 // SafeStack requires its own runtime libraries
7078 // These libraries should be linked first, to make sure the
7079 // __safestack_init constructor executes before everything else
7080 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7081 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7082 "libclang_rt.safestack_osx.a",
7083 /*AlwaysLink=*/true);
7084 }
7085
Daniel Dunbarc1964212009-03-26 16:23:12 +00007086 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007087
Douglas Gregor9295df02012-05-15 21:00:27 +00007088 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007089 // Build the input file for -filelist (list of linker input files) in case we
7090 // need it later
7091 for (const auto &II : Inputs) {
7092 if (!II.isFilename()) {
7093 // This is a linker input argument.
7094 // We cannot mix input arguments and file names in a -filelist input, thus
7095 // we prematurely stop our list (remaining files shall be passed as
7096 // arguments).
7097 if (InputFileList.size() > 0)
7098 break;
7099
7100 continue;
7101 }
7102
7103 InputFileList.push_back(II.getFilename());
7104 }
7105
Douglas Katzman78b37b02015-11-17 20:28:07 +00007106 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007107 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7108
Douglas Katzman78b37b02015-11-17 20:28:07 +00007109 if (isObjCRuntimeLinked(Args) &&
7110 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007111 // We use arclite library for both ARC and subscripting support.
7112 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7113
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007114 CmdArgs.push_back("-framework");
7115 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007116 // Link libobj.
7117 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007118 }
John McCall31168b02011-06-15 23:02:42 +00007119
Daniel Dunbarc1964212009-03-26 16:23:12 +00007120 if (LinkingOutput) {
7121 CmdArgs.push_back("-arch_multiple");
7122 CmdArgs.push_back("-final_output");
7123 CmdArgs.push_back(LinkingOutput);
7124 }
7125
Daniel Dunbarc1964212009-03-26 16:23:12 +00007126 if (Args.hasArg(options::OPT_fnested_functions))
7127 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007128
Justin Bognerc7701242015-05-12 05:44:36 +00007129 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7130
Douglas Katzman78b37b02015-11-17 20:28:07 +00007131 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007132 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007133 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007134
Daniel Dunbarc1964212009-03-26 16:23:12 +00007135 // link_ssp spec is empty.
7136
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007137 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007138 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007139 }
7140
Douglas Katzman78b37b02015-11-17 20:28:07 +00007141 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007142 // endfile_spec is empty.
7143 }
7144
7145 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7146 Args.AddAllArgs(CmdArgs, options::OPT_F);
7147
Steven Wu3ffb61b2015-02-06 18:08:29 +00007148 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007149 for (const Arg *A : Args.filtered(options::OPT_iframework))
7150 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007151
Douglas Katzman78b37b02015-11-17 20:28:07 +00007152 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007153 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7154 if (A->getValue() == StringRef("Accelerate")) {
7155 CmdArgs.push_back("-framework");
7156 CmdArgs.push_back("Accelerate");
7157 }
7158 }
7159 }
7160
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007161 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007162 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007163 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007164 Cmd->setInputFileList(std::move(InputFileList));
7165 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007166}
7167
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007168void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007169 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007170 const InputInfoList &Inputs,
7171 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007172 const char *LinkingOutput) const {
7173 ArgStringList CmdArgs;
7174
7175 CmdArgs.push_back("-create");
7176 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007177
7178 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007179 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007180
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007181 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007182 assert(II.isFilename() && "Unexpected lipo input.");
7183 CmdArgs.push_back(II.getFilename());
7184 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007185
7186 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007187 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007188}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007189
Daniel Dunbar88299622010-06-04 18:28:36 +00007190void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007191 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007192 const InputInfoList &Inputs,
7193 const ArgList &Args,
7194 const char *LinkingOutput) const {
7195 ArgStringList CmdArgs;
7196
Daniel Dunbareb86b042011-05-09 17:23:16 +00007197 CmdArgs.push_back("-o");
7198 CmdArgs.push_back(Output.getFilename());
7199
Daniel Dunbar88299622010-06-04 18:28:36 +00007200 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7201 const InputInfo &Input = Inputs[0];
7202 assert(Input.isFilename() && "Unexpected dsymutil input.");
7203 CmdArgs.push_back(Input.getFilename());
7204
Daniel Dunbar88299622010-06-04 18:28:36 +00007205 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007206 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007207 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007208}
7209
Eric Christopher551ef452011-08-23 17:56:55 +00007210void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007211 const InputInfo &Output,
7212 const InputInfoList &Inputs,
7213 const ArgList &Args,
7214 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007215 ArgStringList CmdArgs;
7216 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007217 CmdArgs.push_back("--debug-info");
7218 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007219 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007220
7221 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7222 const InputInfo &Input = Inputs[0];
7223 assert(Input.isFilename() && "Unexpected verify input");
7224
7225 // Grabbing the output of the earlier dsymutil run.
7226 CmdArgs.push_back(Input.getFilename());
7227
7228 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007229 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007230 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007231}
7232
Douglas Katzman95354292015-06-23 20:42:09 +00007233void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007234 const InputInfo &Output,
7235 const InputInfoList &Inputs,
7236 const ArgList &Args,
7237 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007238 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007239 ArgStringList CmdArgs;
7240
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007241 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007242
7243 CmdArgs.push_back("-o");
7244 CmdArgs.push_back(Output.getFilename());
7245
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007246 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007247 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007248
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007249 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007250 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007251}
7252
Douglas Katzman95354292015-06-23 20:42:09 +00007253void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7254 const InputInfo &Output,
7255 const InputInfoList &Inputs,
7256 const ArgList &Args,
7257 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007258 ArgStringList CmdArgs;
7259
David Chisnall272a0712012-02-29 15:06:12 +00007260 // Demangle C++ names in errors
7261 CmdArgs.push_back("-C");
7262
Douglas Katzman78b37b02015-11-17 20:28:07 +00007263 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007264 CmdArgs.push_back("-e");
7265 CmdArgs.push_back("_start");
7266 }
7267
7268 if (Args.hasArg(options::OPT_static)) {
7269 CmdArgs.push_back("-Bstatic");
7270 CmdArgs.push_back("-dn");
7271 } else {
7272 CmdArgs.push_back("-Bdynamic");
7273 if (Args.hasArg(options::OPT_shared)) {
7274 CmdArgs.push_back("-shared");
7275 } else {
7276 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007277 CmdArgs.push_back(
7278 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007279 }
7280 }
7281
7282 if (Output.isFilename()) {
7283 CmdArgs.push_back("-o");
7284 CmdArgs.push_back(Output.getFilename());
7285 } else {
7286 assert(Output.isNothing() && "Invalid output.");
7287 }
7288
Douglas Katzman78b37b02015-11-17 20:28:07 +00007289 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007290 if (!Args.hasArg(options::OPT_shared))
7291 CmdArgs.push_back(
7292 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7293
7294 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7295 CmdArgs.push_back(
7296 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7297 CmdArgs.push_back(
7298 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007299 }
7300
Douglas Katzman6059ef92015-11-17 17:41:23 +00007301 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007302
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007303 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7304 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007305
7306 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7307
Douglas Katzman78b37b02015-11-17 20:28:07 +00007308 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007309 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007310 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007311 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007312 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007313 if (!Args.hasArg(options::OPT_shared)) {
7314 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007315 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007316 }
David Chisnallf571cde2012-02-15 13:39:01 +00007317 }
7318
Douglas Katzman78b37b02015-11-17 20:28:07 +00007319 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007320 CmdArgs.push_back(
7321 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007322 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007323 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007324
Xinliang David Li69306c02015-10-22 06:15:31 +00007325 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007326
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007327 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007328 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007329}
7330
Douglas Katzman95354292015-06-23 20:42:09 +00007331void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7332 const InputInfo &Output,
7333 const InputInfoList &Inputs,
7334 const ArgList &Args,
7335 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007336 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007337 ArgStringList CmdArgs;
7338
Rafael Espindolacc126272014-02-28 01:55:21 +00007339 switch (getToolChain().getArch()) {
7340 case llvm::Triple::x86:
7341 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7342 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007343 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007344 break;
7345
7346 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007347 CmdArgs.push_back("-mppc");
7348 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007349 break;
7350
7351 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007352 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007353 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007354 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7355 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7356 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007357 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007358 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007359
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007360 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007361 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007362 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7363 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7364 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007365 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007366 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007367
7368 case llvm::Triple::mips64:
7369 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007370 StringRef CPUName;
7371 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007372 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007373
7374 CmdArgs.push_back("-mabi");
7375 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7376
7377 if (getToolChain().getArch() == llvm::Triple::mips64)
7378 CmdArgs.push_back("-EB");
7379 else
7380 CmdArgs.push_back("-EL");
7381
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007382 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007383 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007384 }
7385
Rafael Espindolacc126272014-02-28 01:55:21 +00007386 default:
7387 break;
7388 }
7389
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007390 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007391
7392 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007393 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007394
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007395 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007396 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007397
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007398 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007399 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007400}
7401
Douglas Katzman95354292015-06-23 20:42:09 +00007402void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7403 const InputInfo &Output,
7404 const InputInfoList &Inputs,
7405 const ArgList &Args,
7406 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007407 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007408 ArgStringList CmdArgs;
7409
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007410 // Silence warning for "clang -g foo.o -o foo"
7411 Args.ClaimAllArgs(options::OPT_g_Group);
7412 // and "clang -emit-llvm foo.o -o foo"
7413 Args.ClaimAllArgs(options::OPT_emit_llvm);
7414 // and for "clang -w foo.o -o foo". Other warning options are already
7415 // handled somewhere else.
7416 Args.ClaimAllArgs(options::OPT_w);
7417
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007418 if (getToolChain().getArch() == llvm::Triple::mips64)
7419 CmdArgs.push_back("-EB");
7420 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7421 CmdArgs.push_back("-EL");
7422
Douglas Katzman78b37b02015-11-17 20:28:07 +00007423 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007424 CmdArgs.push_back("-e");
7425 CmdArgs.push_back("__start");
7426 }
7427
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007428 if (Args.hasArg(options::OPT_static)) {
7429 CmdArgs.push_back("-Bstatic");
7430 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007431 if (Args.hasArg(options::OPT_rdynamic))
7432 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007433 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007434 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007435 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007436 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007437 } else {
7438 CmdArgs.push_back("-dynamic-linker");
7439 CmdArgs.push_back("/usr/libexec/ld.so");
7440 }
7441 }
7442
Rafael Espindola044f7832013-06-05 04:28:55 +00007443 if (Args.hasArg(options::OPT_nopie))
7444 CmdArgs.push_back("-nopie");
7445
Daniel Dunbarb440f562010-08-02 02:38:21 +00007446 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007447 CmdArgs.push_back("-o");
7448 CmdArgs.push_back(Output.getFilename());
7449 } else {
7450 assert(Output.isNothing() && "Invalid output.");
7451 }
7452
Douglas Katzman78b37b02015-11-17 20:28:07 +00007453 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007454 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007455 if (Args.hasArg(options::OPT_pg))
7456 CmdArgs.push_back(
7457 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007458 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007459 CmdArgs.push_back(
7460 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7461 CmdArgs.push_back(
7462 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007463 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007464 CmdArgs.push_back(
7465 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007466 }
7467 }
7468
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007469 std::string Triple = getToolChain().getTripleString();
7470 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007471 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007472 CmdArgs.push_back(
7473 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007474
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007475 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7476 options::OPT_e, options::OPT_s, options::OPT_t,
7477 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007478
Daniel Dunbar54423b22010-09-17 00:24:54 +00007479 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007480
Douglas Katzman78b37b02015-11-17 20:28:07 +00007481 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007482 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007483 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007484 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007485 CmdArgs.push_back("-lm_p");
7486 else
7487 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007488 }
7489
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007490 // FIXME: For some reason GCC passes -lgcc before adding
7491 // the default system libraries. Just mimic this for now.
7492 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007493
Eric Christopher17674ec2012-09-13 06:32:34 +00007494 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007495 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7496 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007497 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007498 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007499 }
7500
Chandler Carruth45661652011-12-17 22:32:42 +00007501 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007502 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007503 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007504 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007505 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007506 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007507
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007508 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007509 }
7510
Douglas Katzman78b37b02015-11-17 20:28:07 +00007511 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007512 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007513 CmdArgs.push_back(
7514 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007515 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007516 CmdArgs.push_back(
7517 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007518 }
7519
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007520 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007521 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007522}
Ed Schoutene33194b2009-04-02 19:13:12 +00007523
Douglas Katzman95354292015-06-23 20:42:09 +00007524void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7525 const InputInfo &Output,
7526 const InputInfoList &Inputs,
7527 const ArgList &Args,
7528 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007529 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007530 ArgStringList CmdArgs;
7531
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007532 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007533
7534 CmdArgs.push_back("-o");
7535 CmdArgs.push_back(Output.getFilename());
7536
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007537 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007538 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007539
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007540 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007541 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007542}
7543
Douglas Katzman95354292015-06-23 20:42:09 +00007544void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7545 const InputInfo &Output,
7546 const InputInfoList &Inputs,
7547 const ArgList &Args,
7548 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007549 const Driver &D = getToolChain().getDriver();
7550 ArgStringList CmdArgs;
7551
Douglas Katzman78b37b02015-11-17 20:28:07 +00007552 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007553 CmdArgs.push_back("-e");
7554 CmdArgs.push_back("__start");
7555 }
7556
7557 if (Args.hasArg(options::OPT_static)) {
7558 CmdArgs.push_back("-Bstatic");
7559 } else {
7560 if (Args.hasArg(options::OPT_rdynamic))
7561 CmdArgs.push_back("-export-dynamic");
7562 CmdArgs.push_back("--eh-frame-hdr");
7563 CmdArgs.push_back("-Bdynamic");
7564 if (Args.hasArg(options::OPT_shared)) {
7565 CmdArgs.push_back("-shared");
7566 } else {
7567 CmdArgs.push_back("-dynamic-linker");
7568 CmdArgs.push_back("/usr/libexec/ld.so");
7569 }
7570 }
7571
7572 if (Output.isFilename()) {
7573 CmdArgs.push_back("-o");
7574 CmdArgs.push_back(Output.getFilename());
7575 } else {
7576 assert(Output.isNothing() && "Invalid output.");
7577 }
7578
Douglas Katzman78b37b02015-11-17 20:28:07 +00007579 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007580 if (!Args.hasArg(options::OPT_shared)) {
7581 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007582 CmdArgs.push_back(
7583 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007584 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007585 CmdArgs.push_back(
7586 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7587 CmdArgs.push_back(
7588 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007589 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007590 CmdArgs.push_back(
7591 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007592 }
7593 }
7594
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007595 Args.AddAllArgs(CmdArgs,
7596 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007597
7598 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7599
Douglas Katzman78b37b02015-11-17 20:28:07 +00007600 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007601 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007602 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7603 if (Args.hasArg(options::OPT_pg))
7604 CmdArgs.push_back("-lm_p");
7605 else
7606 CmdArgs.push_back("-lm");
7607 }
7608
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007609 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007610 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007611 CmdArgs.push_back("-lpthread_p");
7612 else
7613 CmdArgs.push_back("-lpthread");
7614 }
7615
Eli Friedman9fa28852012-08-08 23:57:20 +00007616 if (!Args.hasArg(options::OPT_shared)) {
7617 if (Args.hasArg(options::OPT_pg))
7618 CmdArgs.push_back("-lc_p");
7619 else
7620 CmdArgs.push_back("-lc");
7621 }
7622
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007623 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007624 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007625 case llvm::Triple::arm:
7626 MyArch = "arm";
7627 break;
7628 case llvm::Triple::x86:
7629 MyArch = "i386";
7630 break;
7631 case llvm::Triple::x86_64:
7632 MyArch = "amd64";
7633 break;
7634 default:
7635 llvm_unreachable("Unsupported architecture");
7636 }
7637 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007638 }
7639
Douglas Katzman78b37b02015-11-17 20:28:07 +00007640 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007641 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007642 CmdArgs.push_back(
7643 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007644 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007645 CmdArgs.push_back(
7646 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007647 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007649 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007650 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007651}
7652
Douglas Katzman95354292015-06-23 20:42:09 +00007653void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7654 const InputInfo &Output,
7655 const InputInfoList &Inputs,
7656 const ArgList &Args,
7657 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007658 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007659 ArgStringList CmdArgs;
7660
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007661 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7662 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007663 switch (getToolChain().getArch()) {
7664 default:
7665 break;
7666 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007667 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007668 break;
7669 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007670 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007671 break;
7672 case llvm::Triple::mips:
7673 case llvm::Triple::mipsel:
7674 case llvm::Triple::mips64:
7675 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007676 StringRef CPUName;
7677 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007678 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007679
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007680 CmdArgs.push_back("-march");
7681 CmdArgs.push_back(CPUName.data());
7682
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007683 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007684 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007685
7686 if (getToolChain().getArch() == llvm::Triple::mips ||
7687 getToolChain().getArch() == llvm::Triple::mips64)
7688 CmdArgs.push_back("-EB");
7689 else
7690 CmdArgs.push_back("-EL");
7691
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007692 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007693 break;
7694 }
7695 case llvm::Triple::arm:
7696 case llvm::Triple::armeb:
7697 case llvm::Triple::thumb:
7698 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007699 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007700
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007701 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007702 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007703 else
Renato Golinf4421f72014-02-19 10:44:07 +00007704 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007705
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007706 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007707 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007708 case llvm::Triple::GNUEABI:
7709 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007710 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007711 break;
7712
7713 default:
7714 CmdArgs.push_back("-matpcs");
7715 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007716 break;
7717 }
7718 case llvm::Triple::sparc:
7719 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007720 case llvm::Triple::sparcv9: {
7721 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7722 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007723 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007724 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007725 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007726 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007728 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007729
7730 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007731 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007732
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007733 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007734 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007735
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007736 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007737 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007738}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007739
Douglas Katzman95354292015-06-23 20:42:09 +00007740void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7741 const InputInfo &Output,
7742 const InputInfoList &Inputs,
7743 const ArgList &Args,
7744 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007745 const toolchains::FreeBSD &ToolChain =
7746 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007747 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007748 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007749 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007750 !Args.hasArg(options::OPT_shared) &&
7751 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007752 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007753
7754 // Silence warning for "clang -g foo.o -o foo"
7755 Args.ClaimAllArgs(options::OPT_g_Group);
7756 // and "clang -emit-llvm foo.o -o foo"
7757 Args.ClaimAllArgs(options::OPT_emit_llvm);
7758 // and for "clang -w foo.o -o foo". Other warning options are already
7759 // handled somewhere else.
7760 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007761
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007762 if (!D.SysRoot.empty())
7763 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7764
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007765 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007766 CmdArgs.push_back("-pie");
7767
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007768 if (Args.hasArg(options::OPT_static)) {
7769 CmdArgs.push_back("-Bstatic");
7770 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007771 if (Args.hasArg(options::OPT_rdynamic))
7772 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007773 CmdArgs.push_back("--eh-frame-hdr");
7774 if (Args.hasArg(options::OPT_shared)) {
7775 CmdArgs.push_back("-Bshareable");
7776 } else {
7777 CmdArgs.push_back("-dynamic-linker");
7778 CmdArgs.push_back("/libexec/ld-elf.so.1");
7779 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007780 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007781 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7782 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7783 CmdArgs.push_back("--hash-style=both");
7784 }
7785 }
7786 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007787 }
7788
7789 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7790 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007791 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007792 CmdArgs.push_back("-m");
7793 CmdArgs.push_back("elf_i386_fbsd");
7794 }
7795
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007796 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007797 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007798 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007799 }
7800
Daniel Dunbarb440f562010-08-02 02:38:21 +00007801 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007802 CmdArgs.push_back("-o");
7803 CmdArgs.push_back(Output.getFilename());
7804 } else {
7805 assert(Output.isNothing() && "Invalid output.");
7806 }
7807
Douglas Katzman78b37b02015-11-17 20:28:07 +00007808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007809 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007810 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007811 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007812 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007813 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007814 crt1 = "Scrt1.o";
7815 else
7816 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007817 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007818 if (crt1)
7819 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7820
7821 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7822
Craig Topper92fc2df2014-05-17 16:56:41 +00007823 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007824 if (Args.hasArg(options::OPT_static))
7825 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007826 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007827 crtbegin = "crtbeginS.o";
7828 else
7829 crtbegin = "crtbegin.o";
7830
7831 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007832 }
7833
7834 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007835 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007836 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7837 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007838 Args.AddAllArgs(CmdArgs, options::OPT_s);
7839 Args.AddAllArgs(CmdArgs, options::OPT_t);
7840 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7841 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007842
Teresa Johnson945bc502015-10-15 20:35:53 +00007843 if (D.isUsingLTO())
7844 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007845
Alexey Samsonov52550342014-09-15 19:58:40 +00007846 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007847 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007848
Douglas Katzman78b37b02015-11-17 20:28:07 +00007849 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007850 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007851 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007852 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007853 if (Args.hasArg(options::OPT_pg))
7854 CmdArgs.push_back("-lm_p");
7855 else
7856 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007857 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007858 if (NeedsSanitizerDeps)
7859 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007860 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7861 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007862 if (Args.hasArg(options::OPT_pg))
7863 CmdArgs.push_back("-lgcc_p");
7864 else
7865 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007866 if (Args.hasArg(options::OPT_static)) {
7867 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007868 } else if (Args.hasArg(options::OPT_pg)) {
7869 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007870 } else {
7871 CmdArgs.push_back("--as-needed");
7872 CmdArgs.push_back("-lgcc_s");
7873 CmdArgs.push_back("--no-as-needed");
7874 }
7875
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007876 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007877 if (Args.hasArg(options::OPT_pg))
7878 CmdArgs.push_back("-lpthread_p");
7879 else
7880 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007881 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007882
Roman Divacky66f22762011-02-10 16:59:40 +00007883 if (Args.hasArg(options::OPT_pg)) {
7884 if (Args.hasArg(options::OPT_shared))
7885 CmdArgs.push_back("-lc");
7886 else
7887 CmdArgs.push_back("-lc_p");
7888 CmdArgs.push_back("-lgcc_p");
7889 } else {
7890 CmdArgs.push_back("-lc");
7891 CmdArgs.push_back("-lgcc");
7892 }
7893
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007894 if (Args.hasArg(options::OPT_static)) {
7895 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007896 } else if (Args.hasArg(options::OPT_pg)) {
7897 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007898 } else {
7899 CmdArgs.push_back("--as-needed");
7900 CmdArgs.push_back("-lgcc_s");
7901 CmdArgs.push_back("--no-as-needed");
7902 }
7903 }
7904
Douglas Katzman78b37b02015-11-17 20:28:07 +00007905 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007906 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007907 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007908 else
7909 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007910 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007911 }
7912
Xinliang David Li69306c02015-10-22 06:15:31 +00007913 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007914
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007915 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007916 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007917}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007918
Douglas Katzman95354292015-06-23 20:42:09 +00007919void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007920 const InputInfo &Output,
7921 const InputInfoList &Inputs,
7922 const ArgList &Args,
7923 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007924 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007925 ArgStringList CmdArgs;
7926
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007927 // GNU as needs different flags for creating the correct output format
7928 // on architectures with different ABIs or optional feature sets.
7929 switch (getToolChain().getArch()) {
7930 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007931 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007932 break;
7933 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007934 case llvm::Triple::armeb:
7935 case llvm::Triple::thumb:
7936 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007937 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007938 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7939 std::string Arch =
7940 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007941 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007942 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007943 }
7944
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007945 case llvm::Triple::mips:
7946 case llvm::Triple::mipsel:
7947 case llvm::Triple::mips64:
7948 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007949 StringRef CPUName;
7950 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007951 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007952
7953 CmdArgs.push_back("-march");
7954 CmdArgs.push_back(CPUName.data());
7955
7956 CmdArgs.push_back("-mabi");
7957 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7958
7959 if (getToolChain().getArch() == llvm::Triple::mips ||
7960 getToolChain().getArch() == llvm::Triple::mips64)
7961 CmdArgs.push_back("-EB");
7962 else
7963 CmdArgs.push_back("-EL");
7964
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007965 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007966 break;
7967 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007968
7969 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007970 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007971 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007972 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7973 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007974 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007975 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007976 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007977
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007978 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007979 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007980 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7981 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007982 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007983 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007984 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007985
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007986 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007987 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007988 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007990 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007991
7992 CmdArgs.push_back("-o");
7993 CmdArgs.push_back(Output.getFilename());
7994
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007995 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007996 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007997
David Chisnallddbd68f2011-09-27 22:03:18 +00007998 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007999 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008000}
8001
Douglas Katzman95354292015-06-23 20:42:09 +00008002void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8003 const InputInfo &Output,
8004 const InputInfoList &Inputs,
8005 const ArgList &Args,
8006 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008007 const Driver &D = getToolChain().getDriver();
8008 ArgStringList CmdArgs;
8009
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008010 if (!D.SysRoot.empty())
8011 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8012
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008013 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008014 if (Args.hasArg(options::OPT_static)) {
8015 CmdArgs.push_back("-Bstatic");
8016 } else {
8017 if (Args.hasArg(options::OPT_rdynamic))
8018 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008019 if (Args.hasArg(options::OPT_shared)) {
8020 CmdArgs.push_back("-Bshareable");
8021 } else {
8022 CmdArgs.push_back("-dynamic-linker");
8023 CmdArgs.push_back("/libexec/ld.elf_so");
8024 }
8025 }
8026
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008027 // Many NetBSD architectures support more than one ABI.
8028 // Determine the correct emulation for ld.
8029 switch (getToolChain().getArch()) {
8030 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008031 CmdArgs.push_back("-m");
8032 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008033 break;
8034 case llvm::Triple::arm:
8035 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008036 CmdArgs.push_back("-m");
8037 switch (getToolChain().getTriple().getEnvironment()) {
8038 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008039 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008040 CmdArgs.push_back("armelf_nbsd_eabi");
8041 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008042 case llvm::Triple::EABIHF:
8043 case llvm::Triple::GNUEABIHF:
8044 CmdArgs.push_back("armelf_nbsd_eabihf");
8045 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008046 default:
8047 CmdArgs.push_back("armelf_nbsd");
8048 break;
8049 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008050 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008051 case llvm::Triple::armeb:
8052 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008053 arm::appendEBLinkFlags(
8054 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008055 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008056 CmdArgs.push_back("-m");
8057 switch (getToolChain().getTriple().getEnvironment()) {
8058 case llvm::Triple::EABI:
8059 case llvm::Triple::GNUEABI:
8060 CmdArgs.push_back("armelfb_nbsd_eabi");
8061 break;
8062 case llvm::Triple::EABIHF:
8063 case llvm::Triple::GNUEABIHF:
8064 CmdArgs.push_back("armelfb_nbsd_eabihf");
8065 break;
8066 default:
8067 CmdArgs.push_back("armelfb_nbsd");
8068 break;
8069 }
8070 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008071 case llvm::Triple::mips64:
8072 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008073 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008074 CmdArgs.push_back("-m");
8075 if (getToolChain().getArch() == llvm::Triple::mips64)
8076 CmdArgs.push_back("elf32btsmip");
8077 else
8078 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008079 } else if (mips::hasMipsAbiArg(Args, "64")) {
8080 CmdArgs.push_back("-m");
8081 if (getToolChain().getArch() == llvm::Triple::mips64)
8082 CmdArgs.push_back("elf64btsmip");
8083 else
8084 CmdArgs.push_back("elf64ltsmip");
8085 }
8086 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008087 case llvm::Triple::ppc:
8088 CmdArgs.push_back("-m");
8089 CmdArgs.push_back("elf32ppc_nbsd");
8090 break;
8091
8092 case llvm::Triple::ppc64:
8093 case llvm::Triple::ppc64le:
8094 CmdArgs.push_back("-m");
8095 CmdArgs.push_back("elf64ppc");
8096 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008097
8098 case llvm::Triple::sparc:
8099 CmdArgs.push_back("-m");
8100 CmdArgs.push_back("elf32_sparc");
8101 break;
8102
8103 case llvm::Triple::sparcv9:
8104 CmdArgs.push_back("-m");
8105 CmdArgs.push_back("elf64_sparc");
8106 break;
8107
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008108 default:
8109 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008110 }
8111
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008112 if (Output.isFilename()) {
8113 CmdArgs.push_back("-o");
8114 CmdArgs.push_back(Output.getFilename());
8115 } else {
8116 assert(Output.isNothing() && "Invalid output.");
8117 }
8118
Douglas Katzman78b37b02015-11-17 20:28:07 +00008119 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008120 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008121 CmdArgs.push_back(
8122 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8123 CmdArgs.push_back(
8124 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8125 CmdArgs.push_back(
8126 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008127 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008128 CmdArgs.push_back(
8129 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8130 CmdArgs.push_back(
8131 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008132 }
8133 }
8134
8135 Args.AddAllArgs(CmdArgs, options::OPT_L);
8136 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8137 Args.AddAllArgs(CmdArgs, options::OPT_e);
8138 Args.AddAllArgs(CmdArgs, options::OPT_s);
8139 Args.AddAllArgs(CmdArgs, options::OPT_t);
8140 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8141 Args.AddAllArgs(CmdArgs, options::OPT_r);
8142
8143 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8144
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008145 unsigned Major, Minor, Micro;
8146 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8147 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008148 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008149 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008150 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008151 case llvm::Triple::arm:
8152 case llvm::Triple::armeb:
8153 case llvm::Triple::thumb:
8154 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008155 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008156 case llvm::Triple::ppc64:
8157 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008158 case llvm::Triple::x86:
8159 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008160 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008161 break;
8162 default:
8163 break;
8164 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008165 }
8166
Douglas Katzman78b37b02015-11-17 20:28:07 +00008167 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008168 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008169 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008170 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8171 CmdArgs.push_back("-lm");
8172 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008173 if (Args.hasArg(options::OPT_pthread))
8174 CmdArgs.push_back("-lpthread");
8175 CmdArgs.push_back("-lc");
8176
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008177 if (useLibgcc) {
8178 if (Args.hasArg(options::OPT_static)) {
8179 // libgcc_eh depends on libc, so resolve as much as possible,
8180 // pull in any new requirements from libc and then get the rest
8181 // of libgcc.
8182 CmdArgs.push_back("-lgcc_eh");
8183 CmdArgs.push_back("-lc");
8184 CmdArgs.push_back("-lgcc");
8185 } else {
8186 CmdArgs.push_back("-lgcc");
8187 CmdArgs.push_back("--as-needed");
8188 CmdArgs.push_back("-lgcc_s");
8189 CmdArgs.push_back("--no-as-needed");
8190 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008191 }
8192 }
8193
Douglas Katzman78b37b02015-11-17 20:28:07 +00008194 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008195 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008196 CmdArgs.push_back(
8197 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008198 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008199 CmdArgs.push_back(
8200 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8201 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008202 }
8203
Xinliang David Li69306c02015-10-22 06:15:31 +00008204 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008205
Logan Chieneb9162f2014-06-26 14:23:45 +00008206 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008207 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008208}
8209
Douglas Katzman95354292015-06-23 20:42:09 +00008210void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8211 const InputInfo &Output,
8212 const InputInfoList &Inputs,
8213 const ArgList &Args,
8214 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008215 claimNoWarnArgs(Args);
8216
James Y Knight2db38f32015-08-15 03:45:25 +00008217 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8218 llvm::Triple Triple = llvm::Triple(TripleStr);
8219
Rafael Espindola92b00932010-08-10 00:25:48 +00008220 ArgStringList CmdArgs;
8221
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008222 llvm::Reloc::Model RelocationModel;
8223 unsigned PICLevel;
8224 bool IsPIE;
8225 std::tie(RelocationModel, PICLevel, IsPIE) =
8226 ParsePICArgs(getToolChain(), Triple, Args);
8227
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008228 switch (getToolChain().getArch()) {
8229 default:
8230 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008231 // Add --32/--64 to make sure we get the format we want.
8232 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008233 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008234 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008235 break;
8236 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008237 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8238 CmdArgs.push_back("--x32");
8239 else
8240 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008241 break;
8242 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008243 CmdArgs.push_back("-a32");
8244 CmdArgs.push_back("-mppc");
8245 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008246 break;
8247 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008248 CmdArgs.push_back("-a64");
8249 CmdArgs.push_back("-mppc64");
8250 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008251 break;
8252 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008253 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008254 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008255 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008256 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008257 break;
8258 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008259 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008260 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008261 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8262 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8263 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008264 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008265 }
8266 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008267 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008268 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8269 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8270 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008271 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008272 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008273 case llvm::Triple::arm:
8274 case llvm::Triple::armeb:
8275 case llvm::Triple::thumb:
8276 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008277 const llvm::Triple &Triple2 = getToolChain().getTriple();
8278 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008279 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008280 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008281 break;
8282 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008283 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008284 break;
8285 default:
8286 break;
8287 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008288
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008289 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008290 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8291 case arm::FloatABI::Soft:
8292 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8293 break;
8294 case arm::FloatABI::SoftFP:
8295 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8296 break;
8297 case arm::FloatABI::Hard:
8298 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8299 break;
8300 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008301
8302 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008303
8304 // FIXME: remove krait check when GNU tools support krait cpu
8305 // for now replace it with -march=armv7-a to avoid a lower
8306 // march from being picked in the absence of a cpu flag.
8307 Arg *A;
8308 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008309 StringRef(A->getValue()).lower() == "krait")
8310 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008311 else
8312 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008313 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008314 break;
8315 }
8316 case llvm::Triple::mips:
8317 case llvm::Triple::mipsel:
8318 case llvm::Triple::mips64:
8319 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008320 StringRef CPUName;
8321 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008322 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008323 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008324
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008325 CmdArgs.push_back("-march");
8326 CmdArgs.push_back(CPUName.data());
8327
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008328 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008329 CmdArgs.push_back(ABIName.data());
8330
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008331 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8332 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008333 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008334 CmdArgs.push_back("-mno-shared");
8335
Daniel Sanders379d44b2014-07-16 11:52:23 +00008336 // LLVM doesn't support -mplt yet and acts as if it is always given.
8337 // However, -mplt has no effect with the N64 ABI.
8338 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008339
8340 if (getToolChain().getArch() == llvm::Triple::mips ||
8341 getToolChain().getArch() == llvm::Triple::mips64)
8342 CmdArgs.push_back("-EB");
8343 else
8344 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008345
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008346 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8347 if (StringRef(A->getValue()) == "2008")
8348 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8349 }
8350
Daniel Sanders379d44b2014-07-16 11:52:23 +00008351 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8352 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8353 options::OPT_mfp64)) {
8354 A->claim();
8355 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008356 } else if (mips::shouldUseFPXX(
8357 Args, getToolChain().getTriple(), CPUName, ABIName,
8358 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008359 CmdArgs.push_back("-mfpxx");
8360
8361 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8362 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008363 if (Arg *A =
8364 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008365 if (A->getOption().matches(options::OPT_mips16)) {
8366 A->claim();
8367 A->render(Args, CmdArgs);
8368 } else {
8369 A->claim();
8370 CmdArgs.push_back("-no-mips16");
8371 }
8372 }
8373
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008374 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8375 options::OPT_mno_micromips);
8376 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8377 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8378
Simon Atanasyanbd986632013-11-26 11:58:04 +00008379 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8380 // Do not use AddLastArg because not all versions of MIPS assembler
8381 // support -mmsa / -mno-msa options.
8382 if (A->getOption().matches(options::OPT_mmsa))
8383 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8384 }
8385
Daniel Sanders379d44b2014-07-16 11:52:23 +00008386 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8387 options::OPT_msoft_float);
8388
Toma Tabacub36d6102015-06-11 12:13:18 +00008389 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8390 options::OPT_msingle_float);
8391
Daniel Sanders379d44b2014-07-16 11:52:23 +00008392 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8393 options::OPT_mno_odd_spreg);
8394
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008395 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008396 break;
8397 }
8398 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008399 // Always pass an -march option, since our default of z10 is later
8400 // than the GNU assembler's default.
8401 StringRef CPUName = getSystemZTargetCPU(Args);
8402 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008403 break;
8404 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008405 }
8406
Renato Golina74bbc72015-07-22 15:32:36 +00008407 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008408 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008409
8410 CmdArgs.push_back("-o");
8411 CmdArgs.push_back(Output.getFilename());
8412
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008413 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008414 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008415
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008416 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008417 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008418
8419 // Handle the debug info splitting at object creation time if we're
8420 // creating an object.
8421 // TODO: Currently only works on linux with newer objcopy.
8422 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008423 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008424 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008425 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008426}
8427
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008428static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008429 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008430 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008431 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008432 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8433 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008434 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008435 CmdArgs.push_back("-lgcc");
8436
Logan Chien3d3373c2012-11-19 12:04:11 +00008437 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008438 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008439 CmdArgs.push_back("-lgcc");
8440 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008441 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008442 CmdArgs.push_back("--as-needed");
8443 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008444 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008445 CmdArgs.push_back("--no-as-needed");
8446 }
8447
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008448 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008449 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008450 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008451 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008452
8453 // According to Android ABI, we have to link with libdl if we are
8454 // linking with non-static libgcc.
8455 //
8456 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8457 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8458 if (isAndroid && !StaticLibgcc)
8459 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008460}
8461
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008462static std::string getLinuxDynamicLinker(const ArgList &Args,
8463 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008464 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8465
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008466 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008467 if (ToolChain.getTriple().isArch64Bit())
8468 return "/system/bin/linker64";
8469 else
8470 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008471 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8472 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008473 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008474 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008475 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008476 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008477 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008478 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008479 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008480 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008481 return "/lib/ld-linux-armhf.so.3";
8482 else
8483 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008484 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8485 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008486 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008487 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008488 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008489 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008490 return "/lib/ld-linux.so.3";
8491 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8492 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008493 std::string LibDir =
8494 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008495 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008496 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008497 if (mips::isUCLibc(Args))
8498 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008499 else if (!ToolChain.getTriple().hasEnvironment()) {
8500 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8501 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8502 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8503 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008504 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008505
8506 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008507 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008508 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008509 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008510 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8511 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008512 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008513 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008514 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8515 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008516 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008517 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008518 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008519 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008520 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008521 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008522 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8523 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008524 else
8525 return "/lib64/ld-linux-x86-64.so.2";
8526}
8527
Renato Golinc4b49242014-02-13 10:01:16 +00008528static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008529 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008530 // Make use of compiler-rt if --rtlib option is used
8531 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8532
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008533 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008534 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008535 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008536 default:
8537 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008538 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008539 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008540 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008541 break;
8542 }
Renato Golinc4b49242014-02-13 10:01:16 +00008543 break;
8544 case ToolChain::RLT_Libgcc:
8545 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8546 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008547 }
8548}
8549
Rafael Espindola1e085772014-08-15 17:14:35 +00008550static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8551 switch (T.getArch()) {
8552 case llvm::Triple::x86:
8553 return "elf_i386";
8554 case llvm::Triple::aarch64:
8555 return "aarch64linux";
8556 case llvm::Triple::aarch64_be:
8557 return "aarch64_be_linux";
8558 case llvm::Triple::arm:
8559 case llvm::Triple::thumb:
8560 return "armelf_linux_eabi";
8561 case llvm::Triple::armeb:
8562 case llvm::Triple::thumbeb:
8563 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8564 case llvm::Triple::ppc:
8565 return "elf32ppclinux";
8566 case llvm::Triple::ppc64:
8567 return "elf64ppc";
8568 case llvm::Triple::ppc64le:
8569 return "elf64lppc";
8570 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008571 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008572 return "elf32_sparc";
8573 case llvm::Triple::sparcv9:
8574 return "elf64_sparc";
8575 case llvm::Triple::mips:
8576 return "elf32btsmip";
8577 case llvm::Triple::mipsel:
8578 return "elf32ltsmip";
8579 case llvm::Triple::mips64:
8580 if (mips::hasMipsAbiArg(Args, "n32"))
8581 return "elf32btsmipn32";
8582 return "elf64btsmip";
8583 case llvm::Triple::mips64el:
8584 if (mips::hasMipsAbiArg(Args, "n32"))
8585 return "elf32ltsmipn32";
8586 return "elf64ltsmip";
8587 case llvm::Triple::systemz:
8588 return "elf64_s390";
8589 case llvm::Triple::x86_64:
8590 if (T.getEnvironment() == llvm::Triple::GNUX32)
8591 return "elf32_x86_64";
8592 return "elf_x86_64";
8593 default:
8594 llvm_unreachable("Unexpected arch");
8595 }
8596}
8597
Douglas Katzman95354292015-06-23 20:42:09 +00008598void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8599 const InputInfo &Output,
8600 const InputInfoList &Inputs,
8601 const ArgList &Args,
8602 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008603 const toolchains::Linux &ToolChain =
8604 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008605 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008606
8607 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8608 llvm::Triple Triple = llvm::Triple(TripleStr);
8609
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008610 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008611 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008612 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008613 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8614 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008615 const bool HasCRTBeginEndFiles =
8616 ToolChain.getTriple().hasEnvironment() ||
8617 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008618
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008619 ArgStringList CmdArgs;
8620
Rafael Espindolad1002f62010-11-15 18:28:16 +00008621 // Silence warning for "clang -g foo.o -o foo"
8622 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008623 // and "clang -emit-llvm foo.o -o foo"
8624 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008625 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008626 // handled somewhere else.
8627 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008628
Peter Collingbourne39719a72015-11-20 20:49:39 +00008629 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8630 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008631 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008632 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008633 CmdArgs.push_back("-target");
8634 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8635 }
8636
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008637 if (!D.SysRoot.empty())
8638 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008639
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008640 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008641 CmdArgs.push_back("-pie");
8642
Rafael Espindola1c76c592010-11-07 22:57:16 +00008643 if (Args.hasArg(options::OPT_rdynamic))
8644 CmdArgs.push_back("-export-dynamic");
8645
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008646 if (Args.hasArg(options::OPT_s))
8647 CmdArgs.push_back("-s");
8648
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008649 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008650 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008651
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008652 for (const auto &Opt : ToolChain.ExtraOpts)
8653 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008654
8655 if (!Args.hasArg(options::OPT_static)) {
8656 CmdArgs.push_back("--eh-frame-hdr");
8657 }
8658
8659 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008660 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008661
8662 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008663 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8664 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008665 CmdArgs.push_back("-Bstatic");
8666 else
8667 CmdArgs.push_back("-static");
8668 } else if (Args.hasArg(options::OPT_shared)) {
8669 CmdArgs.push_back("-shared");
8670 }
8671
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008672 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8673 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008674 (!Args.hasArg(options::OPT_static) &&
8675 !Args.hasArg(options::OPT_shared))) {
8676 CmdArgs.push_back("-dynamic-linker");
8677 CmdArgs.push_back(Args.MakeArgString(
8678 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8679 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008680
8681 CmdArgs.push_back("-o");
8682 CmdArgs.push_back(Output.getFilename());
8683
Douglas Katzman78b37b02015-11-17 20:28:07 +00008684 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008685 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008686 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008687 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008688 if (Args.hasArg(options::OPT_pg))
8689 crt1 = "gcrt1.o";
8690 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008691 crt1 = "Scrt1.o";
8692 else
8693 crt1 = "crt1.o";
8694 }
8695 if (crt1)
8696 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008697
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008698 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8699 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008700
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008701 const char *crtbegin;
8702 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008703 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008704 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008705 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008706 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008707 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008708 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008709 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008710
8711 if (HasCRTBeginEndFiles)
8712 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008713
8714 // Add crtfastmath.o if available and fast math is enabled.
8715 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008716 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008717
8718 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008719 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008720
Douglas Katzman6059ef92015-11-17 17:41:23 +00008721 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008722
Teresa Johnson945bc502015-10-15 20:35:53 +00008723 if (D.isUsingLTO())
8724 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008725
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008726 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8727 CmdArgs.push_back("--no-demangle");
8728
Alexey Samsonov52550342014-09-15 19:58:40 +00008729 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008730 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008731 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008732 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008733
Douglas Katzman78b37b02015-11-17 20:28:07 +00008734 if (D.CCCIsCXX() &&
8735 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008736 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008737 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008738 if (OnlyLibstdcxxStatic)
8739 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008740 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008741 if (OnlyLibstdcxxStatic)
8742 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008743 CmdArgs.push_back("-lm");
8744 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008745 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8746 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008747
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008748 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008749 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8750 if (Args.hasArg(options::OPT_static))
8751 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008752
Alexey Samsonov52550342014-09-15 19:58:40 +00008753 if (NeedsSanitizerDeps)
8754 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8755
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008756 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8757 Args.hasArg(options::OPT_pthreads);
8758
8759 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8760 options::OPT_fno_openmp, false)) {
8761 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8762 // FIXME: Does this really make sense for all GNU toolchains?
8763 WantPthread = true;
8764
8765 // Also link the particular OpenMP runtimes.
8766 switch (getOpenMPRuntime(ToolChain, Args)) {
8767 case OMPRT_OMP:
8768 CmdArgs.push_back("-lomp");
8769 break;
8770 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008771 CmdArgs.push_back("-lgomp");
8772
8773 // FIXME: Exclude this for platforms with libgomp that don't require
8774 // librt. Most modern Linux platforms require it, but some may not.
8775 CmdArgs.push_back("-lrt");
8776 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008777 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008778 CmdArgs.push_back("-liomp5");
8779 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008780 case OMPRT_Unknown:
8781 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008782 break;
8783 }
Chandler Carruth01538002013-01-17 13:19:29 +00008784 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008785
Renato Golinc4b49242014-02-13 10:01:16 +00008786 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008787
Richard Smith31d1de22015-05-20 22:48:44 +00008788 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008789 CmdArgs.push_back("-lpthread");
8790
8791 CmdArgs.push_back("-lc");
8792
8793 if (Args.hasArg(options::OPT_static))
8794 CmdArgs.push_back("--end-group");
8795 else
Renato Golinc4b49242014-02-13 10:01:16 +00008796 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008797 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008798
Rafael Espindola81937ec2010-12-01 01:52:43 +00008799 if (!Args.hasArg(options::OPT_nostartfiles)) {
8800 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008801 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008802 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008803 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008804 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008805 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008806 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008807
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008808 if (HasCRTBeginEndFiles)
8809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008810 if (!isAndroid)
8811 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008812 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008813 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008814
Peter Collingbourne39719a72015-11-20 20:49:39 +00008815 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008816}
8817
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008818// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8819// for the various SFI requirements like register masking. The assembly tool
8820// inserts the file containing the macros as an input into all the assembly
8821// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008822void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8823 const InputInfo &Output,
8824 const InputInfoList &Inputs,
8825 const ArgList &Args,
8826 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008827 const toolchains::NaClToolChain &ToolChain =
8828 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008829 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8830 "nacl-arm-macros.s");
8831 InputInfoList NewInputs;
8832 NewInputs.push_back(NaClMacros);
8833 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008834 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8835 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008836}
8837
Douglas Katzman750cfc52015-06-29 18:42:16 +00008838// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008839// we use static by default, do not yet support sanitizers or LTO, and a few
8840// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008841// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008842void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8843 const InputInfo &Output,
8844 const InputInfoList &Inputs,
8845 const ArgList &Args,
8846 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008847
Douglas Katzman54366072015-07-27 16:53:08 +00008848 const toolchains::NaClToolChain &ToolChain =
8849 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008850 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008851 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008852 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008853 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008854
8855 ArgStringList CmdArgs;
8856
8857 // Silence warning for "clang -g foo.o -o foo"
8858 Args.ClaimAllArgs(options::OPT_g_Group);
8859 // and "clang -emit-llvm foo.o -o foo"
8860 Args.ClaimAllArgs(options::OPT_emit_llvm);
8861 // and for "clang -w foo.o -o foo". Other warning options are already
8862 // handled somewhere else.
8863 Args.ClaimAllArgs(options::OPT_w);
8864
8865 if (!D.SysRoot.empty())
8866 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8867
8868 if (Args.hasArg(options::OPT_rdynamic))
8869 CmdArgs.push_back("-export-dynamic");
8870
8871 if (Args.hasArg(options::OPT_s))
8872 CmdArgs.push_back("-s");
8873
Douglas Katzman54366072015-07-27 16:53:08 +00008874 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8875 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008876 CmdArgs.push_back("--build-id");
8877
8878 if (!IsStatic)
8879 CmdArgs.push_back("--eh-frame-hdr");
8880
8881 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008882 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008883 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008884 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008885 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008886 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008887 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008888 else if (Arch == llvm::Triple::mipsel)
8889 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008890 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008891 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8892 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008893
8894 if (IsStatic)
8895 CmdArgs.push_back("-static");
8896 else if (Args.hasArg(options::OPT_shared))
8897 CmdArgs.push_back("-shared");
8898
8899 CmdArgs.push_back("-o");
8900 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008901 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008902 if (!Args.hasArg(options::OPT_shared))
8903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8904 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8905
8906 const char *crtbegin;
8907 if (IsStatic)
8908 crtbegin = "crtbeginT.o";
8909 else if (Args.hasArg(options::OPT_shared))
8910 crtbegin = "crtbeginS.o";
8911 else
8912 crtbegin = "crtbegin.o";
8913 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8914 }
8915
8916 Args.AddAllArgs(CmdArgs, options::OPT_L);
8917 Args.AddAllArgs(CmdArgs, options::OPT_u);
8918
Douglas Katzman6059ef92015-11-17 17:41:23 +00008919 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008920
8921 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8922 CmdArgs.push_back("--no-demangle");
8923
8924 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8925
Douglas Katzman78b37b02015-11-17 20:28:07 +00008926 if (D.CCCIsCXX() &&
8927 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008928 bool OnlyLibstdcxxStatic =
8929 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008930 if (OnlyLibstdcxxStatic)
8931 CmdArgs.push_back("-Bstatic");
8932 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8933 if (OnlyLibstdcxxStatic)
8934 CmdArgs.push_back("-Bdynamic");
8935 CmdArgs.push_back("-lm");
8936 }
8937
8938 if (!Args.hasArg(options::OPT_nostdlib)) {
8939 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8940 // Always use groups, since it has no effect on dynamic libraries.
8941 CmdArgs.push_back("--start-group");
8942 CmdArgs.push_back("-lc");
8943 // NaCl's libc++ currently requires libpthread, so just always include it
8944 // in the group for C++.
8945 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008946 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008947 // Gold, used by Mips, handles nested groups differently than ld, and
8948 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8949 // which is not a desired behaviour here.
8950 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8951 if (getToolChain().getArch() == llvm::Triple::mipsel)
8952 CmdArgs.push_back("-lnacl");
8953
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008954 CmdArgs.push_back("-lpthread");
8955 }
8956
8957 CmdArgs.push_back("-lgcc");
8958 CmdArgs.push_back("--as-needed");
8959 if (IsStatic)
8960 CmdArgs.push_back("-lgcc_eh");
8961 else
8962 CmdArgs.push_back("-lgcc_s");
8963 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008964
8965 // Mips needs to create and use pnacl_legacy library that contains
8966 // definitions from bitcode/pnaclmm.c and definitions for
8967 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8968 if (getToolChain().getArch() == llvm::Triple::mipsel)
8969 CmdArgs.push_back("-lpnacl_legacy");
8970
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008971 CmdArgs.push_back("--end-group");
8972 }
8973
8974 if (!Args.hasArg(options::OPT_nostartfiles)) {
8975 const char *crtend;
8976 if (Args.hasArg(options::OPT_shared))
8977 crtend = "crtendS.o";
8978 else
8979 crtend = "crtend.o";
8980
8981 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8982 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8983 }
8984 }
8985
Peter Collingbourne39719a72015-11-20 20:49:39 +00008986 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8987 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008988}
8989
Douglas Katzman95354292015-06-23 20:42:09 +00008990void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8991 const InputInfo &Output,
8992 const InputInfoList &Inputs,
8993 const ArgList &Args,
8994 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008995 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008996 ArgStringList CmdArgs;
8997
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008998 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008999
9000 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009001 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009002
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009003 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009004 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009005
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009006 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009007 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009008}
9009
Douglas Katzman95354292015-06-23 20:42:09 +00009010void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9011 const InputInfo &Output,
9012 const InputInfoList &Inputs,
9013 const ArgList &Args,
9014 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009015 const Driver &D = getToolChain().getDriver();
9016 ArgStringList CmdArgs;
9017
Daniel Dunbarb440f562010-08-02 02:38:21 +00009018 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009019 CmdArgs.push_back("-o");
9020 CmdArgs.push_back(Output.getFilename());
9021 } else {
9022 assert(Output.isNothing() && "Invalid output.");
9023 }
9024
Douglas Katzman78b37b02015-11-17 20:28:07 +00009025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009026 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9027 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9028 CmdArgs.push_back(
9029 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9030 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009031 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009032
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009033 Args.AddAllArgs(CmdArgs,
9034 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009035
Daniel Dunbar54423b22010-09-17 00:24:54 +00009036 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009037
Xinliang David Li69306c02015-10-22 06:15:31 +00009038 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009039
Douglas Katzman78b37b02015-11-17 20:28:07 +00009040 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009041 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009042 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009043 CmdArgs.push_back("-lm");
9044 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009045 }
9046
Douglas Katzman78b37b02015-11-17 20:28:07 +00009047 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009048 if (Args.hasArg(options::OPT_pthread))
9049 CmdArgs.push_back("-lpthread");
9050 CmdArgs.push_back("-lc");
9051 CmdArgs.push_back("-lCompilerRT-Generic");
9052 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9053 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009054 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009055 }
9056
Logan Chieneb9162f2014-06-26 14:23:45 +00009057 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009058 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009059}
9060
Daniel Dunbarcc912342009-05-02 18:28:39 +00009061/// DragonFly Tools
9062
9063// For now, DragonFly Assemble does just about the same as for
9064// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009065void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9066 const InputInfo &Output,
9067 const InputInfoList &Inputs,
9068 const ArgList &Args,
9069 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009070 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009071 ArgStringList CmdArgs;
9072
9073 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9074 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009075 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009076 CmdArgs.push_back("--32");
9077
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009078 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009079
9080 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009081 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009082
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009083 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009084 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009085
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009086 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009087 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009088}
9089
Douglas Katzman95354292015-06-23 20:42:09 +00009090void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9091 const InputInfo &Output,
9092 const InputInfoList &Inputs,
9093 const ArgList &Args,
9094 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009095 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009096 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00009097 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00009098
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009099 if (!D.SysRoot.empty())
9100 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9101
John McCall65b8da02013-04-11 22:55:55 +00009102 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009103 if (Args.hasArg(options::OPT_static)) {
9104 CmdArgs.push_back("-Bstatic");
9105 } else {
John McCall65b8da02013-04-11 22:55:55 +00009106 if (Args.hasArg(options::OPT_rdynamic))
9107 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009108 if (Args.hasArg(options::OPT_shared))
9109 CmdArgs.push_back("-Bshareable");
9110 else {
9111 CmdArgs.push_back("-dynamic-linker");
9112 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9113 }
John McCall65b8da02013-04-11 22:55:55 +00009114 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009115 }
9116
9117 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9118 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009119 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009120 CmdArgs.push_back("-m");
9121 CmdArgs.push_back("elf_i386");
9122 }
9123
Daniel Dunbarb440f562010-08-02 02:38:21 +00009124 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009125 CmdArgs.push_back("-o");
9126 CmdArgs.push_back(Output.getFilename());
9127 } else {
9128 assert(Output.isNothing() && "Invalid output.");
9129 }
9130
Douglas Katzman78b37b02015-11-17 20:28:07 +00009131 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009132 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009133 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009134 CmdArgs.push_back(
9135 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009136 else {
9137 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009138 CmdArgs.push_back(
9139 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009140 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009141 CmdArgs.push_back(
9142 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009143 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009144 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009145 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009146 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009147 CmdArgs.push_back(
9148 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009149 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009150 CmdArgs.push_back(
9151 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009152 }
9153
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009154 Args.AddAllArgs(CmdArgs,
9155 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009156
Daniel Dunbar54423b22010-09-17 00:24:54 +00009157 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009158
Douglas Katzman78b37b02015-11-17 20:28:07 +00009159 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009160 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9161 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009162 if (UseGCC47)
9163 CmdArgs.push_back("-L/usr/lib/gcc47");
9164 else
9165 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009166
9167 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009168 if (UseGCC47) {
9169 CmdArgs.push_back("-rpath");
9170 CmdArgs.push_back("/usr/lib/gcc47");
9171 } else {
9172 CmdArgs.push_back("-rpath");
9173 CmdArgs.push_back("/usr/lib/gcc44");
9174 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009175 }
9176
Hans Wennborg70850d82013-07-18 20:29:38 +00009177 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009178 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009179 CmdArgs.push_back("-lm");
9180 }
9181
Daniel Dunbarcc912342009-05-02 18:28:39 +00009182 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009183 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009184
9185 if (!Args.hasArg(options::OPT_nolibc)) {
9186 CmdArgs.push_back("-lc");
9187 }
9188
John McCall65b8da02013-04-11 22:55:55 +00009189 if (UseGCC47) {
9190 if (Args.hasArg(options::OPT_static) ||
9191 Args.hasArg(options::OPT_static_libgcc)) {
9192 CmdArgs.push_back("-lgcc");
9193 CmdArgs.push_back("-lgcc_eh");
9194 } else {
9195 if (Args.hasArg(options::OPT_shared_libgcc)) {
9196 CmdArgs.push_back("-lgcc_pic");
9197 if (!Args.hasArg(options::OPT_shared))
9198 CmdArgs.push_back("-lgcc");
9199 } else {
9200 CmdArgs.push_back("-lgcc");
9201 CmdArgs.push_back("--as-needed");
9202 CmdArgs.push_back("-lgcc_pic");
9203 CmdArgs.push_back("--no-as-needed");
9204 }
9205 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009206 } else {
John McCall65b8da02013-04-11 22:55:55 +00009207 if (Args.hasArg(options::OPT_shared)) {
9208 CmdArgs.push_back("-lgcc_pic");
9209 } else {
9210 CmdArgs.push_back("-lgcc");
9211 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009212 }
9213 }
9214
Douglas Katzman78b37b02015-11-17 20:28:07 +00009215 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009216 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009217 CmdArgs.push_back(
9218 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009219 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009220 CmdArgs.push_back(
9221 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9222 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009223 }
9224
Xinliang David Li69306c02015-10-22 06:15:31 +00009225 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009226
Logan Chieneb9162f2014-06-26 14:23:45 +00009227 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009229}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009230
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009231// Try to find Exe from a Visual Studio distribution. This first tries to find
9232// an installed copy of Visual Studio and, failing that, looks in the PATH,
9233// making sure that whatever executable that's found is not a same-named exe
9234// from clang itself to prevent clang from falling back to itself.
9235static std::string FindVisualStudioExecutable(const ToolChain &TC,
9236 const char *Exe,
9237 const char *ClangProgramPath) {
9238 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9239 std::string visualStudioBinDir;
9240 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9241 visualStudioBinDir)) {
9242 SmallString<128> FilePath(visualStudioBinDir);
9243 llvm::sys::path::append(FilePath, Exe);
9244 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9245 return FilePath.str();
9246 }
9247
9248 return Exe;
9249}
9250
Douglas Katzman95354292015-06-23 20:42:09 +00009251void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9252 const InputInfo &Output,
9253 const InputInfoList &Inputs,
9254 const ArgList &Args,
9255 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009256 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009257 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009258
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009259 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9260 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009261 CmdArgs.push_back(
9262 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009263
Douglas Katzman78b37b02015-11-17 20:28:07 +00009264 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9265 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009266 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009267
Zachary Turner10d75b22014-10-22 20:40:43 +00009268 if (!llvm::sys::Process::GetEnv("LIB")) {
9269 // If the VC environment hasn't been configured (perhaps because the user
9270 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009271 // the environment variable is set however, assume the user knows what
9272 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009273 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009274 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009275 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9276 SmallString<128> LibDir(VisualStudioDir);
9277 llvm::sys::path::append(LibDir, "VC", "lib");
9278 switch (MSVC.getArch()) {
9279 case llvm::Triple::x86:
9280 // x86 just puts the libraries directly in lib
9281 break;
9282 case llvm::Triple::x86_64:
9283 llvm::sys::path::append(LibDir, "amd64");
9284 break;
9285 case llvm::Triple::arm:
9286 llvm::sys::path::append(LibDir, "arm");
9287 break;
9288 default:
9289 break;
9290 }
9291 CmdArgs.push_back(
9292 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009293
9294 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9295 std::string UniversalCRTLibPath;
9296 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9297 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9298 UniversalCRTLibPath.c_str()));
9299 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009300 }
9301
9302 std::string WindowsSdkLibPath;
9303 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9304 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9305 WindowsSdkLibPath.c_str()));
9306 }
9307
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009308 CmdArgs.push_back("-nologo");
9309
Reid Kleckner124955a2015-08-05 18:51:13 +00009310 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009311 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009313 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009314 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009315 if (DLL) {
9316 CmdArgs.push_back(Args.MakeArgString("-dll"));
9317
9318 SmallString<128> ImplibName(Output.getFilename());
9319 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009320 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009321 }
9322
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009323 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009324 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009325 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009326 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009327 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9328 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009329 // Make sure the dynamic runtime thunk is not optimized out at link time
9330 // to ensure proper SEH handling.
9331 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009332 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009333 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009334 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009335 for (const auto &Lib : {"asan", "asan_cxx"})
9336 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009337 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009338 }
9339
Hans Wennborg2e274592013-08-13 23:38:57 +00009340 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009341
Alexey Bataevc7e84352015-08-19 04:49:01 +00009342 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9343 options::OPT_fno_openmp, false)) {
9344 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9345 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9346 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9347 TC.getDriver().Dir + "/../lib"));
9348 switch (getOpenMPRuntime(getToolChain(), Args)) {
9349 case OMPRT_OMP:
9350 CmdArgs.push_back("-defaultlib:libomp.lib");
9351 break;
9352 case OMPRT_IOMP5:
9353 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9354 break;
9355 case OMPRT_GOMP:
9356 break;
9357 case OMPRT_Unknown:
9358 // Already diagnosed.
9359 break;
9360 }
9361 }
9362
Reid Kleckner337188f2014-09-16 19:22:00 +00009363 // Add filenames, libraries, and other linker inputs.
9364 for (const auto &Input : Inputs) {
9365 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009366 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009367 continue;
9368 }
9369
9370 const Arg &A = Input.getInputArg();
9371
9372 // Render -l options differently for the MSVC linker.
9373 if (A.getOption().matches(options::OPT_l)) {
9374 StringRef Lib = A.getValue();
9375 const char *LinkLibArg;
9376 if (Lib.endswith(".lib"))
9377 LinkLibArg = Args.MakeArgString(Lib);
9378 else
9379 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9380 CmdArgs.push_back(LinkLibArg);
9381 continue;
9382 }
9383
9384 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9385 // or -L. Render it, even if MSVC doesn't understand it.
9386 A.renderAsInput(Args, CmdArgs);
9387 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009388
Zachary Turner719f58c2014-12-01 23:06:47 +00009389 // We need to special case some linker paths. In the case of lld, we need to
9390 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9391 // linker, we need to use a special search algorithm.
9392 llvm::SmallString<128> linkPath;
9393 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9394 if (Linker.equals_lower("lld"))
9395 Linker = "lld-link";
9396
9397 if (Linker.equals_lower("link")) {
9398 // If we're using the MSVC linker, it's not sufficient to just use link
9399 // from the program PATH, because other environments like GnuWin32 install
9400 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009401 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009402 C.getDriver().getClangProgramPath());
9403 } else {
9404 linkPath = Linker;
9405 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009406 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009407 }
9408
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009409 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009410 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009411}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009412
Douglas Katzman95354292015-06-23 20:42:09 +00009413void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9414 const InputInfo &Output,
9415 const InputInfoList &Inputs,
9416 const ArgList &Args,
9417 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009418 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9419}
9420
Douglas Katzman95354292015-06-23 20:42:09 +00009421std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009422 Compilation &C, const JobAction &JA, const InputInfo &Output,
9423 const InputInfoList &Inputs, const ArgList &Args,
9424 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009425 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009426 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009427 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009428 CmdArgs.push_back("/W0"); // No warnings.
9429
9430 // The goal is to be able to invoke this tool correctly based on
9431 // any flag accepted by clang-cl.
9432
9433 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009434 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009435
9436 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009437 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9438 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9439 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009440 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9441 if (A->getOption().getID() == options::OPT_O0) {
9442 CmdArgs.push_back("/Od");
9443 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009444 CmdArgs.push_back("/Og");
9445
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009446 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009447 if (OptLevel == "s" || OptLevel == "z")
9448 CmdArgs.push_back("/Os");
9449 else
9450 CmdArgs.push_back("/Ot");
9451
9452 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009453 }
9454 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009455 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9456 options::OPT_fno_omit_frame_pointer))
9457 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9458 ? "/Oy"
9459 : "/Oy-");
9460 if (!Args.hasArg(options::OPT_fwritable_strings))
9461 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009462
Nico Weber3f8dafb2015-03-12 19:37:10 +00009463 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009464 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9465
David Majnemerf6072342014-07-01 22:24:56 +00009466 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9467 /*default=*/false))
9468 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009469 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9470 options::OPT_fno_function_sections))
9471 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9472 ? "/Gy"
9473 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009474 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9475 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009476 CmdArgs.push_back(
9477 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009478 if (Args.hasArg(options::OPT_fsyntax_only))
9479 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009480 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9481 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009482 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009483
Nico Weber3f8dafb2015-03-12 19:37:10 +00009484 std::vector<std::string> Includes =
9485 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009486 for (const auto &Include : Includes)
9487 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009488
Hans Wennborg87cfa712013-09-19 20:32:16 +00009489 // Flags that can simply be passed through.
9490 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9491 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009492 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009493 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009494
9495 // The order of these flags is relevant, so pick the last one.
9496 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9497 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9498 A->render(Args, CmdArgs);
9499
Hans Wennborg87cfa712013-09-19 20:32:16 +00009500 // Input filename.
9501 assert(Inputs.size() == 1);
9502 const InputInfo &II = Inputs[0];
9503 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9504 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9505 if (II.isFilename())
9506 CmdArgs.push_back(II.getFilename());
9507 else
9508 II.getInputArg().renderAsInput(Args, CmdArgs);
9509
9510 // Output filename.
9511 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009512 const char *Fo =
9513 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009514 CmdArgs.push_back(Fo);
9515
Hans Wennborg188382e2013-09-20 18:16:35 +00009516 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009517 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9518 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009519 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009520 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009521}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009522
Yaron Keren1c0070c2015-07-02 04:45:27 +00009523/// MinGW Tools
9524void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9525 const InputInfo &Output,
9526 const InputInfoList &Inputs,
9527 const ArgList &Args,
9528 const char *LinkingOutput) const {
9529 claimNoWarnArgs(Args);
9530 ArgStringList CmdArgs;
9531
9532 if (getToolChain().getArch() == llvm::Triple::x86) {
9533 CmdArgs.push_back("--32");
9534 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9535 CmdArgs.push_back("--64");
9536 }
9537
9538 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9539
9540 CmdArgs.push_back("-o");
9541 CmdArgs.push_back(Output.getFilename());
9542
9543 for (const auto &II : Inputs)
9544 CmdArgs.push_back(II.getFilename());
9545
9546 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009547 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009548
9549 if (Args.hasArg(options::OPT_gsplit_dwarf))
9550 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9551 SplitDebugName(Args, Inputs[0]));
9552}
9553
9554void MinGW::Linker::AddLibGCC(const ArgList &Args,
9555 ArgStringList &CmdArgs) const {
9556 if (Args.hasArg(options::OPT_mthreads))
9557 CmdArgs.push_back("-lmingwthrd");
9558 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009559
Yaron Kerenaa281332015-08-09 00:24:07 +00009560 // Make use of compiler-rt if --rtlib option is used
9561 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9562 if (RLT == ToolChain::RLT_Libgcc) {
9563 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9564 Args.hasArg(options::OPT_static);
9565 bool Shared = Args.hasArg(options::OPT_shared);
9566 bool CXX = getToolChain().getDriver().CCCIsCXX();
9567
9568 if (Static || (!CXX && !Shared)) {
9569 CmdArgs.push_back("-lgcc");
9570 CmdArgs.push_back("-lgcc_eh");
9571 } else {
9572 CmdArgs.push_back("-lgcc_s");
9573 CmdArgs.push_back("-lgcc");
9574 }
9575 } else {
9576 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9577 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009578
Yaron Keren1c0070c2015-07-02 04:45:27 +00009579 CmdArgs.push_back("-lmoldname");
9580 CmdArgs.push_back("-lmingwex");
9581 CmdArgs.push_back("-lmsvcrt");
9582}
9583
9584void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9585 const InputInfo &Output,
9586 const InputInfoList &Inputs,
9587 const ArgList &Args,
9588 const char *LinkingOutput) const {
9589 const ToolChain &TC = getToolChain();
9590 const Driver &D = TC.getDriver();
9591 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9592
9593 ArgStringList CmdArgs;
9594
9595 // Silence warning for "clang -g foo.o -o foo"
9596 Args.ClaimAllArgs(options::OPT_g_Group);
9597 // and "clang -emit-llvm foo.o -o foo"
9598 Args.ClaimAllArgs(options::OPT_emit_llvm);
9599 // and for "clang -w foo.o -o foo". Other warning options are already
9600 // handled somewhere else.
9601 Args.ClaimAllArgs(options::OPT_w);
9602
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009603 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9604 if (LinkerName.equals_lower("lld")) {
9605 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009606 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009607 } else if (!LinkerName.equals_lower("ld")) {
9608 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009609 }
9610
Yaron Keren1c0070c2015-07-02 04:45:27 +00009611 if (!D.SysRoot.empty())
9612 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9613
9614 if (Args.hasArg(options::OPT_s))
9615 CmdArgs.push_back("-s");
9616
9617 CmdArgs.push_back("-m");
9618 if (TC.getArch() == llvm::Triple::x86)
9619 CmdArgs.push_back("i386pe");
9620 if (TC.getArch() == llvm::Triple::x86_64)
9621 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009622 if (TC.getArch() == llvm::Triple::arm)
9623 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009624
9625 if (Args.hasArg(options::OPT_mwindows)) {
9626 CmdArgs.push_back("--subsystem");
9627 CmdArgs.push_back("windows");
9628 } else if (Args.hasArg(options::OPT_mconsole)) {
9629 CmdArgs.push_back("--subsystem");
9630 CmdArgs.push_back("console");
9631 }
9632
9633 if (Args.hasArg(options::OPT_static))
9634 CmdArgs.push_back("-Bstatic");
9635 else {
9636 if (Args.hasArg(options::OPT_mdll))
9637 CmdArgs.push_back("--dll");
9638 else if (Args.hasArg(options::OPT_shared))
9639 CmdArgs.push_back("--shared");
9640 CmdArgs.push_back("-Bdynamic");
9641 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9642 CmdArgs.push_back("-e");
9643 if (TC.getArch() == llvm::Triple::x86)
9644 CmdArgs.push_back("_DllMainCRTStartup@12");
9645 else
9646 CmdArgs.push_back("DllMainCRTStartup");
9647 CmdArgs.push_back("--enable-auto-image-base");
9648 }
9649 }
9650
9651 CmdArgs.push_back("-o");
9652 CmdArgs.push_back(Output.getFilename());
9653
9654 Args.AddAllArgs(CmdArgs, options::OPT_e);
9655 // FIXME: add -N, -n flags
9656 Args.AddLastArg(CmdArgs, options::OPT_r);
9657 Args.AddLastArg(CmdArgs, options::OPT_s);
9658 Args.AddLastArg(CmdArgs, options::OPT_t);
9659 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9660 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9661
Douglas Katzman78b37b02015-11-17 20:28:07 +00009662 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009663 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9664 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9665 } else {
9666 if (Args.hasArg(options::OPT_municode))
9667 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9668 else
9669 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9670 }
9671 if (Args.hasArg(options::OPT_pg))
9672 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9673 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9674 }
9675
9676 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009677 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009678 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9679
9680 // TODO: Add ASan stuff here
9681
9682 // TODO: Add profile stuff here
9683
Douglas Katzman78b37b02015-11-17 20:28:07 +00009684 if (D.CCCIsCXX() &&
9685 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009686 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9687 !Args.hasArg(options::OPT_static);
9688 if (OnlyLibstdcxxStatic)
9689 CmdArgs.push_back("-Bstatic");
9690 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9691 if (OnlyLibstdcxxStatic)
9692 CmdArgs.push_back("-Bdynamic");
9693 }
9694
9695 if (!Args.hasArg(options::OPT_nostdlib)) {
9696 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9697 if (Args.hasArg(options::OPT_static))
9698 CmdArgs.push_back("--start-group");
9699
9700 if (Args.hasArg(options::OPT_fstack_protector) ||
9701 Args.hasArg(options::OPT_fstack_protector_strong) ||
9702 Args.hasArg(options::OPT_fstack_protector_all)) {
9703 CmdArgs.push_back("-lssp_nonshared");
9704 CmdArgs.push_back("-lssp");
9705 }
9706 if (Args.hasArg(options::OPT_fopenmp))
9707 CmdArgs.push_back("-lgomp");
9708
9709 AddLibGCC(Args, CmdArgs);
9710
9711 if (Args.hasArg(options::OPT_pg))
9712 CmdArgs.push_back("-lgmon");
9713
Yaron Kerenadce68e2015-07-06 18:52:19 +00009714 if (Args.hasArg(options::OPT_pthread))
9715 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009716
9717 // add system libraries
9718 if (Args.hasArg(options::OPT_mwindows)) {
9719 CmdArgs.push_back("-lgdi32");
9720 CmdArgs.push_back("-lcomdlg32");
9721 }
9722 CmdArgs.push_back("-ladvapi32");
9723 CmdArgs.push_back("-lshell32");
9724 CmdArgs.push_back("-luser32");
9725 CmdArgs.push_back("-lkernel32");
9726
9727 if (Args.hasArg(options::OPT_static))
9728 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009729 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009730 AddLibGCC(Args, CmdArgs);
9731 }
9732
9733 if (!Args.hasArg(options::OPT_nostartfiles)) {
9734 // Add crtfastmath.o if available and fast math is enabled.
9735 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9736
9737 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9738 }
9739 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009740 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009741 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009742}
9743
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009744/// XCore Tools
9745// We pass assemble and link construction to the xcc tool.
9746
Douglas Katzman95354292015-06-23 20:42:09 +00009747void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9748 const InputInfo &Output,
9749 const InputInfoList &Inputs,
9750 const ArgList &Args,
9751 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009752 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009753 ArgStringList CmdArgs;
9754
9755 CmdArgs.push_back("-o");
9756 CmdArgs.push_back(Output.getFilename());
9757
9758 CmdArgs.push_back("-c");
9759
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009760 if (Args.hasArg(options::OPT_v))
9761 CmdArgs.push_back("-v");
9762
Robert Lytton894d25c2014-05-02 09:33:25 +00009763 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9764 if (!A->getOption().matches(options::OPT_g0))
9765 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009766
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009767 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9768 false))
9769 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009771 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009772
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009773 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009774 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009775
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009776 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009777 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009778}
9779
Douglas Katzman95354292015-06-23 20:42:09 +00009780void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9781 const InputInfo &Output,
9782 const InputInfoList &Inputs,
9783 const ArgList &Args,
9784 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009785 ArgStringList CmdArgs;
9786
9787 if (Output.isFilename()) {
9788 CmdArgs.push_back("-o");
9789 CmdArgs.push_back(Output.getFilename());
9790 } else {
9791 assert(Output.isNothing() && "Invalid output.");
9792 }
9793
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009794 if (Args.hasArg(options::OPT_v))
9795 CmdArgs.push_back("-v");
9796
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009797 // Pass -fexceptions through to the linker if it was present.
9798 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9799 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009800 CmdArgs.push_back("-fexceptions");
9801
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009802 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9803
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009804 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009805 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009806}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009807
Douglas Katzman95354292015-06-23 20:42:09 +00009808void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9809 const InputInfo &Output,
9810 const InputInfoList &Inputs,
9811 const ArgList &Args,
9812 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009813 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009814 const auto &TC =
9815 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9816 ArgStringList CmdArgs;
9817 const char *Exec;
9818
9819 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009820 default:
9821 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009822 case llvm::Triple::arm:
9823 case llvm::Triple::thumb:
9824 break;
9825 case llvm::Triple::x86:
9826 CmdArgs.push_back("--32");
9827 break;
9828 case llvm::Triple::x86_64:
9829 CmdArgs.push_back("--64");
9830 break;
9831 }
9832
9833 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9834
9835 CmdArgs.push_back("-o");
9836 CmdArgs.push_back(Output.getFilename());
9837
9838 for (const auto &Input : Inputs)
9839 CmdArgs.push_back(Input.getFilename());
9840
9841 const std::string Assembler = TC.GetProgramPath("as");
9842 Exec = Args.MakeArgString(Assembler);
9843
Justin Bognerd3371d82015-07-17 03:35:54 +00009844 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009845}
9846
Douglas Katzman95354292015-06-23 20:42:09 +00009847void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9848 const InputInfo &Output,
9849 const InputInfoList &Inputs,
9850 const ArgList &Args,
9851 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009852 const auto &TC =
9853 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9854 const llvm::Triple &T = TC.getTriple();
9855 const Driver &D = TC.getDriver();
9856 SmallString<128> EntryPoint;
9857 ArgStringList CmdArgs;
9858 const char *Exec;
9859
9860 // Silence warning for "clang -g foo.o -o foo"
9861 Args.ClaimAllArgs(options::OPT_g_Group);
9862 // and "clang -emit-llvm foo.o -o foo"
9863 Args.ClaimAllArgs(options::OPT_emit_llvm);
9864 // and for "clang -w foo.o -o foo"
9865 Args.ClaimAllArgs(options::OPT_w);
9866 // Other warning options are already handled somewhere else.
9867
9868 if (!D.SysRoot.empty())
9869 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9870
9871 if (Args.hasArg(options::OPT_pie))
9872 CmdArgs.push_back("-pie");
9873 if (Args.hasArg(options::OPT_rdynamic))
9874 CmdArgs.push_back("-export-dynamic");
9875 if (Args.hasArg(options::OPT_s))
9876 CmdArgs.push_back("--strip-all");
9877
9878 CmdArgs.push_back("-m");
9879 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009880 default:
9881 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009882 case llvm::Triple::arm:
9883 case llvm::Triple::thumb:
9884 // FIXME: this is incorrect for WinCE
9885 CmdArgs.push_back("thumb2pe");
9886 break;
9887 case llvm::Triple::x86:
9888 CmdArgs.push_back("i386pe");
9889 EntryPoint.append("_");
9890 break;
9891 case llvm::Triple::x86_64:
9892 CmdArgs.push_back("i386pep");
9893 break;
9894 }
9895
9896 if (Args.hasArg(options::OPT_shared)) {
9897 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009898 default:
9899 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009900 case llvm::Triple::arm:
9901 case llvm::Triple::thumb:
9902 case llvm::Triple::x86_64:
9903 EntryPoint.append("_DllMainCRTStartup");
9904 break;
9905 case llvm::Triple::x86:
9906 EntryPoint.append("_DllMainCRTStartup@12");
9907 break;
9908 }
9909
9910 CmdArgs.push_back("-shared");
9911 CmdArgs.push_back("-Bdynamic");
9912
9913 CmdArgs.push_back("--enable-auto-image-base");
9914
9915 CmdArgs.push_back("--entry");
9916 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9917 } else {
9918 EntryPoint.append("mainCRTStartup");
9919
9920 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9921 : "-Bdynamic");
9922
Douglas Katzman78b37b02015-11-17 20:28:07 +00009923 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009924 CmdArgs.push_back("--entry");
9925 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9926 }
9927
9928 // FIXME: handle subsystem
9929 }
9930
9931 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009932 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009933
9934 CmdArgs.push_back("-o");
9935 CmdArgs.push_back(Output.getFilename());
9936
9937 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9938 SmallString<261> ImpLib(Output.getFilename());
9939 llvm::sys::path::replace_extension(ImpLib, ".lib");
9940
9941 CmdArgs.push_back("--out-implib");
9942 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9943 }
9944
Douglas Katzman78b37b02015-11-17 20:28:07 +00009945 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009946 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9947 const char *CRTBegin;
9948
9949 CRTBegin =
9950 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9951 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9952 }
9953
9954 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009955 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009956 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9957
9958 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9959 !Args.hasArg(options::OPT_nodefaultlibs)) {
9960 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9961 !Args.hasArg(options::OPT_static);
9962 if (StaticCXX)
9963 CmdArgs.push_back("-Bstatic");
9964 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9965 if (StaticCXX)
9966 CmdArgs.push_back("-Bdynamic");
9967 }
9968
9969 if (!Args.hasArg(options::OPT_nostdlib)) {
9970 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9971 // TODO handle /MT[d] /MD[d]
9972 CmdArgs.push_back("-lmsvcrt");
9973 AddRunTimeLibs(TC, D, CmdArgs, Args);
9974 }
9975 }
9976
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009977 if (TC.getSanitizerArgs().needsAsanRt()) {
9978 // TODO handle /MT[d] /MD[d]
9979 if (Args.hasArg(options::OPT_shared)) {
9980 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9981 } else {
9982 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9983 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9984 // Make sure the dynamic runtime thunk is not optimized out at link time
9985 // to ensure proper SEH handling.
9986 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9987 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9988 ? "___asan_seh_interceptor"
9989 : "__asan_seh_interceptor"));
9990 }
9991 }
9992
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009993 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009994
Justin Bognerd3371d82015-07-17 03:35:54 +00009995 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009996}
Douglas Katzman84a75642015-06-19 14:55:19 +00009997
Douglas Katzman95354292015-06-23 20:42:09 +00009998void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9999 const InputInfo &Output,
10000 const InputInfoList &Inputs,
10001 const ArgList &Args,
10002 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010003 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010004 assert(Inputs.size() == 1);
10005 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010006 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10007 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010008
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010009 if (JA.getKind() == Action::PreprocessJobClass) {
10010 Args.ClaimAllArgs();
10011 CmdArgs.push_back("-E");
10012 } else {
10013 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10014 CmdArgs.push_back("-S");
10015 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10016 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010017 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010018 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010019
Douglas Katzmanf6071112015-08-03 14:34:22 +000010020 // Append all -I, -iquote, -isystem paths, defines/undefines,
10021 // 'f' flags, optimize flags, and warning options.
10022 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010023 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010024 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010025 options::OPT_f_Group, options::OPT_f_clang_Group,
10026 options::OPT_g_Group, options::OPT_M_Group,
10027 options::OPT_O_Group, options::OPT_W_Group});
10028
10029 // If we're producing a dependency file, and assembly is the final action,
10030 // then the name of the target in the dependency file should be the '.o'
10031 // file, not the '.s' file produced by this step. For example, instead of
10032 // /tmp/mumble.s: mumble.c .../someheader.h
10033 // the filename on the lefthand side should be "mumble.o"
10034 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10035 C.getActions().size() == 1 &&
10036 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10037 Arg *A = Args.getLastArg(options::OPT_o);
10038 if (A) {
10039 CmdArgs.push_back("-MT");
10040 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10041 }
10042 }
10043
Douglas Katzman84a75642015-06-19 14:55:19 +000010044 CmdArgs.push_back(II.getFilename());
10045 CmdArgs.push_back("-o");
10046 CmdArgs.push_back(Output.getFilename());
10047
10048 std::string Exec =
10049 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010050 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10051 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010052}
10053
Douglas Katzman95354292015-06-23 20:42:09 +000010054void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10055 const InputInfo &Output,
10056 const InputInfoList &Inputs,
10057 const ArgList &Args,
10058 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010059 ArgStringList CmdArgs;
10060
10061 assert(Inputs.size() == 1);
10062 const InputInfo &II = Inputs[0];
10063 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10064 assert(Output.getType() == types::TY_Object);
10065
10066 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010067 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010068 CmdArgs.push_back("-noSPrefixing");
10069 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010070 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10071 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10072 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010073 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010074 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010075 }
10076 CmdArgs.push_back("-elf"); // Output format.
10077 CmdArgs.push_back(II.getFilename());
10078 CmdArgs.push_back(
10079 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10080
10081 std::string Exec =
10082 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010083 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10084 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010085}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010086
10087void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10088 const InputInfo &Output,
10089 const InputInfoList &Inputs,
10090 const ArgList &Args,
10091 const char *LinkingOutput) const {
10092 const auto &TC =
10093 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10094 const llvm::Triple &T = TC.getTriple();
10095 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010096 bool UseStartfiles =
10097 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010098 bool UseDefaultLibs =
10099 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010100
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010101 if (T.getArch() == llvm::Triple::sparc)
10102 CmdArgs.push_back("-EB");
10103 else // SHAVE assumes little-endian, and sparcel is expressly so.
10104 CmdArgs.push_back("-EL");
10105
10106 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10107 // but we never pass through a --sysroot option and various other bits.
10108 // For example, there are no sanitizers (yet) nor gold linker.
10109
10110 // Eat some arguments that may be present but have no effect.
10111 Args.ClaimAllArgs(options::OPT_g_Group);
10112 Args.ClaimAllArgs(options::OPT_w);
10113 Args.ClaimAllArgs(options::OPT_static_libgcc);
10114
10115 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10116 CmdArgs.push_back("-s");
10117
10118 CmdArgs.push_back("-o");
10119 CmdArgs.push_back(Output.getFilename());
10120
10121 if (UseStartfiles) {
10122 // If you want startfiles, it means you want the builtin crti and crtbegin,
10123 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010124 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10125 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010126 }
10127
10128 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10129 options::OPT_e, options::OPT_s, options::OPT_t,
10130 options::OPT_Z_Flag, options::OPT_r});
10131
Douglas Katzman674a3122015-11-18 16:24:46 +000010132 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010133
10134 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10135
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010136 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010137 if (C.getDriver().CCCIsCXX())
10138 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010139 if (T.getOS() == llvm::Triple::RTEMS) {
10140 CmdArgs.push_back("--start-group");
10141 CmdArgs.push_back("-lc");
10142 // You must provide your own "-L" option to enable finding these.
10143 CmdArgs.push_back("-lrtemscpu");
10144 CmdArgs.push_back("-lrtemsbsp");
10145 CmdArgs.push_back("--end-group");
10146 } else {
10147 CmdArgs.push_back("-lc");
10148 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010149 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010150 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010151 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010152 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10153 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010154 }
10155
10156 std::string Exec =
10157 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10158 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10159 CmdArgs, Inputs));
10160}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010161
10162void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10163 const InputInfo &Output,
10164 const InputInfoList &Inputs,
10165 const ArgList &Args,
10166 const char *LinkingOutput) const {
10167 claimNoWarnArgs(Args);
10168 ArgStringList CmdArgs;
10169
10170 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10171
10172 CmdArgs.push_back("-o");
10173 CmdArgs.push_back(Output.getFilename());
10174
10175 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10176 const InputInfo &Input = Inputs[0];
10177 assert(Input.isFilename() && "Invalid input.");
10178 CmdArgs.push_back(Input.getFilename());
10179
10180 const char *Exec =
10181 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10182 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10183}
10184
10185static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10186 ArgStringList &CmdArgs) {
10187 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10188 false) ||
10189 Args.hasArg(options::OPT_fprofile_generate) ||
10190 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10191 Args.hasArg(options::OPT_fcreate_profile) ||
10192 Args.hasArg(options::OPT_coverage)))
10193 return;
10194
10195 assert(TC.getTriple().isPS4CPU() &&
10196 "Profiling libraries are only implemented for the PS4 CPU");
10197 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10198}
10199
10200static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10201 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10202 if (SanArgs.needsUbsanRt()) {
10203 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10204 }
10205 if (SanArgs.needsAsanRt()) {
10206 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10207 }
10208}
10209
10210static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10211 const JobAction &JA, const InputInfo &Output,
10212 const InputInfoList &Inputs,
10213 const ArgList &Args,
10214 const char *LinkingOutput) {
10215 const toolchains::FreeBSD &ToolChain =
10216 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10217 const Driver &D = ToolChain.getDriver();
10218 ArgStringList CmdArgs;
10219
10220 // Silence warning for "clang -g foo.o -o foo"
10221 Args.ClaimAllArgs(options::OPT_g_Group);
10222 // and "clang -emit-llvm foo.o -o foo"
10223 Args.ClaimAllArgs(options::OPT_emit_llvm);
10224 // and for "clang -w foo.o -o foo". Other warning options are already
10225 // handled somewhere else.
10226 Args.ClaimAllArgs(options::OPT_w);
10227
10228 if (!D.SysRoot.empty())
10229 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10230
10231 if (Args.hasArg(options::OPT_pie))
10232 CmdArgs.push_back("-pie");
10233
10234 if (Args.hasArg(options::OPT_rdynamic))
10235 CmdArgs.push_back("-export-dynamic");
10236 if (Args.hasArg(options::OPT_shared))
10237 CmdArgs.push_back("--oformat=so");
10238
10239 if (Output.isFilename()) {
10240 CmdArgs.push_back("-o");
10241 CmdArgs.push_back(Output.getFilename());
10242 } else {
10243 assert(Output.isNothing() && "Invalid output.");
10244 }
10245
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010246 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10247
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010248 Args.AddAllArgs(CmdArgs, options::OPT_L);
10249 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10250 Args.AddAllArgs(CmdArgs, options::OPT_e);
10251 Args.AddAllArgs(CmdArgs, options::OPT_s);
10252 Args.AddAllArgs(CmdArgs, options::OPT_t);
10253 Args.AddAllArgs(CmdArgs, options::OPT_r);
10254
10255 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10256 CmdArgs.push_back("--no-demangle");
10257
10258 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10259
10260 if (Args.hasArg(options::OPT_pthread)) {
10261 CmdArgs.push_back("-lpthread");
10262 }
10263
10264 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010265
10266 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10267
10268 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10269}
10270
10271static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10272 const JobAction &JA, const InputInfo &Output,
10273 const InputInfoList &Inputs,
10274 const ArgList &Args,
10275 const char *LinkingOutput) {
10276 const toolchains::FreeBSD &ToolChain =
10277 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10278 const Driver &D = ToolChain.getDriver();
10279 ArgStringList CmdArgs;
10280
10281 // Silence warning for "clang -g foo.o -o foo"
10282 Args.ClaimAllArgs(options::OPT_g_Group);
10283 // and "clang -emit-llvm foo.o -o foo"
10284 Args.ClaimAllArgs(options::OPT_emit_llvm);
10285 // and for "clang -w foo.o -o foo". Other warning options are already
10286 // handled somewhere else.
10287 Args.ClaimAllArgs(options::OPT_w);
10288
10289 if (!D.SysRoot.empty())
10290 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10291
10292 if (Args.hasArg(options::OPT_pie))
10293 CmdArgs.push_back("-pie");
10294
10295 if (Args.hasArg(options::OPT_static)) {
10296 CmdArgs.push_back("-Bstatic");
10297 } else {
10298 if (Args.hasArg(options::OPT_rdynamic))
10299 CmdArgs.push_back("-export-dynamic");
10300 CmdArgs.push_back("--eh-frame-hdr");
10301 if (Args.hasArg(options::OPT_shared)) {
10302 CmdArgs.push_back("-Bshareable");
10303 } else {
10304 CmdArgs.push_back("-dynamic-linker");
10305 CmdArgs.push_back("/libexec/ld-elf.so.1");
10306 }
10307 CmdArgs.push_back("--enable-new-dtags");
10308 }
10309
10310 if (Output.isFilename()) {
10311 CmdArgs.push_back("-o");
10312 CmdArgs.push_back(Output.getFilename());
10313 } else {
10314 assert(Output.isNothing() && "Invalid output.");
10315 }
10316
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010317 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10318
Douglas Katzman78b37b02015-11-17 20:28:07 +000010319 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010320 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010321 if (!Args.hasArg(options::OPT_shared)) {
10322 if (Args.hasArg(options::OPT_pg))
10323 crt1 = "gcrt1.o";
10324 else if (Args.hasArg(options::OPT_pie))
10325 crt1 = "Scrt1.o";
10326 else
10327 crt1 = "crt1.o";
10328 }
10329 if (crt1)
10330 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10331
10332 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10333
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010334 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010335 if (Args.hasArg(options::OPT_static))
10336 crtbegin = "crtbeginT.o";
10337 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10338 crtbegin = "crtbeginS.o";
10339 else
10340 crtbegin = "crtbegin.o";
10341
10342 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10343 }
10344
10345 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010346 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010347 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10348 Args.AddAllArgs(CmdArgs, options::OPT_e);
10349 Args.AddAllArgs(CmdArgs, options::OPT_s);
10350 Args.AddAllArgs(CmdArgs, options::OPT_t);
10351 Args.AddAllArgs(CmdArgs, options::OPT_r);
10352
10353 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10354 CmdArgs.push_back("--no-demangle");
10355
10356 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10357
Douglas Katzman78b37b02015-11-17 20:28:07 +000010358 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010359 // For PS4, we always want to pass libm, libstdc++ and libkernel
10360 // libraries for both C and C++ compilations.
10361 CmdArgs.push_back("-lkernel");
10362 if (D.CCCIsCXX()) {
10363 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10364 if (Args.hasArg(options::OPT_pg))
10365 CmdArgs.push_back("-lm_p");
10366 else
10367 CmdArgs.push_back("-lm");
10368 }
10369 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10370 // the default system libraries. Just mimic this for now.
10371 if (Args.hasArg(options::OPT_pg))
10372 CmdArgs.push_back("-lgcc_p");
10373 else
10374 CmdArgs.push_back("-lcompiler_rt");
10375 if (Args.hasArg(options::OPT_static)) {
10376 CmdArgs.push_back("-lstdc++");
10377 } else if (Args.hasArg(options::OPT_pg)) {
10378 CmdArgs.push_back("-lgcc_eh_p");
10379 } else {
10380 CmdArgs.push_back("--as-needed");
10381 CmdArgs.push_back("-lstdc++");
10382 CmdArgs.push_back("--no-as-needed");
10383 }
10384
10385 if (Args.hasArg(options::OPT_pthread)) {
10386 if (Args.hasArg(options::OPT_pg))
10387 CmdArgs.push_back("-lpthread_p");
10388 else
10389 CmdArgs.push_back("-lpthread");
10390 }
10391
10392 if (Args.hasArg(options::OPT_pg)) {
10393 if (Args.hasArg(options::OPT_shared))
10394 CmdArgs.push_back("-lc");
10395 else {
10396 if (Args.hasArg(options::OPT_static)) {
10397 CmdArgs.push_back("--start-group");
10398 CmdArgs.push_back("-lc_p");
10399 CmdArgs.push_back("-lpthread_p");
10400 CmdArgs.push_back("--end-group");
10401 } else {
10402 CmdArgs.push_back("-lc_p");
10403 }
10404 }
10405 CmdArgs.push_back("-lgcc_p");
10406 } else {
10407 if (Args.hasArg(options::OPT_static)) {
10408 CmdArgs.push_back("--start-group");
10409 CmdArgs.push_back("-lc");
10410 CmdArgs.push_back("-lpthread");
10411 CmdArgs.push_back("--end-group");
10412 } else {
10413 CmdArgs.push_back("-lc");
10414 }
10415 CmdArgs.push_back("-lcompiler_rt");
10416 }
10417
10418 if (Args.hasArg(options::OPT_static)) {
10419 CmdArgs.push_back("-lstdc++");
10420 } else if (Args.hasArg(options::OPT_pg)) {
10421 CmdArgs.push_back("-lgcc_eh_p");
10422 } else {
10423 CmdArgs.push_back("--as-needed");
10424 CmdArgs.push_back("-lstdc++");
10425 CmdArgs.push_back("--no-as-needed");
10426 }
10427 }
10428
Douglas Katzman78b37b02015-11-17 20:28:07 +000010429 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010430 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10431 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10432 else
10433 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10434 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10435 }
10436
10437 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010438
10439 const char *Exec =
10440#ifdef LLVM_ON_WIN32
10441 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10442#else
10443 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10444#endif
10445
10446 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10447}
10448
10449void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10450 const InputInfo &Output,
10451 const InputInfoList &Inputs,
10452 const ArgList &Args,
10453 const char *LinkingOutput) const {
10454 const toolchains::FreeBSD &ToolChain =
10455 static_cast<const toolchains::FreeBSD &>(getToolChain());
10456 const Driver &D = ToolChain.getDriver();
10457 bool PS4Linker;
10458 StringRef LinkerOptName;
10459 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10460 LinkerOptName = A->getValue();
10461 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10462 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10463 }
10464
10465 if (LinkerOptName == "gold")
10466 PS4Linker = false;
10467 else if (LinkerOptName == "ps4")
10468 PS4Linker = true;
10469 else
10470 PS4Linker = !Args.hasArg(options::OPT_shared);
10471
10472 if (PS4Linker)
10473 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10474 else
10475 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10476}