blob: e9ccc057ba90251ddf9dbd642460d9df657434b4 [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
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000389 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000390 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000391 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
393 RenderedImplicitInclude = true;
394
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000395 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000396 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000397
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000400 SmallString<128> P(A->getValue());
401 // We want the files to have a name like foo.h.pch. Add a dummy extension
402 // so that replace_extension does the right thing.
403 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000405 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000406 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000408 }
409
Douglas Gregor111af7d2009-04-18 00:34:01 +0000410 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000411 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000413 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000414 }
415
Douglas Gregor111af7d2009-04-18 00:34:01 +0000416 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000417 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000419 FoundPCH = UsePCH;
420 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000421 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000422 }
423
424 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000425 if (IsFirstImplicitInclude) {
426 A->claim();
427 if (UsePCH)
428 CmdArgs.push_back("-include-pch");
429 else
430 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000431 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000432 continue;
433 } else {
434 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000435 D.Diag(diag::warn_drv_pch_not_first_include) << P
436 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000438 }
439 }
440
441 // Not translated, render as usual.
442 A->claim();
443 A->render(Args, CmdArgs);
444 }
445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000446 Args.AddAllArgs(CmdArgs,
447 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
448 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000450 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000451
452 // FIXME: There is a very unfortunate problem here, some troubled
453 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
454 // really support that we would have to parse and then translate
455 // those options. :(
456 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
457 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000458
459 // -I- is a deprecated GCC feature, reject it.
460 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000462
463 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
464 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000465 StringRef sysroot = C.getSysRoot();
466 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000467 if (!Args.hasArg(options::OPT_isysroot)) {
468 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000470 }
471 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000472
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000473 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000474 // FIXME: We should probably sink the logic for handling these from the
475 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000476 // CPATH - included following the user specified includes (but prior to
477 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000478 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000479 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000480 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000481 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000482 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000483 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000484 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000485 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000486 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000487
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 // Optional AuxToolChain indicates that we need to include headers
489 // for more than one target. If that's the case, add include paths
490 // from AuxToolChain right after include paths of the same kind for
491 // the current target.
492
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000493 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000494 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000495 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000496 if (AuxToolChain)
497 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
498 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000499
500 // Add system include arguments.
501 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000502 if (AuxToolChain)
503 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
504
505 // Add CUDA include arguments, if needed.
506 if (types::isCuda(Inputs[0].getType()))
507 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000508}
509
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000510// FIXME: Move to target hook.
511static bool isSignedCharDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return true;
515
Tim Northover9bb857a2013-01-31 12:13:10 +0000516 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000517 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000519 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000522 if (Triple.isOSDarwin() || Triple.isOSWindows())
523 return true;
524 return false;
525
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000526 case llvm::Triple::ppc:
527 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000528 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 return true;
530 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000531
David Majnemerdcecd932015-05-23 19:23:55 +0000532 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000533 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000534 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000535 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000536 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000537 }
538}
539
Robert Lytton0e076492013-08-13 09:43:10 +0000540static bool isNoCommonDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return false;
544
545 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000546 case llvm::Triple::wasm32:
547 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000548 return true;
549 }
550}
551
Renato Goline17c5802015-07-27 23:44:42 +0000552// ARM tools start.
553
554// Get SubArch (vN).
555static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
556 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000557 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000558}
559
560// True if M-profile.
561static bool isARMMProfile(const llvm::Triple &Triple) {
562 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000564 return Profile == llvm::ARM::PK_M;
565}
566
567// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000568static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
569 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000570 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
571 CPU = A->getValue();
572 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
573 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000574 if (!FromAs)
575 return;
576
577 for (const Arg *A :
578 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
579 StringRef Value = A->getValue();
580 if (Value.startswith("-mcpu="))
581 CPU = Value.substr(6);
582 if (Value.startswith("-march="))
583 Arch = Value.substr(7);
584 }
Renato Goline17c5802015-07-27 23:44:42 +0000585}
586
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000587// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000588// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000589static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000590 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000591 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000592 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
593 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000599 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000601 unsigned FPUID = llvm::ARM::parseFPU(FPU);
602 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Bradley Smithbbf5a002015-11-18 16:33:48 +0000606// Decode ARM features from string like +[no]featureA+[no]featureB+...
607static bool DecodeARMFeatures(const Driver &D, StringRef text,
608 std::vector<const char *> &Features) {
609 SmallVector<StringRef, 8> Split;
610 text.split(Split, StringRef("+"), -1, false);
611
612 for (StringRef Feature : Split) {
613 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
614 if (FeatureName)
615 Features.push_back(FeatureName);
616 else
617 return false;
618 }
619 return true;
620}
621
Renato Golin7c542b42015-07-27 23:44:45 +0000622// Check if -march is valid by checking if it can be canonicalised and parsed.
623// getARMArch is used here instead of just checking the -march value in order
624// to handle -march=native correctly.
625static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000626 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000628 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000629 std::pair<StringRef, StringRef> Split = ArchName.split("+");
630
Renato Goline17c5802015-07-27 23:44:42 +0000631 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000632 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
633 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000634 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000635}
636
Renato Golin7c542b42015-07-27 23:44:45 +0000637// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
638static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
639 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000640 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000641 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000642 std::pair<StringRef, StringRef> Split = CPUName.split("+");
643
Renato Goline17c5802015-07-27 23:44:42 +0000644 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000645 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
646 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000648}
649
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000650static bool useAAPCSForMachO(const llvm::Triple &T) {
651 // The backend is hardwired to assume AAPCS for M-class processors, ensure
652 // the frontend matches that.
653 return T.getEnvironment() == llvm::Triple::EABI ||
654 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
655}
656
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000657// Select the float ABI as determined by -msoft-float, -mhard-float, and
658// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000659arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
660 const Driver &D = TC.getDriver();
661 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 auto SubArch = getARMSubArchVersionNumber(Triple);
663 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (Arg *A =
665 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
666 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000667 if (A->getOption().matches(options::OPT_msoft_float)) {
668 ABI = FloatABI::Soft;
669 } else if (A->getOption().matches(options::OPT_mhard_float)) {
670 ABI = FloatABI::Hard;
671 } else {
672 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
673 .Case("soft", FloatABI::Soft)
674 .Case("softfp", FloatABI::SoftFP)
675 .Case("hard", FloatABI::Hard)
676 .Default(FloatABI::Invalid);
677 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 }
681 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000682
683 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
684 // "apcs-gnu".
685 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000687 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
688 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691
692 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000694 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000695 case llvm::Triple::Darwin:
696 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000697 case llvm::Triple::IOS:
698 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000700 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 break;
702 }
Tim Northover756447a2015-10-30 16:30:36 +0000703 case llvm::Triple::WatchOS:
704 ABI = FloatABI::Hard;
705 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000706
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000707 // FIXME: this is invalid for WindowsCE
708 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000710 break;
711
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000712 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000713 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000714 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000716 break;
717 default:
718 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000720 break;
721 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000722 break;
723
Daniel Dunbar78485922009-09-10 23:00:09 +0000724 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000726 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 case llvm::Triple::EABIHF:
728 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000729 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::EABI:
732 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000733 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000734 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 case llvm::Triple::Android:
736 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000737 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000738 default:
739 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000740 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000741 if (Triple.getOS() != llvm::Triple::UnknownOS ||
742 !Triple.isOSBinFormatMachO())
743 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000744 break;
745 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 }
747 }
748
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000749 assert(ABI != FloatABI::Invalid && "must select an ABI");
750 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000751}
752
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000753static void getARMTargetFeatures(const ToolChain &TC,
754 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000756 std::vector<const char *> &Features,
757 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000758 const Driver &D = TC.getDriver();
759
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000760 bool KernelOrKext =
761 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000762 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000763 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
764 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
765
Nico Weber6e0ebae2015-04-29 21:16:40 +0000766 if (!ForAS) {
767 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
768 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
769 // stripped out by the ARM target. We should probably pass this a new
770 // -target-option, which is handled by the -cc1/-cc1as invocation.
771 //
772 // FIXME2: For consistency, it would be ideal if we set up the target
773 // machine state the same when using the frontend or the assembler. We don't
774 // currently do that for the assembler, we pass the options directly to the
775 // backend and never even instantiate the frontend TargetInfo. If we did,
776 // and used its handleTargetFeatures hook, then we could ensure the
777 // assembler and the frontend behave the same.
778
779 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000781 Features.push_back("+soft-float");
782
783 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000785 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000786 } else {
787 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
788 // to the assembler correctly.
789 for (const Arg *A :
790 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
791 StringRef Value = A->getValue();
792 if (Value.startswith("-mfpu=")) {
793 WaFPU = A;
794 } else if (Value.startswith("-mcpu=")) {
795 WaCPU = A;
796 } else if (Value.startswith("-mhwdiv=")) {
797 WaHDiv = A;
798 } else if (Value.startswith("-march=")) {
799 WaArch = A;
800 }
801 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000802 }
803
Renato Golin7c542b42015-07-27 23:44:45 +0000804 // Check -march. ClangAs gives preference to -Wa,-march=.
805 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000806 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000807 if (WaArch) {
808 if (ArchArg)
809 D.Diag(clang::diag::warn_drv_unused_argument)
810 << ArchArg->getAsString(Args);
811 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000812 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000813 // FIXME: Set Arch.
814 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
815 } else if (ArchArg) {
816 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
819
Renato Golin7c542b42015-07-27 23:44:45 +0000820 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
821 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000822 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000823 if (WaCPU) {
824 if (CPUArg)
825 D.Diag(clang::diag::warn_drv_unused_argument)
826 << CPUArg->getAsString(Args);
827 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000828 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 } else if (CPUArg) {
830 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000831 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000832 }
John Brawna95c1a82015-05-08 12:52:18 +0000833
Renato Golin23459c62015-07-30 16:40:17 +0000834 // Add CPU features for generic CPUs
835 if (CPUName == "native") {
836 llvm::StringMap<bool> HostFeatures;
837 if (llvm::sys::getHostCPUFeatures(HostFeatures))
838 for (auto &F : HostFeatures)
839 Features.push_back(
840 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
841 }
842
843 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
844 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
845 if (WaFPU) {
846 if (FPUArg)
847 D.Diag(clang::diag::warn_drv_unused_argument)
848 << FPUArg->getAsString(Args);
849 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
850 Features);
851 } else if (FPUArg) {
852 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
853 }
854
855 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
856 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
857 if (WaHDiv) {
858 if (HDivArg)
859 D.Diag(clang::diag::warn_drv_unused_argument)
860 << HDivArg->getAsString(Args);
861 getARMHWDivFeatures(D, WaHDiv, Args,
862 StringRef(WaHDiv->getValue()).substr(8), Features);
863 } else if (HDivArg)
864 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
865
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000866 // Setting -msoft-float effectively disables NEON because of the GCC
867 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000868 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000869 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000870 // Also need to explicitly disable features which imply NEON.
871 Features.push_back("-crypto");
872 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000873
Eric Christopher269c2a22015-04-04 03:34:43 +0000874 // En/disable crc code generation.
875 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000876 if (A->getOption().matches(options::OPT_mcrc))
877 Features.push_back("+crc");
878 else
879 Features.push_back("-crc");
880 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000881
882 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
883 Features.insert(Features.begin(), "+v8.1a");
884 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000885
Akira Hatanakac2694822015-07-07 08:28:42 +0000886 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
887 // neither options are specified, see if we are compiling for kernel/kext and
888 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000889 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
890 options::OPT_mno_long_calls)) {
891 if (A->getOption().matches(options::OPT_mlong_calls))
892 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000893 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
894 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000895 Features.push_back("+long-calls");
896 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000897
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000898 // Kernel code has more strict alignment requirements.
899 if (KernelOrKext)
900 Features.push_back("+strict-align");
901 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
902 options::OPT_munaligned_access)) {
903 if (A->getOption().matches(options::OPT_munaligned_access)) {
904 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
905 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
906 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
907 } else
908 Features.push_back("+strict-align");
909 } else {
910 // Assume pre-ARMv6 doesn't support unaligned accesses.
911 //
912 // ARMv6 may or may not support unaligned accesses depending on the
913 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
914 // Darwin and NetBSD targets support unaligned accesses, and others don't.
915 //
916 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
917 // which raises an alignment fault on unaligned accesses. Linux
918 // defaults this bit to 0 and handles it as a system-wide (not
919 // per-process) setting. It is therefore safe to assume that ARMv7+
920 // Linux targets support unaligned accesses. The same goes for NaCl.
921 //
922 // The above behavior is consistent with GCC.
923 int VersionNum = getARMSubArchVersionNumber(Triple);
924 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000925 if (VersionNum < 6 ||
926 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000927 Features.push_back("+strict-align");
928 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
929 if (VersionNum < 7)
930 Features.push_back("+strict-align");
931 } else
932 Features.push_back("+strict-align");
933 }
934
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000935 // llvm does not support reserving registers in general. There is support
936 // for reserving r9 on ARM though (defined as a platform-specific register
937 // in ARM EABI).
938 if (Args.hasArg(options::OPT_ffixed_r9))
939 Features.push_back("+reserve-r9");
940
Dimitry Andric08107392016-01-06 07:42:18 +0000941 // The kext linker doesn't know how to deal with movw/movt.
942 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000943 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000944}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000946void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
947 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000948 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000950 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000951 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000952 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000953 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000954 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000955 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000957 } else if (Triple.isWatchOS()) {
958 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000959 } else {
960 ABIName = "apcs-gnu";
961 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000962 } else if (Triple.isOSWindows()) {
963 // FIXME: this is invalid for WindowsCE
964 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 } else {
966 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000967 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000968 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000970 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 ABIName = "aapcs-linux";
972 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000973 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 case llvm::Triple::EABI:
975 ABIName = "aapcs";
976 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000977 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000978 if (Triple.getOS() == llvm::Triple::NetBSD)
979 ABIName = "apcs-gnu";
980 else
981 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000982 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000983 }
984 }
985 CmdArgs.push_back("-target-abi");
986 CmdArgs.push_back(ABIName);
987
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000988 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000989 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000990 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000992 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000993 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000996 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001000 } else {
1001 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001002 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001003 CmdArgs.push_back("-mfloat-abi");
1004 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001005 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-arm-global-merge=false");
1013 else
1014 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001015 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001016
Bob Wilson9c8af452013-04-11 18:53:25 +00001017 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001019 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001020}
Renato Goline17c5802015-07-27 23:44:42 +00001021// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001022
Tim Northover573cbee2014-05-24 12:52:07 +00001023/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1024/// targeting.
1025static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001026 Arg *A;
1027 std::string CPU;
1028 // If we have -mtune or -mcpu, use that.
1029 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001030 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001031 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001032 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001033 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 }
1035
Kevin Qin110db6f2014-07-18 07:03:22 +00001036 // Handle CPU name is 'native'.
1037 if (CPU == "native")
1038 return llvm::sys::getHostCPUName();
1039 else if (CPU.size())
1040 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001041
James Molloy9b1586b2014-04-17 12:51:17 +00001042 // Make sure we pick "cyclone" if -arch is used.
1043 // FIXME: Should this be picked by checking the target triple instead?
1044 if (Args.getLastArg(options::OPT_arch))
1045 return "cyclone";
1046
1047 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001048}
1049
Tim Northover573cbee2014-05-24 12:52:07 +00001050void Clang::AddAArch64TargetArgs(const ArgList &Args,
1051 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001052 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1053 llvm::Triple Triple(TripleStr);
1054
1055 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1056 Args.hasArg(options::OPT_mkernel) ||
1057 Args.hasArg(options::OPT_fapple_kext))
1058 CmdArgs.push_back("-disable-red-zone");
1059
1060 if (!Args.hasFlag(options::OPT_mimplicit_float,
1061 options::OPT_mno_implicit_float, true))
1062 CmdArgs.push_back("-no-implicit-float");
1063
Craig Topper92fc2df2014-05-17 16:56:41 +00001064 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1066 ABIName = A->getValue();
1067 else if (Triple.isOSDarwin())
1068 ABIName = "darwinpcs";
1069 else
1070 ABIName = "aapcs";
1071
1072 CmdArgs.push_back("-target-abi");
1073 CmdArgs.push_back(ABIName);
1074
Bradley Smith9ff64332014-10-13 10:16:06 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1076 options::OPT_mno_fix_cortex_a53_835769)) {
1077 CmdArgs.push_back("-backend-option");
1078 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1079 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1080 else
1081 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001082 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001083 // Enabled A53 errata (835769) workaround by default on android
1084 CmdArgs.push_back("-backend-option");
1085 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001086 }
1087
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1090 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001091 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001092 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001093 CmdArgs.push_back("-aarch64-global-merge=false");
1094 else
1095 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001096 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001097}
1098
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001099// Get CPU and ABI names. They are not independent
1100// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001101void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1102 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001103 const char *DefMips32CPU = "mips32r2";
1104 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001105
Daniel Sanders2bf13662014-07-10 14:40:57 +00001106 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1107 // default for mips64(el)?-img-linux-gnu.
1108 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1109 Triple.getEnvironment() == llvm::Triple::GNU) {
1110 DefMips32CPU = "mips32r6";
1111 DefMips64CPU = "mips64r6";
1112 }
Renato Golin7c542b42015-07-27 23:44:45 +00001113
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001114 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001115 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001116 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001117
Brad Smithba26f582015-01-06 02:53:17 +00001118 // MIPS3 is the default for mips64*-unknown-openbsd.
1119 if (Triple.getOS() == llvm::Triple::OpenBSD)
1120 DefMips64CPU = "mips3";
1121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001122 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001123 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001125 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001126 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001127 // Convert a GNU style Mips ABI name to the name
1128 // accepted by LLVM Mips backend.
1129 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001130 .Case("32", "o32")
1131 .Case("64", "n64")
1132 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001133 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001134
1135 // Setup default CPU and ABI names.
1136 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001137 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001138 default:
1139 llvm_unreachable("Unexpected triple arch name");
1140 case llvm::Triple::mips:
1141 case llvm::Triple::mipsel:
1142 CPUName = DefMips32CPU;
1143 break;
1144 case llvm::Triple::mips64:
1145 case llvm::Triple::mips64el:
1146 CPUName = DefMips64CPU;
1147 break;
1148 }
1149 }
1150
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001151 if (ABIName.empty()) {
1152 // Deduce ABI name from the target triple.
1153 if (Triple.getArch() == llvm::Triple::mips ||
1154 Triple.getArch() == llvm::Triple::mipsel)
1155 ABIName = "o32";
1156 else
1157 ABIName = "n64";
1158 }
1159
1160 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001161 // Deduce CPU name from ABI name.
1162 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001163 .Cases("o32", "eabi", DefMips32CPU)
1164 .Cases("n32", "n64", DefMips64CPU)
1165 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001166 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001167
1168 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001169}
1170
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001171std::string mips::getMipsABILibSuffix(const ArgList &Args,
1172 const llvm::Triple &Triple) {
1173 StringRef CPUName, ABIName;
1174 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1175 return llvm::StringSwitch<std::string>(ABIName)
1176 .Case("o32", "")
1177 .Case("n32", "32")
1178 .Case("n64", "64");
1179}
1180
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001181// Convert ABI name to the GNU tools acceptable variant.
1182static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1183 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("o32", "32")
1185 .Case("n64", "64")
1186 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001187}
1188
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001189// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1190// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001191static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1192 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A =
1194 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1195 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001197 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001201 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1202 .Case("soft", mips::FloatABI::Soft)
1203 .Case("hard", mips::FloatABI::Hard)
1204 .Default(mips::FloatABI::Invalid);
1205 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001207 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001208 }
1209 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001210 }
1211
1212 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001213 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001214 // Assume "hard", because it's a default value used by gcc.
1215 // When we start to recognize specific target MIPS processors,
1216 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001218 }
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1221 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001222}
1223
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001225 std::vector<const char *> &Features,
1226 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001227 StringRef FeatureName) {
1228 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001229 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001230 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001231 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001232 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001233 }
1234}
1235
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1237 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001238 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 StringRef CPUName;
1240 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001241 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001242 ABIName = getGnuCompatibleMipsABIName(ABIName);
1243
Daniel Sandersfeb61302014-08-08 15:47:17 +00001244 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1245 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001246
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001247 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1248 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001249 // FIXME: Note, this is a hack. We need to pass the selected float
1250 // mode to the MipsTargetInfoBase to define appropriate macros there.
1251 // Now it is the only method.
1252 Features.push_back("+soft-float");
1253 }
1254
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001256 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001257 if (Val == "2008") {
1258 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1259 Features.push_back("+nan2008");
1260 else {
1261 Features.push_back("-nan2008");
1262 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1263 }
1264 } else if (Val == "legacy") {
1265 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1266 Features.push_back("-nan2008");
1267 else {
1268 Features.push_back("+nan2008");
1269 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1270 }
1271 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001272 D.Diag(diag::err_drv_unsupported_option_argument)
1273 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001274 }
1275
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001276 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1277 options::OPT_mdouble_float, "single-float");
1278 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1279 "mips16");
1280 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1281 options::OPT_mno_micromips, "micromips");
1282 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1283 "dsp");
1284 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1285 "dspr2");
1286 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1287 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001288
1289 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1290 // pass -mfpxx
1291 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1292 options::OPT_mfp64)) {
1293 if (A->getOption().matches(options::OPT_mfp32))
1294 Features.push_back(Args.MakeArgString("-fp64"));
1295 else if (A->getOption().matches(options::OPT_mfpxx)) {
1296 Features.push_back(Args.MakeArgString("+fpxx"));
1297 Features.push_back(Args.MakeArgString("+nooddspreg"));
1298 } else
1299 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001300 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001301 Features.push_back(Args.MakeArgString("+fpxx"));
1302 Features.push_back(Args.MakeArgString("+nooddspreg"));
1303 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304
Daniel Sanders28e5d392014-07-10 10:39:51 +00001305 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1306 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307}
1308
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001309void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001310 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001311 const Driver &D = getToolChain().getDriver();
1312 StringRef CPUName;
1313 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001314 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001315 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001316
1317 CmdArgs.push_back("-target-abi");
1318 CmdArgs.push_back(ABIName.data());
1319
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001320 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1321 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001322 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001323 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 CmdArgs.push_back("-mfloat-abi");
1325 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001326 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001327 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001328 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001329 CmdArgs.push_back("-mfloat-abi");
1330 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001331 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001332
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001333 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1334 if (A->getOption().matches(options::OPT_mxgot)) {
1335 CmdArgs.push_back("-mllvm");
1336 CmdArgs.push_back("-mxgot");
1337 }
1338 }
1339
Simon Atanasyanc580b322013-05-11 06:33:44 +00001340 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1341 options::OPT_mno_ldc1_sdc1)) {
1342 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1343 CmdArgs.push_back("-mllvm");
1344 CmdArgs.push_back("-mno-ldc1-sdc1");
1345 }
1346 }
1347
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001348 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1349 options::OPT_mno_check_zero_division)) {
1350 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1351 CmdArgs.push_back("-mllvm");
1352 CmdArgs.push_back("-mno-check-zero-division");
1353 }
1354 }
1355
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001356 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001357 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001358 CmdArgs.push_back("-mllvm");
1359 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1360 A->claim();
1361 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001362}
1363
Hal Finkel8eb59282012-06-11 22:35:19 +00001364/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1365static std::string getPPCTargetCPU(const ArgList &Args) {
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001367 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001368
1369 if (CPUName == "native") {
1370 std::string CPU = llvm::sys::getHostCPUName();
1371 if (!CPU.empty() && CPU != "generic")
1372 return CPU;
1373 else
1374 return "";
1375 }
1376
1377 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378 .Case("common", "generic")
1379 .Case("440", "440")
1380 .Case("440fp", "440")
1381 .Case("450", "450")
1382 .Case("601", "601")
1383 .Case("602", "602")
1384 .Case("603", "603")
1385 .Case("603e", "603e")
1386 .Case("603ev", "603ev")
1387 .Case("604", "604")
1388 .Case("604e", "604e")
1389 .Case("620", "620")
1390 .Case("630", "pwr3")
1391 .Case("G3", "g3")
1392 .Case("7400", "7400")
1393 .Case("G4", "g4")
1394 .Case("7450", "7450")
1395 .Case("G4+", "g4+")
1396 .Case("750", "750")
1397 .Case("970", "970")
1398 .Case("G5", "g5")
1399 .Case("a2", "a2")
1400 .Case("a2q", "a2q")
1401 .Case("e500mc", "e500mc")
1402 .Case("e5500", "e5500")
1403 .Case("power3", "pwr3")
1404 .Case("power4", "pwr4")
1405 .Case("power5", "pwr5")
1406 .Case("power5x", "pwr5x")
1407 .Case("power6", "pwr6")
1408 .Case("power6x", "pwr6x")
1409 .Case("power7", "pwr7")
1410 .Case("power8", "pwr8")
1411 .Case("pwr3", "pwr3")
1412 .Case("pwr4", "pwr4")
1413 .Case("pwr5", "pwr5")
1414 .Case("pwr5x", "pwr5x")
1415 .Case("pwr6", "pwr6")
1416 .Case("pwr6x", "pwr6x")
1417 .Case("pwr7", "pwr7")
1418 .Case("pwr8", "pwr8")
1419 .Case("powerpc", "ppc")
1420 .Case("powerpc64", "ppc64")
1421 .Case("powerpc64le", "ppc64le")
1422 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001423 }
1424
1425 return "";
1426}
1427
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001428static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1429 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001430 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001431 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001432
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001433 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1434 if (FloatABI == ppc::FloatABI::Soft &&
1435 !(Triple.getArch() == llvm::Triple::ppc64 ||
1436 Triple.getArch() == llvm::Triple::ppc64le))
1437 Features.push_back("+soft-float");
1438 else if (FloatABI == ppc::FloatABI::Soft &&
1439 (Triple.getArch() == llvm::Triple::ppc64 ||
1440 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001441 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001442 << "soft float is not supported for ppc64";
1443
Eric Christopher643bb6a2013-10-16 20:40:08 +00001444 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001445 AddTargetFeature(Args, Features, options::OPT_faltivec,
1446 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001447}
1448
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001449ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1450 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1451 if (Arg *A =
1452 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1453 options::OPT_mfloat_abi_EQ)) {
1454 if (A->getOption().matches(options::OPT_msoft_float))
1455 ABI = ppc::FloatABI::Soft;
1456 else if (A->getOption().matches(options::OPT_mhard_float))
1457 ABI = ppc::FloatABI::Hard;
1458 else {
1459 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1460 .Case("soft", ppc::FloatABI::Soft)
1461 .Case("hard", ppc::FloatABI::Hard)
1462 .Default(ppc::FloatABI::Invalid);
1463 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1464 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1465 ABI = ppc::FloatABI::Hard;
1466 }
1467 }
1468 }
1469
1470 // If unspecified, choose the default based on the platform.
1471 if (ABI == ppc::FloatABI::Invalid) {
1472 ABI = ppc::FloatABI::Hard;
1473 }
1474
1475 return ABI;
1476}
1477
Ulrich Weigand8afad612014-07-28 13:17:52 +00001478void Clang::AddPPCTargetArgs(const ArgList &Args,
1479 ArgStringList &CmdArgs) const {
1480 // Select the ABI to use.
1481 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001482 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001484 case llvm::Triple::ppc64: {
1485 // When targeting a processor that supports QPX, or if QPX is
1486 // specifically enabled, default to using the ABI that supports QPX (so
1487 // long as it is not specifically disabled).
1488 bool HasQPX = false;
1489 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1490 HasQPX = A->getValue() == StringRef("a2q");
1491 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1492 if (HasQPX) {
1493 ABIName = "elfv1-qpx";
1494 break;
1495 }
1496
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 ABIName = "elfv1";
1498 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001499 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001500 case llvm::Triple::ppc64le:
1501 ABIName = "elfv2";
1502 break;
1503 default:
1504 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001506
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001507 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1508 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1509 // the option if given as we don't have backend support for any targets
1510 // that don't use the altivec abi.
1511 if (StringRef(A->getValue()) != "altivec")
1512 ABIName = A->getValue();
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514 ppc::FloatABI FloatABI =
1515 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1516
1517 if (FloatABI == ppc::FloatABI::Soft) {
1518 // Floating point operations and argument passing are soft.
1519 CmdArgs.push_back("-msoft-float");
1520 CmdArgs.push_back("-mfloat-abi");
1521 CmdArgs.push_back("soft");
1522 } else {
1523 // Floating point operations and argument passing are hard.
1524 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1525 CmdArgs.push_back("-mfloat-abi");
1526 CmdArgs.push_back("hard");
1527 }
1528
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 if (ABIName) {
1530 CmdArgs.push_back("-target-abi");
1531 CmdArgs.push_back(ABIName);
1532 }
1533}
1534
1535bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1536 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1537 return A && (A->getValue() == StringRef(Value));
1538}
1539
Tom Stellard6674c702013-04-01 20:56:53 +00001540/// Get the (LLVM) name of the R600 gpu we are targeting.
1541static std::string getR600TargetGPU(const ArgList &Args) {
1542 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001543 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001544 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001545 .Cases("rv630", "rv635", "r600")
1546 .Cases("rv610", "rv620", "rs780", "rs880")
1547 .Case("rv740", "rv770")
1548 .Case("palm", "cedar")
1549 .Cases("sumo", "sumo2", "sumo")
1550 .Case("hemlock", "cypress")
1551 .Case("aruba", "cayman")
1552 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001553 }
1554 return "";
1555}
1556
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001557void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001560 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561
James Y Knightb2406522015-06-15 20:51:24 +00001562 bool SoftFloatABI = false;
1563 if (Arg *A =
1564 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001565 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001566 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 }
1568
James Y Knightb2406522015-06-15 20:51:24 +00001569 // Only the hard-float ABI on Sparc is standardized, and it is the
1570 // default. GCC also supports a nonstandard soft-float ABI mode, and
1571 // perhaps LLVM should implement that, too. However, since llvm
1572 // currently does not support Sparc soft-float, at all, display an
1573 // error if it's requested.
1574 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1576 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001577 }
1578}
1579
Richard Sandiford4652d892013-07-19 16:51:51 +00001580static const char *getSystemZTargetCPU(const ArgList &Args) {
1581 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1582 return A->getValue();
1583 return "z10";
1584}
1585
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001586static void getSystemZTargetFeatures(const ArgList &Args,
1587 std::vector<const char *> &Features) {
1588 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001589 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001590 if (A->getOption().matches(options::OPT_mhtm))
1591 Features.push_back("+transactional-execution");
1592 else
1593 Features.push_back("-transactional-execution");
1594 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001595 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001596 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 if (A->getOption().matches(options::OPT_mvx))
1598 Features.push_back("+vector");
1599 else
1600 Features.push_back("-vector");
1601 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001602}
1603
Chandler Carruth953fb082013-01-13 11:46:33 +00001604static const char *getX86TargetCPU(const ArgList &Args,
1605 const llvm::Triple &Triple) {
1606 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001607 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001608 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 return "core-avx2";
1610
Chandler Carruth953fb082013-01-13 11:46:33 +00001611 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001612 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001613
1614 // FIXME: Reject attempts to use -march=native unless the target matches
1615 // the host.
1616 //
1617 // FIXME: We should also incorporate the detected target features for use
1618 // with -native.
1619 std::string CPU = llvm::sys::getHostCPUName();
1620 if (!CPU.empty() && CPU != "generic")
1621 return Args.MakeArgString(CPU);
1622 }
1623
Reid Kleckner3123eff2015-06-30 16:32:04 +00001624 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1625 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1626 StringRef Arch = A->getValue();
1627 const char *CPU;
1628 if (Triple.getArch() == llvm::Triple::x86) {
1629 CPU = llvm::StringSwitch<const char *>(Arch)
1630 .Case("IA32", "i386")
1631 .Case("SSE", "pentium3")
1632 .Case("SSE2", "pentium4")
1633 .Case("AVX", "sandybridge")
1634 .Case("AVX2", "haswell")
1635 .Default(nullptr);
1636 } else {
1637 CPU = llvm::StringSwitch<const char *>(Arch)
1638 .Case("AVX", "sandybridge")
1639 .Case("AVX2", "haswell")
1640 .Default(nullptr);
1641 }
1642 if (CPU)
1643 return CPU;
1644 }
1645
Chandler Carruth953fb082013-01-13 11:46:33 +00001646 // Select the default CPU if none was given (or detection failed).
1647
1648 if (Triple.getArch() != llvm::Triple::x86_64 &&
1649 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001650 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001651
1652 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1653
1654 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 if (Triple.getArchName() == "x86_64h")
1657 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001658 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001659 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001660
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001661 // Set up default CPU name for PS4 compilers.
1662 if (Triple.isPS4CPU())
1663 return "btver2";
1664
Alexey Bataev286d1b92014-01-31 04:07:13 +00001665 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001666 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001668
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001669 // Everything else goes to x86-64 in 64-bit mode.
1670 if (Is64Bit)
1671 return "x86-64";
1672
1673 switch (Triple.getOS()) {
1674 case llvm::Triple::FreeBSD:
1675 case llvm::Triple::NetBSD:
1676 case llvm::Triple::OpenBSD:
1677 return "i486";
1678 case llvm::Triple::Haiku:
1679 return "i586";
1680 case llvm::Triple::Bitrig:
1681 return "i686";
1682 default:
1683 // Fallback to p4.
1684 return "pentium4";
1685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686}
1687
Dan Gohmanc2853072015-09-03 22:51:53 +00001688/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1689static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1690 // If we have -mcpu=, use that.
1691 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1692 StringRef CPU = A->getValue();
1693
1694#ifdef __wasm__
1695 // Handle "native" by examining the host. "native" isn't meaningful when
1696 // cross compiling, so only support this when the host is also WebAssembly.
1697 if (CPU == "native")
1698 return llvm::sys::getHostCPUName();
1699#endif
1700
1701 return CPU;
1702 }
1703
1704 return "generic";
1705}
1706
Renato Golin7c542b42015-07-27 23:44:45 +00001707static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1708 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001710 default:
1711 return "";
1712
Amara Emerson703da2e2013-10-31 09:32:33 +00001713 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001714 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001715 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001716
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001717 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001718 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001720 case llvm::Triple::thumbeb: {
1721 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001722 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001723 return arm::getARMTargetCPU(MCPU, MArch, T);
1724 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001725 case llvm::Triple::mips:
1726 case llvm::Triple::mipsel:
1727 case llvm::Triple::mips64:
1728 case llvm::Triple::mips64el: {
1729 StringRef CPUName;
1730 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001731 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001732 return CPUName;
1733 }
1734
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001735 case llvm::Triple::nvptx:
1736 case llvm::Triple::nvptx64:
1737 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1738 return A->getValue();
1739 return "";
1740
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001741 case llvm::Triple::ppc:
1742 case llvm::Triple::ppc64:
1743 case llvm::Triple::ppc64le: {
1744 std::string TargetCPUName = getPPCTargetCPU(Args);
1745 // LLVM may default to generating code for the native CPU,
1746 // but, like gcc, we default to a more generic option for
1747 // each architecture. (except on Darwin)
1748 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1749 if (T.getArch() == llvm::Triple::ppc64)
1750 TargetCPUName = "ppc64";
1751 else if (T.getArch() == llvm::Triple::ppc64le)
1752 TargetCPUName = "ppc64le";
1753 else
1754 TargetCPUName = "ppc";
1755 }
1756 return TargetCPUName;
1757 }
1758
1759 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001760 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001761 case llvm::Triple::sparcv9:
1762 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001763 return A->getValue();
1764 return "";
1765
1766 case llvm::Triple::x86:
1767 case llvm::Triple::x86_64:
1768 return getX86TargetCPU(Args, T);
1769
1770 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001771 return "hexagon" +
1772 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773
1774 case llvm::Triple::systemz:
1775 return getSystemZTargetCPU(Args);
1776
1777 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001778 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001779 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001780
1781 case llvm::Triple::wasm32:
1782 case llvm::Triple::wasm64:
1783 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 }
1785}
1786
Alp Tokerce365ca2013-12-02 12:43:03 +00001787static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001788 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001789 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1790 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1791 // forward.
1792 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 std::string Plugin =
1794 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001795 CmdArgs.push_back(Args.MakeArgString(Plugin));
1796
1797 // Try to pass driver level flags relevant to LTO code generation down to
1798 // the plugin.
1799
1800 // Handle flags for selecting CPU variants.
1801 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1802 if (!CPU.empty())
1803 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001804
James Molloyf97fdae2015-12-21 10:44:36 +00001805 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1806 StringRef OOpt;
1807 if (A->getOption().matches(options::OPT_O4) ||
1808 A->getOption().matches(options::OPT_Ofast))
1809 OOpt = "3";
1810 else if (A->getOption().matches(options::OPT_O))
1811 OOpt = A->getValue();
1812 else if (A->getOption().matches(options::OPT_O0))
1813 OOpt = "0";
1814 if (!OOpt.empty())
1815 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1816 }
1817
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001818 if (IsThinLTO)
1819 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001820
1821 // If an explicit debugger tuning argument appeared, pass it along.
1822 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1823 options::OPT_ggdbN_Group)) {
1824 if (A->getOption().matches(options::OPT_glldb))
1825 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1826 else if (A->getOption().matches(options::OPT_gsce))
1827 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1828 else
1829 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1830 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001831}
1832
Sanjay Patel2987c292015-06-11 14:53:41 +00001833/// This is a helper function for validating the optional refinement step
1834/// parameter in reciprocal argument strings. Return false if there is an error
1835/// parsing the refinement step. Otherwise, return true and set the Position
1836/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001837static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001838 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001839 const char RefinementStepToken = ':';
1840 Position = In.find(RefinementStepToken);
1841 if (Position != StringRef::npos) {
1842 StringRef Option = A.getOption().getName();
1843 StringRef RefStep = In.substr(Position + 1);
1844 // Allow exactly one numeric character for the additional refinement
1845 // step parameter. This is reasonable for all currently-supported
1846 // operations and architectures because we would expect that a larger value
1847 // of refinement steps would cause the estimate "optimization" to
1848 // under-perform the native operation. Also, if the estimate does not
1849 // converge quickly, it probably will not ever converge, so further
1850 // refinement steps will not produce a better answer.
1851 if (RefStep.size() != 1) {
1852 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1853 return false;
1854 }
1855 char RefStepChar = RefStep[0];
1856 if (RefStepChar < '0' || RefStepChar > '9') {
1857 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1858 return false;
1859 }
1860 }
1861 return true;
1862}
1863
1864/// The -mrecip flag requires processing of many optional parameters.
1865static void ParseMRecip(const Driver &D, const ArgList &Args,
1866 ArgStringList &OutStrings) {
1867 StringRef DisabledPrefixIn = "!";
1868 StringRef DisabledPrefixOut = "!";
1869 StringRef EnabledPrefixOut = "";
1870 StringRef Out = "-mrecip=";
1871
1872 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1873 if (!A)
1874 return;
1875
1876 unsigned NumOptions = A->getNumValues();
1877 if (NumOptions == 0) {
1878 // No option is the same as "all".
1879 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1880 return;
1881 }
1882
1883 // Pass through "all", "none", or "default" with an optional refinement step.
1884 if (NumOptions == 1) {
1885 StringRef Val = A->getValue(0);
1886 size_t RefStepLoc;
1887 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1888 return;
1889 StringRef ValBase = Val.slice(0, RefStepLoc);
1890 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1891 OutStrings.push_back(Args.MakeArgString(Out + Val));
1892 return;
1893 }
1894 }
1895
1896 // Each reciprocal type may be enabled or disabled individually.
1897 // Check each input value for validity, concatenate them all back together,
1898 // and pass through.
1899
1900 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 OptionStrings.insert(std::make_pair("divd", false));
1902 OptionStrings.insert(std::make_pair("divf", false));
1903 OptionStrings.insert(std::make_pair("vec-divd", false));
1904 OptionStrings.insert(std::make_pair("vec-divf", false));
1905 OptionStrings.insert(std::make_pair("sqrtd", false));
1906 OptionStrings.insert(std::make_pair("sqrtf", false));
1907 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1908 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001909
1910 for (unsigned i = 0; i != NumOptions; ++i) {
1911 StringRef Val = A->getValue(i);
1912
1913 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1914 // Ignore the disablement token for string matching.
1915 if (IsDisabled)
1916 Val = Val.substr(1);
1917
1918 size_t RefStep;
1919 if (!getRefinementStep(Val, D, *A, RefStep))
1920 return;
1921
1922 StringRef ValBase = Val.slice(0, RefStep);
1923 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1924 if (OptionIter == OptionStrings.end()) {
1925 // Try again specifying float suffix.
1926 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1927 if (OptionIter == OptionStrings.end()) {
1928 // The input name did not match any known option string.
1929 D.Diag(diag::err_drv_unknown_argument) << Val;
1930 return;
1931 }
1932 // The option was specified without a float or double suffix.
1933 // Make sure that the double entry was not already specified.
1934 // The float entry will be checked below.
1935 if (OptionStrings[ValBase.str() + 'd']) {
1936 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1937 return;
1938 }
1939 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001940
Sanjay Patel2987c292015-06-11 14:53:41 +00001941 if (OptionIter->second == true) {
1942 // Duplicate option specified.
1943 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1944 return;
1945 }
1946
1947 // Mark the matched option as found. Do not allow duplicate specifiers.
1948 OptionIter->second = true;
1949
1950 // If the precision was not specified, also mark the double entry as found.
1951 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1952 OptionStrings[ValBase.str() + 'd'] = true;
1953
1954 // Build the output string.
1955 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1956 Out = Args.MakeArgString(Out + Prefix + Val);
1957 if (i != NumOptions - 1)
1958 Out = Args.MakeArgString(Out + ",");
1959 }
1960
1961 OutStrings.push_back(Args.MakeArgString(Out));
1962}
1963
Eric Christopherc54920a2015-03-23 19:26:05 +00001964static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001965 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001966 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001967 // If -march=native, autodetect the feature list.
1968 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1969 if (StringRef(A->getValue()) == "native") {
1970 llvm::StringMap<bool> HostFeatures;
1971 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1972 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 Features.push_back(
1974 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001975 }
1976 }
1977
Jim Grosbach82eee262013-11-16 00:53:35 +00001978 if (Triple.getArchName() == "x86_64h") {
1979 // x86_64h implies quite a few of the more modern subtarget features
1980 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1981 Features.push_back("-rdrnd");
1982 Features.push_back("-aes");
1983 Features.push_back("-pclmul");
1984 Features.push_back("-rtm");
1985 Features.push_back("-hle");
1986 Features.push_back("-fsgsbase");
1987 }
1988
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001989 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001990 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001991 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001992 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001993 Features.push_back("+sse4.2");
1994 Features.push_back("+popcnt");
1995 } else
1996 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001997 }
1998
Eric Christopherc54920a2015-03-23 19:26:05 +00001999 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002000 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2001 StringRef Arch = A->getValue();
2002 bool ArchUsed = false;
2003 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002004 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002005 if (Arch == "AVX" || Arch == "AVX2") {
2006 ArchUsed = true;
2007 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2008 }
2009 }
2010 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002011 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002012 if (Arch == "IA32") {
2013 ArchUsed = true;
2014 } else if (Arch == "SSE" || Arch == "SSE2") {
2015 ArchUsed = true;
2016 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2017 }
2018 }
2019 if (!ArchUsed)
2020 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2021 }
2022
Jim Grosbach82eee262013-11-16 00:53:35 +00002023 // Now add any that the user explicitly requested on the command line,
2024 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002025 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002026}
2027
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002028void Clang::AddX86TargetArgs(const ArgList &Args,
2029 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002031 Args.hasArg(options::OPT_mkernel) ||
2032 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002033 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002034
Bob Wilson2616e2e2013-02-10 16:01:41 +00002035 // Default to avoid implicit floating-point for kernel/kext code, but allow
2036 // that to be overridden with -mno-soft-float.
2037 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2038 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002039 if (Arg *A = Args.getLastArg(
2040 options::OPT_msoft_float, options::OPT_mno_soft_float,
2041 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002042 const Option &O = A->getOption();
2043 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2044 O.matches(options::OPT_msoft_float));
2045 }
2046 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002047 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002048
2049 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2050 StringRef Value = A->getValue();
2051 if (Value == "intel" || Value == "att") {
2052 CmdArgs.push_back("-mllvm");
2053 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2054 } else {
2055 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2056 << A->getOption().getName() << Value;
2057 }
2058 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002059}
2060
Tony Linthicum76329bf2011-12-12 21:14:55 +00002061void Clang::AddHexagonTargetArgs(const ArgList &Args,
2062 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002063 CmdArgs.push_back("-mqdsp6-compat");
2064 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002065
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002066 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2067 std::string N = llvm::utostr(G.getValue());
2068 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002069 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002070 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002071 }
2072
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002073 if (!Args.hasArg(options::OPT_fno_short_enums))
2074 CmdArgs.push_back("-fshort-enums");
2075 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002076 CmdArgs.push_back("-mllvm");
2077 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002078 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002079 CmdArgs.push_back("-mllvm");
2080 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002081}
2082
Dan Gohmane3d71e12016-01-07 01:00:21 +00002083void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2084 ArgStringList &CmdArgs) const {
2085 // Default to "hidden" visibility.
2086 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2087 options::OPT_fvisibility_ms_compat)) {
2088 CmdArgs.push_back("-fvisibility");
2089 CmdArgs.push_back("hidden");
2090 }
2091}
2092
Kevin Qin110db6f2014-07-18 07:03:22 +00002093// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002094static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002095 std::vector<const char *> &Features) {
2096 SmallVector<StringRef, 8> Split;
2097 text.split(Split, StringRef("+"), -1, false);
2098
Benjamin Kramer72e64312015-09-24 14:48:49 +00002099 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002100 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002101 .Case("fp", "+fp-armv8")
2102 .Case("simd", "+neon")
2103 .Case("crc", "+crc")
2104 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002105 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002106 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002107 .Case("nofp", "-fp-armv8")
2108 .Case("nosimd", "-neon")
2109 .Case("nocrc", "-crc")
2110 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002111 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002112 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002113 .Default(nullptr);
2114 if (result)
2115 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002116 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002117 D.Diag(diag::err_drv_no_neon_modifier);
2118 else
2119 return false;
2120 }
2121 return true;
2122}
2123
2124// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2125// decode CPU and feature.
2126static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2127 std::vector<const char *> &Features) {
2128 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2129 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002130 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
MinSeong Kim50d9c152016-01-05 12:53:24 +00002131 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002132 Features.push_back("+neon");
2133 Features.push_back("+crc");
2134 Features.push_back("+crypto");
2135 } else if (CPU == "generic") {
2136 Features.push_back("+neon");
2137 } else {
2138 return false;
2139 }
2140
2141 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2142 return false;
2143
2144 return true;
2145}
2146
2147static bool
2148getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2149 const ArgList &Args,
2150 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002151 std::string MarchLowerCase = March.lower();
2152 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002153
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002154 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002155 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002156 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002157 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002158 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2159 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002160 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002161 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002162 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002163
2164 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2165 return false;
2166
2167 return true;
2168}
2169
2170static bool
2171getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2172 const ArgList &Args,
2173 std::vector<const char *> &Features) {
2174 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002175 std::string McpuLowerCase = Mcpu.lower();
2176 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002177 return false;
2178
2179 return true;
2180}
2181
2182static bool
2183getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2184 const ArgList &Args,
2185 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002186 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002187 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002188 if (MtuneLowerCase == "native")
2189 MtuneLowerCase = llvm::sys::getHostCPUName();
2190 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002191 Features.push_back("+zcm");
2192 Features.push_back("+zcz");
2193 }
2194 return true;
2195}
2196
2197static bool
2198getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2199 const ArgList &Args,
2200 std::vector<const char *> &Features) {
2201 StringRef CPU;
2202 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002203 std::string McpuLowerCase = Mcpu.lower();
2204 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002205 return false;
2206
2207 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2208}
2209
Justin Bognerf9052562015-11-13 23:07:31 +00002210static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002211 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002212 Arg *A;
2213 bool success = true;
2214 // Enable NEON by default.
2215 Features.push_back("+neon");
2216 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2217 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2218 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2219 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002220 else if (Args.hasArg(options::OPT_arch))
2221 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2222 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002223
2224 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2225 success =
2226 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2227 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2228 success =
2229 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002230 else if (Args.hasArg(options::OPT_arch))
2231 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2232 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002233
2234 if (!success)
2235 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002236
2237 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2238 Features.push_back("-fp-armv8");
2239 Features.push_back("-crypto");
2240 Features.push_back("-neon");
2241 }
Bradley Smith418c5932014-05-02 15:17:51 +00002242
2243 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002244 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002245 if (A->getOption().matches(options::OPT_mcrc))
2246 Features.push_back("+crc");
2247 else
2248 Features.push_back("-crc");
2249 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002250
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002251 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2252 options::OPT_munaligned_access))
2253 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2254 Features.push_back("+strict-align");
2255
Justin Bognerf9052562015-11-13 23:07:31 +00002256 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002257 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002258}
2259
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002260static void getHexagonTargetFeatures(const ArgList &Args,
2261 std::vector<const char *> &Features) {
2262 bool HasHVX = false, HasHVXD = false;
2263
Eric Christopher49062a52015-12-22 03:12:34 +00002264 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2265 // doing dependent option handling here rather than in initFeatureMap or a
2266 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002267 for (auto &A : Args) {
2268 auto &Opt = A->getOption();
2269 if (Opt.matches(options::OPT_mhexagon_hvx))
2270 HasHVX = true;
2271 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2272 HasHVXD = HasHVX = false;
2273 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2274 HasHVXD = HasHVX = true;
2275 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2276 HasHVXD = false;
2277 else
2278 continue;
2279 A->claim();
2280 }
2281
2282 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2283 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2284}
2285
Dan Gohmanc2853072015-09-03 22:51:53 +00002286static void getWebAssemblyTargetFeatures(const ArgList &Args,
2287 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002288 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002289}
2290
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002291static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002292 const ArgList &Args, ArgStringList &CmdArgs,
2293 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002294 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002295 std::vector<const char *> Features;
2296 switch (Triple.getArch()) {
2297 default:
2298 break;
2299 case llvm::Triple::mips:
2300 case llvm::Triple::mipsel:
2301 case llvm::Triple::mips64:
2302 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002303 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002304 break;
2305
2306 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002307 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002308 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002309 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002310 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002311 break;
2312
2313 case llvm::Triple::ppc:
2314 case llvm::Triple::ppc64:
2315 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002316 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002317 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002318 case llvm::Triple::systemz:
2319 getSystemZTargetFeatures(Args, Features);
2320 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002321 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002322 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002323 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002324 break;
2325 case llvm::Triple::x86:
2326 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002327 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002328 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002329 case llvm::Triple::hexagon:
2330 getHexagonTargetFeatures(Args, Features);
2331 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002332 case llvm::Triple::wasm32:
2333 case llvm::Triple::wasm64:
2334 getWebAssemblyTargetFeatures(Args, Features);
2335 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002336 }
Rafael Espindola43964802013-08-21 17:34:32 +00002337
2338 // Find the last of each feature.
2339 llvm::StringMap<unsigned> LastOpt;
2340 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2341 const char *Name = Features[I];
2342 assert(Name[0] == '-' || Name[0] == '+');
2343 LastOpt[Name + 1] = I;
2344 }
2345
2346 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2347 // If this feature was overridden, ignore it.
2348 const char *Name = Features[I];
2349 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2350 assert(LastI != LastOpt.end());
2351 unsigned Last = LastI->second;
2352 if (Last != I)
2353 continue;
2354
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002355 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002356 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002357 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002358}
2359
David Majnemerae394812014-12-09 00:12:30 +00002360static bool
2361shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2362 const llvm::Triple &Triple) {
2363 // We use the zero-cost exception tables for Objective-C if the non-fragile
2364 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2365 // later.
2366 if (runtime.isNonFragile())
2367 return true;
2368
2369 if (!Triple.isMacOSX())
2370 return false;
2371
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002372 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002373 (Triple.getArch() == llvm::Triple::x86_64 ||
2374 Triple.getArch() == llvm::Triple::arm));
2375}
2376
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002377/// Adds exception related arguments to the driver command arguments. There's a
2378/// master flag, -fexceptions and also language specific flags to enable/disable
2379/// C++ and Objective-C exceptions. This makes it possible to for example
2380/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002381static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002382 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002383 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002384 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002385 const Driver &D = TC.getDriver();
2386 const llvm::Triple &Triple = TC.getTriple();
2387
Chad Rosier4fab82c2012-03-26 22:04:46 +00002388 if (KernelOrKext) {
2389 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2390 // arguments now to avoid warnings about unused arguments.
2391 Args.ClaimAllArgs(options::OPT_fexceptions);
2392 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2393 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2394 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2395 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2396 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002397 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002398 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002399
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002400 // See if the user explicitly enabled exceptions.
2401 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2402 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002403
David Majnemerae394812014-12-09 00:12:30 +00002404 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2405 // is not necessarily sensible, but follows GCC.
2406 if (types::isObjC(InputType) &&
2407 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002408 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002409 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002410
David Majnemerae394812014-12-09 00:12:30 +00002411 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002412 }
2413
2414 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002415 // Disable C++ EH by default on XCore, PS4, and MSVC.
2416 // FIXME: Remove MSVC from this list once things work.
2417 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2418 !Triple.isPS4CPU() &&
2419 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002420 Arg *ExceptionArg = Args.getLastArg(
2421 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2422 options::OPT_fexceptions, options::OPT_fno_exceptions);
2423 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002424 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002425 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2426 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002427
2428 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002429 if (Triple.isPS4CPU()) {
2430 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2431 assert(ExceptionArg &&
2432 "On the PS4 exceptions should only be enabled if passing "
2433 "an argument");
2434 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2435 const Arg *RTTIArg = TC.getRTTIArg();
2436 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2437 D.Diag(diag::err_drv_argument_not_allowed_with)
2438 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2439 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2440 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2441 } else
2442 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2443
Anders Carlssone96ab552011-02-28 02:27:16 +00002444 CmdArgs.push_back("-fcxx-exceptions");
2445
David Majnemer8de68642014-12-05 08:11:58 +00002446 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002447 }
2448 }
2449
David Majnemer8de68642014-12-05 08:11:58 +00002450 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002451 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002452}
2453
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002454static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002455 bool Default = true;
2456 if (TC.getTriple().isOSDarwin()) {
2457 // The native darwin assembler doesn't support the linker_option directives,
2458 // so we disable them if we think the .s file will be passed to it.
2459 Default = TC.useIntegratedAs();
2460 }
2461 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2462 Default);
2463}
2464
Ted Kremenek62093662013-03-12 17:02:12 +00002465static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2466 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002467 bool UseDwarfDirectory =
2468 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2469 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002470 return !UseDwarfDirectory;
2471}
2472
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002473/// \brief Check whether the given input tree contains any compilation actions.
2474static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002475 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002476 return true;
2477
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002478 for (const auto &Act : *A)
2479 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002480 return true;
2481
2482 return false;
2483}
2484
2485/// \brief Check if -relax-all should be passed to the internal assembler.
2486/// This is done by default when compiling non-assembler source with -O0.
2487static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2488 bool RelaxDefault = true;
2489
2490 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2491 RelaxDefault = A->getOption().matches(options::OPT_O0);
2492
2493 if (RelaxDefault) {
2494 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002495 for (const auto &Act : C.getActions()) {
2496 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002497 RelaxDefault = true;
2498 break;
2499 }
2500 }
2501 }
2502
2503 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002504 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002505}
2506
Paul Robinson0334a042015-12-19 19:41:48 +00002507// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2508// to the corresponding DebugInfoKind.
2509static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2510 assert(A.getOption().matches(options::OPT_gN_Group) &&
2511 "Not a -g option that specifies a debug-info level");
2512 if (A.getOption().matches(options::OPT_g0) ||
2513 A.getOption().matches(options::OPT_ggdb0))
2514 return CodeGenOptions::NoDebugInfo;
2515 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2516 A.getOption().matches(options::OPT_ggdb1))
2517 return CodeGenOptions::DebugLineTablesOnly;
2518 return CodeGenOptions::LimitedDebugInfo;
2519}
2520
Douglas Katzman3459ce22015-10-08 04:24:12 +00002521// Extract the integer N from a string spelled "-dwarf-N", returning 0
2522// on mismatch. The StringRef input (rather than an Arg) allows
2523// for use by the "-Xassembler" option parser.
2524static unsigned DwarfVersionNum(StringRef ArgValue) {
2525 return llvm::StringSwitch<unsigned>(ArgValue)
2526 .Case("-gdwarf-2", 2)
2527 .Case("-gdwarf-3", 3)
2528 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002529 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002530 .Default(0);
2531}
2532
2533static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2534 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002535 unsigned DwarfVersion,
2536 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002537 switch (DebugInfoKind) {
2538 case CodeGenOptions::DebugLineTablesOnly:
2539 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2540 break;
2541 case CodeGenOptions::LimitedDebugInfo:
2542 CmdArgs.push_back("-debug-info-kind=limited");
2543 break;
2544 case CodeGenOptions::FullDebugInfo:
2545 CmdArgs.push_back("-debug-info-kind=standalone");
2546 break;
2547 default:
2548 break;
2549 }
2550 if (DwarfVersion > 0)
2551 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002552 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002553 switch (DebuggerTuning) {
2554 case llvm::DebuggerKind::GDB:
2555 CmdArgs.push_back("-debugger-tuning=gdb");
2556 break;
2557 case llvm::DebuggerKind::LLDB:
2558 CmdArgs.push_back("-debugger-tuning=lldb");
2559 break;
2560 case llvm::DebuggerKind::SCE:
2561 CmdArgs.push_back("-debugger-tuning=sce");
2562 break;
2563 default:
2564 break;
2565 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002566}
2567
David Blaikie9260ed62013-07-25 21:19:01 +00002568static void CollectArgsForIntegratedAssembler(Compilation &C,
2569 const ArgList &Args,
2570 ArgStringList &CmdArgs,
2571 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002572 if (UseRelaxAll(C, Args))
2573 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002574
David Majnemer2b9349d2015-12-21 22:09:34 +00002575 // Only default to -mincremental-linker-compatible if we think we are
2576 // targeting the MSVC linker.
2577 bool DefaultIncrementalLinkerCompatible =
2578 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2579 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2580 options::OPT_mno_incremental_linker_compatible,
2581 DefaultIncrementalLinkerCompatible))
2582 CmdArgs.push_back("-mincremental-linker-compatible");
2583
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002584 // When passing -I arguments to the assembler we sometimes need to
2585 // unconditionally take the next argument. For example, when parsing
2586 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2587 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2588 // arg after parsing the '-I' arg.
2589 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002591 // When using an integrated assembler, translate -Wa, and -Xassembler
2592 // options.
2593 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002594 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002595 for (const Arg *A :
2596 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2597 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002598
Benjamin Kramer72e64312015-09-24 14:48:49 +00002599 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002600 if (TakeNextArg) {
2601 CmdArgs.push_back(Value.data());
2602 TakeNextArg = false;
2603 continue;
2604 }
David Blaikie9260ed62013-07-25 21:19:01 +00002605
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002606 switch (C.getDefaultToolChain().getArch()) {
2607 default:
2608 break;
2609 case llvm::Triple::mips:
2610 case llvm::Triple::mipsel:
2611 case llvm::Triple::mips64:
2612 case llvm::Triple::mips64el:
2613 if (Value == "--trap") {
2614 CmdArgs.push_back("-target-feature");
2615 CmdArgs.push_back("+use-tcc-in-div");
2616 continue;
2617 }
2618 if (Value == "--break") {
2619 CmdArgs.push_back("-target-feature");
2620 CmdArgs.push_back("-use-tcc-in-div");
2621 continue;
2622 }
2623 if (Value.startswith("-msoft-float")) {
2624 CmdArgs.push_back("-target-feature");
2625 CmdArgs.push_back("+soft-float");
2626 continue;
2627 }
2628 if (Value.startswith("-mhard-float")) {
2629 CmdArgs.push_back("-target-feature");
2630 CmdArgs.push_back("-soft-float");
2631 continue;
2632 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002633
2634 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2635 .Case("-mips1", "+mips1")
2636 .Case("-mips2", "+mips2")
2637 .Case("-mips3", "+mips3")
2638 .Case("-mips4", "+mips4")
2639 .Case("-mips5", "+mips5")
2640 .Case("-mips32", "+mips32")
2641 .Case("-mips32r2", "+mips32r2")
2642 .Case("-mips32r3", "+mips32r3")
2643 .Case("-mips32r5", "+mips32r5")
2644 .Case("-mips32r6", "+mips32r6")
2645 .Case("-mips64", "+mips64")
2646 .Case("-mips64r2", "+mips64r2")
2647 .Case("-mips64r3", "+mips64r3")
2648 .Case("-mips64r5", "+mips64r5")
2649 .Case("-mips64r6", "+mips64r6")
2650 .Default(nullptr);
2651 if (MipsTargetFeature)
2652 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002653 }
2654
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002655 if (Value == "-force_cpusubtype_ALL") {
2656 // Do nothing, this is the default and we don't support anything else.
2657 } else if (Value == "-L") {
2658 CmdArgs.push_back("-msave-temp-labels");
2659 } else if (Value == "--fatal-warnings") {
2660 CmdArgs.push_back("-massembler-fatal-warnings");
2661 } else if (Value == "--noexecstack") {
2662 CmdArgs.push_back("-mnoexecstack");
2663 } else if (Value == "-compress-debug-sections" ||
2664 Value == "--compress-debug-sections") {
2665 CompressDebugSections = true;
2666 } else if (Value == "-nocompress-debug-sections" ||
2667 Value == "--nocompress-debug-sections") {
2668 CompressDebugSections = false;
2669 } else if (Value.startswith("-I")) {
2670 CmdArgs.push_back(Value.data());
2671 // We need to consume the next argument if the current arg is a plain
2672 // -I. The next arg will be the include directory.
2673 if (Value == "-I")
2674 TakeNextArg = true;
2675 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002676 // "-gdwarf-N" options are not cc1as options.
2677 unsigned DwarfVersion = DwarfVersionNum(Value);
2678 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2679 CmdArgs.push_back(Value.data());
2680 } else {
2681 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002682 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2683 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002684 }
Renato Golin7c542b42015-07-27 23:44:45 +00002685 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2686 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2687 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002688 } else {
2689 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002690 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002691 }
2692 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693 }
2694 if (CompressDebugSections) {
2695 if (llvm::zlib::isAvailable())
2696 CmdArgs.push_back("-compress-debug-sections");
2697 else
2698 D.Diag(diag::warn_debug_compression_unavailable);
2699 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002700 if (MipsTargetFeature != nullptr) {
2701 CmdArgs.push_back("-target-feature");
2702 CmdArgs.push_back(MipsTargetFeature);
2703 }
David Blaikie9260ed62013-07-25 21:19:01 +00002704}
2705
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002706// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002707// FIXME: Make sure we can also emit shared objects if they're requested
2708// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002709static void addClangRT(const ToolChain &TC, const ArgList &Args,
2710 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002711 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002712}
2713
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002714namespace {
2715enum OpenMPRuntimeKind {
2716 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2717 /// without knowing what runtime to target.
2718 OMPRT_Unknown,
2719
2720 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2721 /// the default for Clang.
2722 OMPRT_OMP,
2723
2724 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2725 /// this runtime but can swallow the pragmas, and find and link against the
2726 /// runtime library itself.
2727 OMPRT_GOMP,
2728
Chandler Carruthc6625c62015-05-28 21:10:31 +00002729 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002730 /// OpenMP runtime. We support this mode for users with existing dependencies
2731 /// on this runtime library name.
2732 OMPRT_IOMP5
2733};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002734}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002735
2736/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002737static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2738 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002739 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2740
2741 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2742 if (A)
2743 RuntimeName = A->getValue();
2744
2745 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002746 .Case("libomp", OMPRT_OMP)
2747 .Case("libgomp", OMPRT_GOMP)
2748 .Case("libiomp5", OMPRT_IOMP5)
2749 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002750
2751 if (RT == OMPRT_Unknown) {
2752 if (A)
2753 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002754 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002755 else
2756 // FIXME: We could use a nicer diagnostic here.
2757 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2758 }
2759
2760 return RT;
2761}
2762
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002763static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2764 const ArgList &Args) {
2765 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2766 options::OPT_fno_openmp, false))
2767 return;
2768
2769 switch (getOpenMPRuntime(TC, Args)) {
2770 case OMPRT_OMP:
2771 CmdArgs.push_back("-lomp");
2772 break;
2773 case OMPRT_GOMP:
2774 CmdArgs.push_back("-lgomp");
2775 break;
2776 case OMPRT_IOMP5:
2777 CmdArgs.push_back("-liomp5");
2778 break;
2779 case OMPRT_Unknown:
2780 // Already diagnosed.
2781 break;
2782 }
2783}
2784
Alexey Samsonov52550342014-09-15 19:58:40 +00002785static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2786 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002787 bool IsShared, bool IsWhole) {
2788 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002789 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002790 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002791 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002792 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002793}
2794
Alexey Samsonov52550342014-09-15 19:58:40 +00002795// Tries to use a file with the list of dynamic symbols that need to be exported
2796// from the runtime library. Returns true if the file was found.
2797static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2798 ArgStringList &CmdArgs,
2799 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002800 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002801 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2802 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002803 return true;
2804 }
2805 return false;
2806}
2807
2808static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2809 ArgStringList &CmdArgs) {
2810 // Force linking against the system libraries sanitizers depends on
2811 // (see PR15823 why this is necessary).
2812 CmdArgs.push_back("--no-as-needed");
2813 CmdArgs.push_back("-lpthread");
2814 CmdArgs.push_back("-lrt");
2815 CmdArgs.push_back("-lm");
2816 // There's no libdl on FreeBSD.
2817 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2818 CmdArgs.push_back("-ldl");
2819}
2820
2821static void
2822collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2823 SmallVectorImpl<StringRef> &SharedRuntimes,
2824 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002825 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2826 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2827 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002828 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2829 // Collect shared runtimes.
2830 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2831 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002832 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002833 // The stats_client library is also statically linked into DSOs.
2834 if (SanArgs.needsStatsRt())
2835 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002836
Alexey Samsonov52550342014-09-15 19:58:40 +00002837 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002838 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002839 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002840 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002841 }
2842 if (SanArgs.needsAsanRt()) {
2843 if (SanArgs.needsSharedAsanRt()) {
2844 HelperStaticRuntimes.push_back("asan-preinit");
2845 } else {
2846 StaticRuntimes.push_back("asan");
2847 if (SanArgs.linkCXXRuntimes())
2848 StaticRuntimes.push_back("asan_cxx");
2849 }
2850 }
2851 if (SanArgs.needsDfsanRt())
2852 StaticRuntimes.push_back("dfsan");
2853 if (SanArgs.needsLsanRt())
2854 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002855 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002856 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002857 if (SanArgs.linkCXXRuntimes())
2858 StaticRuntimes.push_back("msan_cxx");
2859 }
2860 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002861 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002862 if (SanArgs.linkCXXRuntimes())
2863 StaticRuntimes.push_back("tsan_cxx");
2864 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002865 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002866 StaticRuntimes.push_back("ubsan_standalone");
2867 if (SanArgs.linkCXXRuntimes())
2868 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002869 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002870 if (SanArgs.needsSafeStackRt())
2871 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002872 if (SanArgs.needsCfiRt())
2873 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002874 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002875 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002876 if (SanArgs.linkCXXRuntimes())
2877 StaticRuntimes.push_back("ubsan_standalone_cxx");
2878 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002879 if (SanArgs.needsStatsRt()) {
2880 NonWholeStaticRuntimes.push_back("stats");
2881 RequiredSymbols.push_back("__sanitizer_stats_register");
2882 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002883}
2884
Alexey Samsonov52550342014-09-15 19:58:40 +00002885// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2886// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2887static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002888 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002889 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002890 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002891 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002892 NonWholeStaticRuntimes, HelperStaticRuntimes,
2893 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002894 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002895 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002896 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002897 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002898 bool AddExportDynamic = false;
2899 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002900 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002901 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2902 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002903 for (auto RT : NonWholeStaticRuntimes) {
2904 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2905 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2906 }
2907 for (auto S : RequiredSymbols) {
2908 CmdArgs.push_back("-u");
2909 CmdArgs.push_back(Args.MakeArgString(S));
2910 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002911 // If there is a static runtime with no dynamic list, force all the symbols
2912 // to be dynamic to be sure we export sanitizer interface functions.
2913 if (AddExportDynamic)
2914 CmdArgs.push_back("-export-dynamic");
2915 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002916}
2917
Reid Kleckner86ea7702015-02-04 23:45:07 +00002918static bool areOptimizationsEnabled(const ArgList &Args) {
2919 // Find the last -O arg and see if it is non-zero.
2920 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2921 return !A->getOption().matches(options::OPT_O0);
2922 // Defaults to -O0.
2923 return false;
2924}
2925
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002926static bool shouldUseFramePointerForTarget(const ArgList &Args,
2927 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002928 switch (Triple.getArch()) {
2929 case llvm::Triple::xcore:
2930 case llvm::Triple::wasm32:
2931 case llvm::Triple::wasm64:
2932 // XCore never wants frame pointers, regardless of OS.
2933 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002934 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002935 default:
2936 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002937 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002938
2939 if (Triple.isOSLinux()) {
2940 switch (Triple.getArch()) {
2941 // Don't use a frame pointer on linux if optimizing for certain targets.
2942 case llvm::Triple::mips64:
2943 case llvm::Triple::mips64el:
2944 case llvm::Triple::mips:
2945 case llvm::Triple::mipsel:
2946 case llvm::Triple::systemz:
2947 case llvm::Triple::x86:
2948 case llvm::Triple::x86_64:
2949 return !areOptimizationsEnabled(Args);
2950 default:
2951 return true;
2952 }
2953 }
2954
2955 if (Triple.isOSWindows()) {
2956 switch (Triple.getArch()) {
2957 case llvm::Triple::x86:
2958 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002959 case llvm::Triple::arm:
2960 case llvm::Triple::thumb:
2961 // Windows on ARM builds with FPO disabled to aid fast stack walking
2962 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002963 default:
2964 // All other supported Windows ISAs use xdata unwind information, so frame
2965 // pointers are not generally useful.
2966 return false;
2967 }
2968 }
2969
2970 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002971}
2972
Rafael Espindola224dd632011-12-14 21:02:23 +00002973static bool shouldUseFramePointer(const ArgList &Args,
2974 const llvm::Triple &Triple) {
2975 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2976 options::OPT_fomit_frame_pointer))
2977 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002978 if (Args.hasArg(options::OPT_pg))
2979 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002980
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002981 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002982}
2983
Eric Christopherb7d97e92013-04-03 01:58:53 +00002984static bool shouldUseLeafFramePointer(const ArgList &Args,
2985 const llvm::Triple &Triple) {
2986 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2987 options::OPT_momit_leaf_frame_pointer))
2988 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002989 if (Args.hasArg(options::OPT_pg))
2990 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002991
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002992 if (Triple.isPS4CPU())
2993 return false;
2994
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002995 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002996}
2997
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002998/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002999static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003000 SmallString<128> cwd;
3001 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003002 CmdArgs.push_back("-fdebug-compilation-dir");
3003 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003004 }
3005}
3006
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003007static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003008 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3009 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3010 SmallString<128> T(FinalOutput->getValue());
3011 llvm::sys::path::replace_extension(T, "dwo");
3012 return Args.MakeArgString(T);
3013 } else {
3014 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003015 SmallString<128> T(
3016 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003017 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003018 llvm::sys::path::replace_extension(F, "dwo");
3019 T += F;
3020 return Args.MakeArgString(F);
3021 }
3022}
3023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003024static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3025 const JobAction &JA, const ArgList &Args,
3026 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003027 ArgStringList ExtractArgs;
3028 ExtractArgs.push_back("--extract-dwo");
3029
3030 ArgStringList StripArgs;
3031 StripArgs.push_back("--strip-dwo");
3032
3033 // Grabbing the output of the earlier compile step.
3034 StripArgs.push_back(Output.getFilename());
3035 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003036 ExtractArgs.push_back(OutFile);
3037
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003038 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003039 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003040
3041 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003042 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003043
3044 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003045 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003046}
3047
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003048/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003049/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3050static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003051 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003052 if (A->getOption().matches(options::OPT_O4) ||
3053 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003054 return true;
3055
3056 if (A->getOption().matches(options::OPT_O0))
3057 return false;
3058
3059 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3060
Rafael Espindola91780de2013-08-26 14:05:41 +00003061 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003062 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003063 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003064 return true;
3065
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003066 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003067 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003068 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003069
3070 unsigned OptLevel = 0;
3071 if (S.getAsInteger(10, OptLevel))
3072 return false;
3073
3074 return OptLevel > 1;
3075 }
3076
3077 return false;
3078}
3079
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003080/// Add -x lang to \p CmdArgs for \p Input.
3081static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3082 ArgStringList &CmdArgs) {
3083 // When using -verify-pch, we don't want to provide the type
3084 // 'precompiled-header' if it was inferred from the file extension
3085 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3086 return;
3087
3088 CmdArgs.push_back("-x");
3089 if (Args.hasArg(options::OPT_rewrite_objc))
3090 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3091 else
3092 CmdArgs.push_back(types::getTypeName(Input.getType()));
3093}
3094
David Majnemerc371ff02015-03-22 08:39:22 +00003095static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003096 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003097 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003098
3099 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003100 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003101
3102 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003103 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003104 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003105 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003106}
3107
Rafael Espindola577637a2015-01-03 00:06:04 +00003108// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003109// options that build systems might add but are unused when assembling or only
3110// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003111static void claimNoWarnArgs(const ArgList &Args) {
3112 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003113 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003114 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003115 Args.ClaimAllArgs(options::OPT_flto);
3116 Args.ClaimAllArgs(options::OPT_fno_lto);
3117}
3118
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003119static void appendUserToPath(SmallVectorImpl<char> &Result) {
3120#ifdef LLVM_ON_UNIX
3121 const char *Username = getenv("LOGNAME");
3122#else
3123 const char *Username = getenv("USERNAME");
3124#endif
3125 if (Username) {
3126 // Validate that LoginName can be used in a path, and get its length.
3127 size_t Len = 0;
3128 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003129 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003130 Username = nullptr;
3131 break;
3132 }
3133 }
3134
3135 if (Username && Len > 0) {
3136 Result.append(Username, Username + Len);
3137 return;
3138 }
3139 }
3140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003141// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003142#ifdef LLVM_ON_UNIX
3143 std::string UID = llvm::utostr(getuid());
3144#else
3145 // FIXME: Windows seems to have an 'SID' that might work.
3146 std::string UID = "9999";
3147#endif
3148 Result.append(UID.begin(), UID.end());
3149}
3150
David Majnemere11d3732015-06-08 00:22:46 +00003151VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3152 const llvm::Triple &Triple,
3153 const llvm::opt::ArgList &Args,
3154 bool IsWindowsMSVC) {
3155 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3156 IsWindowsMSVC) ||
3157 Args.hasArg(options::OPT_fmsc_version) ||
3158 Args.hasArg(options::OPT_fms_compatibility_version)) {
3159 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3160 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003161 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003162
3163 if (MSCVersion && MSCompatibilityVersion) {
3164 if (D)
3165 D->Diag(diag::err_drv_argument_not_allowed_with)
3166 << MSCVersion->getAsString(Args)
3167 << MSCompatibilityVersion->getAsString(Args);
3168 return VersionTuple();
3169 }
3170
3171 if (MSCompatibilityVersion) {
3172 VersionTuple MSVT;
3173 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3174 D->Diag(diag::err_drv_invalid_value)
3175 << MSCompatibilityVersion->getAsString(Args)
3176 << MSCompatibilityVersion->getValue();
3177 return MSVT;
3178 }
3179
3180 if (MSCVersion) {
3181 unsigned Version = 0;
3182 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3183 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3184 << MSCVersion->getValue();
3185 return getMSCompatibilityVersion(Version);
3186 }
3187
3188 unsigned Major, Minor, Micro;
3189 Triple.getEnvironmentVersion(Major, Minor, Micro);
3190 if (Major || Minor || Micro)
3191 return VersionTuple(Major, Minor, Micro);
3192
3193 return VersionTuple(18);
3194 }
3195 return VersionTuple();
3196}
3197
Diego Novilloa0545962015-07-10 18:00:07 +00003198static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3199 const InputInfo &Output, const ArgList &Args,
3200 ArgStringList &CmdArgs) {
3201 auto *ProfileGenerateArg = Args.getLastArg(
3202 options::OPT_fprofile_instr_generate,
3203 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003204 options::OPT_fprofile_generate_EQ,
3205 options::OPT_fno_profile_instr_generate);
3206 if (ProfileGenerateArg &&
3207 ProfileGenerateArg->getOption().matches(
3208 options::OPT_fno_profile_instr_generate))
3209 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003210
3211 auto *ProfileUseArg = Args.getLastArg(
3212 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003213 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3214 options::OPT_fno_profile_instr_use);
3215 if (ProfileUseArg &&
3216 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3217 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003218
3219 if (ProfileGenerateArg && ProfileUseArg)
3220 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003221 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003222
Diego Novillo758f3f52015-08-05 21:49:51 +00003223 if (ProfileGenerateArg) {
3224 if (ProfileGenerateArg->getOption().matches(
3225 options::OPT_fprofile_instr_generate_EQ))
3226 ProfileGenerateArg->render(Args, CmdArgs);
3227 else if (ProfileGenerateArg->getOption().matches(
3228 options::OPT_fprofile_generate_EQ)) {
3229 SmallString<128> Path(ProfileGenerateArg->getValue());
3230 llvm::sys::path::append(Path, "default.profraw");
3231 CmdArgs.push_back(
3232 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3233 } else
3234 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3235 }
Diego Novilloa0545962015-07-10 18:00:07 +00003236
Diego Novillo758f3f52015-08-05 21:49:51 +00003237 if (ProfileUseArg) {
3238 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3239 ProfileUseArg->render(Args, CmdArgs);
3240 else if ((ProfileUseArg->getOption().matches(
3241 options::OPT_fprofile_use_EQ) ||
3242 ProfileUseArg->getOption().matches(
3243 options::OPT_fprofile_instr_use))) {
3244 SmallString<128> Path(
3245 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3246 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3247 llvm::sys::path::append(Path, "default.profdata");
3248 CmdArgs.push_back(
3249 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3250 }
Diego Novilloa0545962015-07-10 18:00:07 +00003251 }
3252
3253 if (Args.hasArg(options::OPT_ftest_coverage) ||
3254 Args.hasArg(options::OPT_coverage))
3255 CmdArgs.push_back("-femit-coverage-notes");
3256 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3257 false) ||
3258 Args.hasArg(options::OPT_coverage))
3259 CmdArgs.push_back("-femit-coverage-data");
3260
Diego Novilloc4b94da2015-08-05 23:27:40 +00003261 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3262 options::OPT_fno_coverage_mapping, false) &&
3263 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003264 D.Diag(diag::err_drv_argument_only_allowed_with)
3265 << "-fcoverage-mapping"
3266 << "-fprofile-instr-generate";
3267
Diego Novilloc4b94da2015-08-05 23:27:40 +00003268 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3269 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003270 CmdArgs.push_back("-fcoverage-mapping");
3271
3272 if (C.getArgs().hasArg(options::OPT_c) ||
3273 C.getArgs().hasArg(options::OPT_S)) {
3274 if (Output.isFilename()) {
3275 CmdArgs.push_back("-coverage-file");
3276 SmallString<128> CoverageFilename;
3277 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3278 CoverageFilename = FinalOutput->getValue();
3279 } else {
3280 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3281 }
3282 if (llvm::sys::path::is_relative(CoverageFilename)) {
3283 SmallString<128> Pwd;
3284 if (!llvm::sys::fs::current_path(Pwd)) {
3285 llvm::sys::path::append(Pwd, CoverageFilename);
3286 CoverageFilename.swap(Pwd);
3287 }
3288 }
3289 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3290 }
3291 }
3292}
3293
Paul Robinsond083b9a2015-12-16 17:25:27 +00003294static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3295 ArgStringList &CmdArgs) {
3296 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3297 false) ||
3298 Args.hasFlag(options::OPT_fprofile_generate,
3299 options::OPT_fno_profile_instr_generate, false) ||
3300 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3301 options::OPT_fno_profile_instr_generate, false) ||
3302 Args.hasFlag(options::OPT_fprofile_instr_generate,
3303 options::OPT_fno_profile_instr_generate, false) ||
3304 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3305 options::OPT_fno_profile_instr_generate, false) ||
3306 Args.hasArg(options::OPT_fcreate_profile) ||
3307 Args.hasArg(options::OPT_coverage)))
3308 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3309}
3310
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003311/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3312/// smooshes them together with platform defaults, to decide whether
3313/// this compile should be using PIC mode or not. Returns a tuple of
3314/// (RelocationModel, PICLevel, IsPIE).
3315static std::tuple<llvm::Reloc::Model, unsigned, bool>
3316ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3317 const ArgList &Args) {
3318 // FIXME: why does this code...and so much everywhere else, use both
3319 // ToolChain.getTriple() and Triple?
3320 bool PIE = ToolChain.isPIEDefault();
3321 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003322 // The Darwin/MachO default to use PIC does not apply when using -static.
3323 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3324 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003325 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003326 bool IsPICLevelTwo = PIC;
3327
3328 bool KernelOrKext =
3329 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3330
3331 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003332 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003333 switch (ToolChain.getArch()) {
3334 case llvm::Triple::arm:
3335 case llvm::Triple::armeb:
3336 case llvm::Triple::thumb:
3337 case llvm::Triple::thumbeb:
3338 case llvm::Triple::aarch64:
3339 case llvm::Triple::mips:
3340 case llvm::Triple::mipsel:
3341 case llvm::Triple::mips64:
3342 case llvm::Triple::mips64el:
3343 PIC = true; // "-fpic"
3344 break;
3345
3346 case llvm::Triple::x86:
3347 case llvm::Triple::x86_64:
3348 PIC = true; // "-fPIC"
3349 IsPICLevelTwo = true;
3350 break;
3351
3352 default:
3353 break;
3354 }
3355 }
3356
3357 // OpenBSD-specific defaults for PIE
3358 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3359 switch (ToolChain.getArch()) {
3360 case llvm::Triple::mips64:
3361 case llvm::Triple::mips64el:
3362 case llvm::Triple::sparcel:
3363 case llvm::Triple::x86:
3364 case llvm::Triple::x86_64:
3365 IsPICLevelTwo = false; // "-fpie"
3366 break;
3367
3368 case llvm::Triple::ppc:
3369 case llvm::Triple::sparc:
3370 case llvm::Triple::sparcv9:
3371 IsPICLevelTwo = true; // "-fPIE"
3372 break;
3373
3374 default:
3375 break;
3376 }
3377 }
3378
3379 // The last argument relating to either PIC or PIE wins, and no
3380 // other argument is used. If the last argument is any flavor of the
3381 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3382 // option implicitly enables PIC at the same level.
3383 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3384 options::OPT_fpic, options::OPT_fno_pic,
3385 options::OPT_fPIE, options::OPT_fno_PIE,
3386 options::OPT_fpie, options::OPT_fno_pie);
3387 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3388 // is forced, then neither PIC nor PIE flags will have no effect.
3389 if (!ToolChain.isPICDefaultForced()) {
3390 if (LastPICArg) {
3391 Option O = LastPICArg->getOption();
3392 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3393 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3394 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3395 PIC =
3396 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3397 IsPICLevelTwo =
3398 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3399 } else {
3400 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003401 if (Triple.isPS4CPU()) {
3402 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3403 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3404 if (Model != "kernel") {
3405 PIC = true;
3406 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3407 << LastPICArg->getSpelling();
3408 }
3409 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003410 }
3411 }
3412 }
3413
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003414 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3415 // PIC level would've been set to level 1, force it back to level 2 PIC
3416 // instead.
3417 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003418 IsPICLevelTwo |= ToolChain.isPICDefault();
3419
James Y Knightc4015d32015-08-21 04:14:55 +00003420 // This kernel flags are a trump-card: they will disable PIC/PIE
3421 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003422 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3423 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003424 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003425
3426 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3427 // This is a very special mode. It trumps the other modes, almost no one
3428 // uses it, and it isn't even valid on any OS but Darwin.
3429 if (!ToolChain.getTriple().isOSDarwin())
3430 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3431 << A->getSpelling() << ToolChain.getTriple().str();
3432
3433 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3434
3435 // Only a forced PIC mode can cause the actual compile to have PIC defines
3436 // etc., no flags are sufficient. This behavior was selected to closely
3437 // match that of llvm-gcc and Apple GCC before that.
3438 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3439
3440 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3441 }
3442
3443 if (PIC)
3444 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3445
3446 return std::make_tuple(llvm::Reloc::Static, 0, false);
3447}
3448
3449static const char *RelocationModelName(llvm::Reloc::Model Model) {
3450 switch (Model) {
3451 case llvm::Reloc::Default:
3452 return nullptr;
3453 case llvm::Reloc::Static:
3454 return "static";
3455 case llvm::Reloc::PIC_:
3456 return "pic";
3457 case llvm::Reloc::DynamicNoPIC:
3458 return "dynamic-no-pic";
3459 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003460 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003461}
3462
3463static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3464 ArgStringList &CmdArgs) {
3465 llvm::Reloc::Model RelocationModel;
3466 unsigned PICLevel;
3467 bool IsPIE;
3468 std::tie(RelocationModel, PICLevel, IsPIE) =
3469 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3470
3471 if (RelocationModel != llvm::Reloc::Static)
3472 CmdArgs.push_back("-KPIC");
3473}
3474
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003475void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003476 const InputInfo &Output, const InputInfoList &Inputs,
3477 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003478 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3479 const llvm::Triple Triple(TripleStr);
3480
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003481 bool KernelOrKext =
3482 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003483 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003484 ArgStringList CmdArgs;
3485
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003486 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003487 bool IsWindowsCygnus =
3488 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003489 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003490 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003491
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003492 // Check number of inputs for sanity. We need at least one input.
3493 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003494 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003495 // CUDA compilation may have multiple inputs (source file + results of
3496 // device-side compilations). All other jobs are expected to have exactly one
3497 // input.
3498 bool IsCuda = types::isCuda(Input.getType());
3499 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003500
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003501 // Invoke ourselves in -cc1 mode.
3502 //
3503 // FIXME: Implement custom jobs for internal actions.
3504 CmdArgs.push_back("-cc1");
3505
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003506 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003507 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003508 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003509
Artem Belevichfa11ab52015-11-17 22:28:46 +00003510 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003511 if (IsCuda) {
3512 // FIXME: We need a (better) way to pass information about
3513 // particular compilation pass we're constructing here. For now we
3514 // can check which toolchain we're using and pick the other one to
3515 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003516 if (&getToolChain() == C.getCudaDeviceToolChain())
3517 AuxToolChain = C.getCudaHostToolChain();
3518 else if (&getToolChain() == C.getCudaHostToolChain())
3519 AuxToolChain = C.getCudaDeviceToolChain();
3520 else
3521 llvm_unreachable("Can't figure out CUDA compilation mode.");
3522 assert(AuxToolChain != nullptr && "No aux toolchain.");
3523 CmdArgs.push_back("-aux-triple");
3524 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003525 CmdArgs.push_back("-fcuda-target-overloads");
3526 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003527 }
3528
James Y Knight2db38f32015-08-15 03:45:25 +00003529 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3530 Triple.getArch() == llvm::Triple::thumb)) {
3531 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003532 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003533 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003534 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003535 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003536 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003537 }
3538
Tim Northover336f1892014-03-29 13:16:12 +00003539 // Push all default warning arguments that are specific to
3540 // the given target. These come before user provided warning options
3541 // are provided.
3542 getToolChain().addClangWarningOptions(CmdArgs);
3543
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003544 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003545 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003546
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003547 if (isa<AnalyzeJobAction>(JA)) {
3548 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3549 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003550 } else if (isa<MigrateJobAction>(JA)) {
3551 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003552 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003553 if (Output.getType() == types::TY_Dependencies)
3554 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003555 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003556 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003557 if (Args.hasArg(options::OPT_rewrite_objc) &&
3558 !Args.hasArg(options::OPT_g_Group))
3559 CmdArgs.push_back("-P");
3560 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003561 } else if (isa<AssembleJobAction>(JA)) {
3562 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003563
David Blaikie9260ed62013-07-25 21:19:01 +00003564 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003565
3566 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003567 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003568 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003569 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003570 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003571
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003572 if (JA.getType() == types::TY_Nothing)
3573 CmdArgs.push_back("-fsyntax-only");
3574 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003575 CmdArgs.push_back("-emit-pch");
3576 else
3577 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003578 } else if (isa<VerifyPCHJobAction>(JA)) {
3579 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003580 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003581 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3582 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003583 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003584 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003585 } else if (JA.getType() == types::TY_LLVM_IR ||
3586 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003587 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003588 } else if (JA.getType() == types::TY_LLVM_BC ||
3589 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003590 CmdArgs.push_back("-emit-llvm-bc");
3591 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003592 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003593 } else if (JA.getType() == types::TY_AST) {
3594 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003595 } else if (JA.getType() == types::TY_ModuleFile) {
3596 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003597 } else if (JA.getType() == types::TY_RewrittenObjC) {
3598 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003599 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003600 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3601 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003602 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003603 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003604 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003605 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003606
3607 // Preserve use-list order by default when emitting bitcode, so that
3608 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3609 // same result as running passes here. For LTO, we don't need to preserve
3610 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003611 if (JA.getType() == types::TY_LLVM_BC)
3612 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003613
3614 if (D.isUsingLTO())
3615 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003616 }
3617
Teresa Johnsonaff22322015-12-07 19:21:34 +00003618 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3619 if (!types::isLLVMIR(Input.getType()))
3620 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3621 << "-x ir";
3622 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3623 }
3624
Justin Bognera88f0122014-06-20 22:59:50 +00003625 // We normally speed up the clang process a bit by skipping destructors at
3626 // exit, but when we're generating diagnostics we can rely on some of the
3627 // cleanup.
3628 if (!C.isForDiagnostics())
3629 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003630
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003631// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003632#ifdef NDEBUG
3633 CmdArgs.push_back("-disable-llvm-verifier");
3634#endif
3635
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003636 // Set the main file name, so that debug info works even with
3637 // -save-temps.
3638 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003639 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003640
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003641 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003642 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003643 if (Args.hasArg(options::OPT_static))
3644 CmdArgs.push_back("-static-define");
3645
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003646 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003647 // Enable region store model by default.
3648 CmdArgs.push_back("-analyzer-store=region");
3649
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003650 // Treat blocks as analysis entry points.
3651 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3652
Ted Kremenek49c79792011-03-24 00:28:47 +00003653 CmdArgs.push_back("-analyzer-eagerly-assume");
3654
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003655 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003656 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003657 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003658
Devin Coughlin65c77082016-01-21 20:09:49 +00003659 if (!IsWindowsMSVC) {
3660 CmdArgs.push_back("-analyzer-checker=unix");
3661 } else {
3662 // Enable "unix" checkers that also work on Windows.
3663 CmdArgs.push_back("-analyzer-checker=unix.API");
3664 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3665 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3666 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3667 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3668 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3669 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003670
Sean Evesonb38c32b2016-01-06 10:03:58 +00003671 // Disable some unix checkers for PS4.
3672 if (IsPS4CPU) {
3673 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3674 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3675 }
3676
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003677 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003678 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003679
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003680 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003681
Artem Belevichba558952015-05-06 18:20:23 +00003682 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003683 CmdArgs.push_back("-analyzer-checker=cplusplus");
3684
Sean Evesonb38c32b2016-01-06 10:03:58 +00003685 if (!IsPS4CPU) {
3686 CmdArgs.push_back(
3687 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3688 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3690 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3693 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003694
3695 // Default nullability checks.
3696 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3697 CmdArgs.push_back(
3698 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003699 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003700
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003701 // Set the output format. The default is plist, for (lame) historical
3702 // reasons.
3703 CmdArgs.push_back("-analyzer-output");
3704 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003705 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003706 else
3707 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003708
Ted Kremenekfe449a22010-03-22 22:32:05 +00003709 // Disable the presentation of standard compiler warnings when
3710 // using --analyze. We only want to show static analyzer diagnostics
3711 // or frontend errors.
3712 CmdArgs.push_back("-w");
3713
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003714 // Add -Xanalyzer arguments when running as analyzer.
3715 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003716 }
3717
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003718 CheckCodeGenerationOptions(D, Args);
3719
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003720 llvm::Reloc::Model RelocationModel;
3721 unsigned PICLevel;
3722 bool IsPIE;
3723 std::tie(RelocationModel, PICLevel, IsPIE) =
3724 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003725
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003726 const char *RMName = RelocationModelName(RelocationModel);
3727 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003728 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003729 CmdArgs.push_back(RMName);
3730 }
3731 if (PICLevel > 0) {
3732 CmdArgs.push_back("-pic-level");
3733 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3734 if (IsPIE) {
3735 CmdArgs.push_back("-pie-level");
3736 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003737 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003738 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003739
Renato Golin4854d802015-11-09 12:40:41 +00003740 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3741 CmdArgs.push_back("-meabi");
3742 CmdArgs.push_back(A->getValue());
3743 }
3744
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003745 CmdArgs.push_back("-mthread-model");
3746 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3747 CmdArgs.push_back(A->getValue());
3748 else
3749 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3750
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003751 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3752
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003753 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3754 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003755 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003756
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003757 // LLVM Code Generator Options.
3758
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003759 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3760 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003761 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3762 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003763 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003764 CmdArgs.push_back(A->getValue());
3765 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003766 }
3767 }
3768
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003769 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3770 StringRef v = A->getValue();
3771 CmdArgs.push_back("-mllvm");
3772 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3773 A->claim();
3774 }
3775
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003776 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3777 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003778 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003779 }
3780
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003781 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3782 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003783 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003784 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003785 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003786 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3787 CmdArgs.push_back("-fpcc-struct-return");
3788 } else {
3789 assert(A->getOption().matches(options::OPT_freg_struct_return));
3790 CmdArgs.push_back("-freg-struct-return");
3791 }
3792 }
3793
Roman Divacky65b88cd2011-03-01 17:40:53 +00003794 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3795 CmdArgs.push_back("-mrtd");
3796
Rafael Espindola224dd632011-12-14 21:02:23 +00003797 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003798 CmdArgs.push_back("-mdisable-fp-elim");
3799 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3800 options::OPT_fno_zero_initialized_in_bss))
3801 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003802
3803 bool OFastEnabled = isOptimizationLevelFast(Args);
3804 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3805 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003806 OptSpecifier StrictAliasingAliasOption =
3807 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003808 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3809 // doesn't do any TBAA.
3810 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003811 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003812 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003813 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003814 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3815 options::OPT_fno_struct_path_tbaa))
3816 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003817 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3818 false))
3819 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003820 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3821 options::OPT_fno_strict_vtable_pointers,
3822 false))
3823 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003824 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3825 options::OPT_fno_optimize_sibling_calls))
3826 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003827
Eric Christopher006208c2013-04-04 06:29:47 +00003828 // Handle segmented stacks.
3829 if (Args.hasArg(options::OPT_fsplit_stack))
3830 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003831
3832 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3833 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003834 OptSpecifier FastMathAliasOption =
3835 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3836
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003837 // Handle various floating point optimization flags, mapping them to the
3838 // appropriate LLVM code generation flags. The pattern for all of these is to
3839 // default off the codegen optimizations, and if any flag enables them and no
3840 // flag disables them after the flag enabling them, enable the codegen
3841 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003842 if (Arg *A = Args.getLastArg(
3843 options::OPT_ffast_math, FastMathAliasOption,
3844 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3845 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3846 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003847 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3848 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003849 A->getOption().getID() != options::OPT_fhonor_infinities)
3850 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003851 if (Arg *A = Args.getLastArg(
3852 options::OPT_ffast_math, FastMathAliasOption,
3853 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3854 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3855 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003856 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3857 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003858 A->getOption().getID() != options::OPT_fhonor_nans)
3859 CmdArgs.push_back("-menable-no-nans");
3860
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003861 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3862 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003863 if (Arg *A =
3864 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3865 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3866 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003867 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3868 // However, turning *off* -ffast_math merely restores the toolchain default
3869 // (which may be false).
3870 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3871 A->getOption().getID() == options::OPT_ffast_math ||
3872 A->getOption().getID() == options::OPT_Ofast)
3873 MathErrno = false;
3874 else if (A->getOption().getID() == options::OPT_fmath_errno)
3875 MathErrno = true;
3876 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003877 if (MathErrno)
3878 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003879
3880 // There are several flags which require disabling very specific
3881 // optimizations. Any of these being disabled forces us to turn off the
3882 // entire set of LLVM optimizations, so collect them through all the flag
3883 // madness.
3884 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003885 if (Arg *A = Args.getLastArg(
3886 options::OPT_ffast_math, FastMathAliasOption,
3887 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3888 options::OPT_fno_unsafe_math_optimizations,
3889 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003890 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3891 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003892 A->getOption().getID() != options::OPT_fno_associative_math)
3893 AssociativeMath = true;
3894 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003895 if (Arg *A = Args.getLastArg(
3896 options::OPT_ffast_math, FastMathAliasOption,
3897 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3898 options::OPT_fno_unsafe_math_optimizations,
3899 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003900 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3901 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003902 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3903 ReciprocalMath = true;
3904 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003905 if (Arg *A = Args.getLastArg(
3906 options::OPT_ffast_math, FastMathAliasOption,
3907 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3908 options::OPT_fno_unsafe_math_optimizations,
3909 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003910 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3911 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003912 A->getOption().getID() != options::OPT_fsigned_zeros)
3913 SignedZeros = false;
3914 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003915 if (Arg *A = Args.getLastArg(
3916 options::OPT_ffast_math, FastMathAliasOption,
3917 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3918 options::OPT_fno_unsafe_math_optimizations,
3919 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003920 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3921 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003922 A->getOption().getID() != options::OPT_ftrapping_math)
3923 TrappingMath = false;
3924 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3925 !TrappingMath)
3926 CmdArgs.push_back("-menable-unsafe-fp-math");
3927
Sanjay Patel76c9e092015-01-23 16:40:50 +00003928 if (!SignedZeros)
3929 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003930
Sanjay Patel359b1052015-04-09 15:03:23 +00003931 if (ReciprocalMath)
3932 CmdArgs.push_back("-freciprocal-math");
3933
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003934 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003935 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003936 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003937 options::OPT_ffp_contract)) {
3938 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003939 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003940 if (Val == "fast" || Val == "on" || Val == "off") {
3941 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3942 } else {
3943 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003945 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003946 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3947 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003948 // If fast-math is set then set the fp-contract mode to fast.
3949 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3950 }
3951 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003952
Sanjay Patel2987c292015-06-11 14:53:41 +00003953 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003954
Bob Wilson6a039162012-07-19 03:52:53 +00003955 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3956 // and if we find them, tell the frontend to provide the appropriate
3957 // preprocessor macros. This is distinct from enabling any optimizations as
3958 // these options induce language changes which must survive serialization
3959 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003960 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3961 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003962 if (!A->getOption().matches(options::OPT_fno_fast_math))
3963 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003964 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3965 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003966 if (A->getOption().matches(options::OPT_ffinite_math_only))
3967 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003968
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003969 // Decide whether to use verbose asm. Verbose assembly is the default on
3970 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003971 bool IsIntegratedAssemblerDefault =
3972 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003973 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003974 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003975 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003976 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003977
Rafael Espindolab8a12932015-05-22 20:44:03 +00003978 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3979 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003980 CmdArgs.push_back("-no-integrated-as");
3981
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003982 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3983 CmdArgs.push_back("-mdebug-pass");
3984 CmdArgs.push_back("Structure");
3985 }
3986 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3987 CmdArgs.push_back("-mdebug-pass");
3988 CmdArgs.push_back("Arguments");
3989 }
3990
Justin Lebar710a35f2016-01-25 22:36:35 +00003991 // Enable -mconstructor-aliases except on darwin, where we have to work around
3992 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
3993 // aliases aren't supported.
3994 if (!getToolChain().getTriple().isOSDarwin() &&
3995 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00003996 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003997
John McCall7ef5cb32011-03-18 02:56:14 +00003998 // Darwin's kernel doesn't support guard variables; just die if we
3999 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004000 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004001 CmdArgs.push_back("-fforbid-guard-variables");
4002
Akira Hatanaka02028482015-11-12 17:21:22 +00004003 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4004 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004005 CmdArgs.push_back("-mms-bitfields");
4006 }
John McCall8517abc2010-02-19 02:45:38 +00004007
Daniel Dunbar306945d2009-09-16 06:17:29 +00004008 // This is a coarse approximation of what llvm-gcc actually does, both
4009 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4010 // complicated ways.
4011 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004012 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4013 options::OPT_fno_asynchronous_unwind_tables,
4014 (getToolChain().IsUnwindTablesDefault() ||
4015 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4016 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004017 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4018 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004019 CmdArgs.push_back("-munwind-tables");
4020
Chandler Carruth05fb5852012-11-21 23:40:23 +00004021 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004022
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004023 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4024 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004025 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004026 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004027
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004028 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004029 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004030
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004031 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004032 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004033 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004034 }
4035
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004036 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004037 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004038 if (!CPU.empty()) {
4039 CmdArgs.push_back("-target-cpu");
4040 CmdArgs.push_back(Args.MakeArgString(CPU));
4041 }
4042
Rafael Espindolaeb265472013-08-21 21:59:03 +00004043 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4044 CmdArgs.push_back("-mfpmath");
4045 CmdArgs.push_back(A->getValue());
4046 }
4047
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004048 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004049 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004050
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004051 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004052 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004053 default:
4054 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004055
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004056 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004057 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004058 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004059 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004060 // Use the effective triple, which takes into account the deployment target.
4061 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004062 break;
4063
Tim Northover573cbee2014-05-24 12:52:07 +00004064 case llvm::Triple::aarch64:
4065 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004066 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004067 break;
4068
Eric Christopher0b26a612010-03-02 02:41:08 +00004069 case llvm::Triple::mips:
4070 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004071 case llvm::Triple::mips64:
4072 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004073 AddMIPSTargetArgs(Args, CmdArgs);
4074 break;
4075
Ulrich Weigand8afad612014-07-28 13:17:52 +00004076 case llvm::Triple::ppc:
4077 case llvm::Triple::ppc64:
4078 case llvm::Triple::ppc64le:
4079 AddPPCTargetArgs(Args, CmdArgs);
4080 break;
4081
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004082 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004083 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004084 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004085 AddSparcTargetArgs(Args, CmdArgs);
4086 break;
4087
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004088 case llvm::Triple::x86:
4089 case llvm::Triple::x86_64:
4090 AddX86TargetArgs(Args, CmdArgs);
4091 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004092
4093 case llvm::Triple::hexagon:
4094 AddHexagonTargetArgs(Args, CmdArgs);
4095 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004096
4097 case llvm::Triple::wasm32:
4098 case llvm::Triple::wasm64:
4099 AddWebAssemblyTargetArgs(Args, CmdArgs);
4100 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004101 }
4102
Douglas Katzman3459ce22015-10-08 04:24:12 +00004103 // The 'g' groups options involve a somewhat intricate sequence of decisions
4104 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004105 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004106 // * what level of debug info to generate
4107 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004108 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004109 // This avoids having to monkey around further in cc1 other than to disable
4110 // codeview if not running in a Windows environment. Perhaps even that
4111 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004112 unsigned DwarfVersion = 0;
4113 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4114 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004115 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4116 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004117 bool EmitCodeView = false;
4118
Hans Wennborg75958c42013-08-08 00:17:41 +00004119 // Add clang-cl arguments.
4120 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004121 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004122
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004123 // Pass the linker version in use.
4124 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4125 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004126 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004127 }
4128
Eric Christopherb7d97e92013-04-03 01:58:53 +00004129 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004130 CmdArgs.push_back("-momit-leaf-frame-pointer");
4131
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004132 // Explicitly error on some things we know we don't support and can't just
4133 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004134 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004135 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4136 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004137 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004138 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004139 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4140 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004141 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004142 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004143 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004144 }
4145
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004146 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004147 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004148 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004149 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004150 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4151 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004152 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004153 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004154 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004155
Chad Rosierbe10f982011-08-02 17:58:04 +00004156 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004157 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004158 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4159 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004160 }
4161
Rafael Espindola08a692a2010-03-07 04:46:18 +00004162 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004163 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004164 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004165 // If the last option explicitly specified a debug-info level, use it.
4166 if (A->getOption().matches(options::OPT_gN_Group)) {
4167 DebugInfoKind = DebugLevelToInfoKind(*A);
4168 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4169 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4170 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4171 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4172 A->getIndex() > SplitDwarfArg->getIndex())
4173 SplitDwarfArg = nullptr;
4174 } else
4175 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004176 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004177 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004178
Paul Robinson0334a042015-12-19 19:41:48 +00004179 // If a debugger tuning argument appeared, remember it.
4180 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4181 options::OPT_ggdbN_Group)) {
4182 if (A->getOption().matches(options::OPT_glldb))
4183 DebuggerTuning = llvm::DebuggerKind::LLDB;
4184 else if (A->getOption().matches(options::OPT_gsce))
4185 DebuggerTuning = llvm::DebuggerKind::SCE;
4186 else
4187 DebuggerTuning = llvm::DebuggerKind::GDB;
4188 }
4189
4190 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004191 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004192 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004193 DwarfVersion = DwarfVersionNum(A->getSpelling());
4194
Reid Kleckner124955a2015-08-05 18:51:13 +00004195 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004196 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4197 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4198 // DwarfVersion remains at 0 if no explicit choice was made.
4199 CmdArgs.push_back("-gcodeview");
4200 } else if (DwarfVersion == 0 &&
4201 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4202 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4203 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004204
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004205 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4206 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004207
4208 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004209 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004210 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004211 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004212
Eric Christopher138c32b2013-09-13 22:37:55 +00004213 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004214 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004215 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004216 CmdArgs.push_back("-dwarf-ext-refs");
4217 CmdArgs.push_back("-fmodule-format=obj");
4218 }
4219
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004220 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4221 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004222 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004223 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004224 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004225 CmdArgs.push_back("-backend-option");
4226 CmdArgs.push_back("-split-dwarf=Enable");
4227 }
4228
Douglas Katzman3459ce22015-10-08 04:24:12 +00004229 // After we've dealt with all combinations of things that could
4230 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4231 // figure out if we need to "upgrade" it to standalone debug info.
4232 // We parse these two '-f' options whether or not they will be used,
4233 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4234 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4235 options::OPT_fno_standalone_debug,
4236 getToolChain().GetDefaultStandaloneDebug());
4237 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4238 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004239 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4240 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004241
Eric Christopher138c32b2013-09-13 22:37:55 +00004242 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4243 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4244 CmdArgs.push_back("-backend-option");
4245 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4246 }
Eric Christophereec89c22013-06-18 00:03:50 +00004247
Eric Christopher0d403d22014-02-14 01:27:03 +00004248 // -gdwarf-aranges turns on the emission of the aranges section in the
4249 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004250 // Always enabled on the PS4.
4251 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004252 CmdArgs.push_back("-backend-option");
4253 CmdArgs.push_back("-generate-arange-section");
4254 }
4255
David Blaikief36d9ba2014-01-27 18:52:43 +00004256 if (Args.hasFlag(options::OPT_fdebug_types_section,
4257 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004258 CmdArgs.push_back("-backend-option");
4259 CmdArgs.push_back("-generate-type-units");
4260 }
Eric Christophereec89c22013-06-18 00:03:50 +00004261
Dan Gohmana5b804b2016-01-07 00:50:27 +00004262 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4263 // default.
4264 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4265 Triple.getArch() == llvm::Triple::wasm32 ||
4266 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004267
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004268 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004269 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004270 CmdArgs.push_back("-ffunction-sections");
4271 }
4272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004273 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4274 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004275 CmdArgs.push_back("-fdata-sections");
4276 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004277
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004278 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004279 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004280 CmdArgs.push_back("-fno-unique-section-names");
4281
Chris Lattner3c77a352010-06-22 00:03:40 +00004282 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4283
Diego Novilloa0545962015-07-10 18:00:07 +00004284 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004285
Paul Robinsond083b9a2015-12-16 17:25:27 +00004286 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4287 if (getToolChain().getTriple().isPS4CPU())
4288 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4289
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004290 // Pass options for controlling the default header search paths.
4291 if (Args.hasArg(options::OPT_nostdinc)) {
4292 CmdArgs.push_back("-nostdsysteminc");
4293 CmdArgs.push_back("-nobuiltininc");
4294 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004295 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004296 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004297 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4298 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4299 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004300
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004301 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004302 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004303 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004304
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004305 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4306
Ted Kremenekf7639e12012-03-06 20:06:33 +00004307 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004308 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004309 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004310 options::OPT_ccc_arcmt_modify,
4311 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004312 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004313 switch (A->getOption().getID()) {
4314 default:
4315 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004316 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004317 CmdArgs.push_back("-arcmt-check");
4318 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004319 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004320 CmdArgs.push_back("-arcmt-modify");
4321 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004322 case options::OPT_ccc_arcmt_migrate:
4323 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004324 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004325 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004326
4327 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4328 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004329 break;
John McCalld70fb982011-06-15 23:25:17 +00004330 }
4331 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004332 } else {
4333 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4334 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4335 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004336 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004337
Ted Kremenekf7639e12012-03-06 20:06:33 +00004338 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4339 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004340 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4341 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004342 }
4343 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004344 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004345
4346 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004347 options::OPT_objcmt_migrate_subscripting,
4348 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004349 // None specified, means enable them all.
4350 CmdArgs.push_back("-objcmt-migrate-literals");
4351 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004352 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004353 } else {
4354 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4355 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004356 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004357 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004358 } else {
4359 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4363 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4364 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004373 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004374 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004375 }
4376
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004377 // Add preprocessing options like -I, -D, etc. if we are using the
4378 // preprocessor.
4379 //
4380 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004381 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004382 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4383 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004384
Rafael Espindolaa7431922011-07-21 23:40:37 +00004385 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4386 // that "The compiler can only warn and ignore the option if not recognized".
4387 // When building with ccache, it will pass -D options to clang even on
4388 // preprocessed inputs and configure concludes that -fPIC is not supported.
4389 Args.ClaimAllArgs(options::OPT_D);
4390
Alp Toker7874bdc2013-11-15 20:40:58 +00004391 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004392 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4393 if (A->getOption().matches(options::OPT_O4)) {
4394 CmdArgs.push_back("-O3");
4395 D.Diag(diag::warn_O4_is_O3);
4396 } else {
4397 A->render(Args, CmdArgs);
4398 }
4399 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004400
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004401 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004402 for (const Arg *A :
4403 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4404 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004405 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004406 }
4407
Rafael Espindola577637a2015-01-03 00:06:04 +00004408 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004409
Richard Smith3be1cb22014-08-07 00:24:21 +00004410 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004411 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004412 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4413 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004414 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004415 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004416
4417 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004418 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004419 //
4420 // If a std is supplied, only add -trigraphs if it follows the
4421 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004422 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004423 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4424 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004425 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004426 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004427 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004428 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004429 else
4430 Std->render(Args, CmdArgs);
4431
Nico Weber00721502014-12-23 22:32:37 +00004432 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004433 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004434 options::OPT_ftrigraphs,
4435 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004436 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004437 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004438 } else {
4439 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004440 //
4441 // FIXME: Clang doesn't correctly handle -std= when the input language
4442 // doesn't match. For the time being just ignore this for C++ inputs;
4443 // eventually we want to do all the standard defaulting here instead of
4444 // splitting it between the driver and clang -cc1.
4445 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004446 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4447 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004448 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004449 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004450
Nico Weber00721502014-12-23 22:32:37 +00004451 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4452 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004453 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004454
Richard Smith282b4492013-09-04 22:50:31 +00004455 // GCC's behavior for -Wwrite-strings is a bit strange:
4456 // * In C, this "warning flag" changes the types of string literals from
4457 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4458 // for the discarded qualifier.
4459 // * In C++, this is just a normal warning flag.
4460 //
4461 // Implementing this warning correctly in C is hard, so we follow GCC's
4462 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4463 // a non-const char* in C, rather than using this crude hack.
4464 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004465 // FIXME: This should behave just like a warning flag, and thus should also
4466 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4467 Arg *WriteStrings =
4468 Args.getLastArg(options::OPT_Wwrite_strings,
4469 options::OPT_Wno_write_strings, options::OPT_w);
4470 if (WriteStrings &&
4471 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004472 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004473 }
4474
Chandler Carruth61fbf622011-04-23 09:27:53 +00004475 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004476 // during C++ compilation, which it is by default. GCC keeps this define even
4477 // in the presence of '-w', match this behavior bug-for-bug.
4478 if (types::isCXX(InputType) &&
4479 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4480 true)) {
4481 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004482 }
4483
Chandler Carruthe0391482010-05-22 02:21:53 +00004484 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4485 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4486 if (Asm->getOption().matches(options::OPT_fasm))
4487 CmdArgs.push_back("-fgnu-keywords");
4488 else
4489 CmdArgs.push_back("-fno-gnu-keywords");
4490 }
4491
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004492 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4493 CmdArgs.push_back("-fno-dwarf-directory-asm");
4494
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004495 if (ShouldDisableAutolink(Args, getToolChain()))
4496 CmdArgs.push_back("-fno-autolink");
4497
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004498 // Add in -fdebug-compilation-dir if necessary.
4499 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004500
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004501 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4502 StringRef Map = A->getValue();
4503 if (Map.find('=') == StringRef::npos)
4504 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4505 else
4506 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4507 A->claim();
4508 }
4509
Richard Smith9a568822011-11-21 19:36:32 +00004510 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4511 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004512 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004513 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004514 }
4515
Richard Smith79c927b2013-11-06 19:31:51 +00004516 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4517 CmdArgs.push_back("-foperator-arrow-depth");
4518 CmdArgs.push_back(A->getValue());
4519 }
4520
Richard Smith9a568822011-11-21 19:36:32 +00004521 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4522 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004523 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004524 }
4525
Richard Smitha3d3bd22013-05-08 02:12:03 +00004526 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4527 CmdArgs.push_back("-fconstexpr-steps");
4528 CmdArgs.push_back(A->getValue());
4529 }
4530
Richard Smithb3a14522013-02-22 01:59:51 +00004531 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4532 CmdArgs.push_back("-fbracket-depth");
4533 CmdArgs.push_back(A->getValue());
4534 }
4535
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004536 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4537 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004538 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004539 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004540 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4541 } else
4542 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004543 }
4544
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004545 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004546 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004547
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004548 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4549 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004550 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004551 }
David Chisnall5778fce2009-08-31 16:41:57 +00004552
Chris Lattnere23003d2010-01-09 21:54:33 +00004553 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4554 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004555 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004556 }
4557
Chris Lattnerb35583d2010-04-07 20:49:23 +00004558 CmdArgs.push_back("-ferror-limit");
4559 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004560 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004561 else
4562 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004563
Chandler Carrutha77a7272010-05-06 04:55:18 +00004564 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4565 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004566 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004567 }
4568
4569 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4570 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004571 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004572 }
4573
Richard Smithf6f003a2011-12-16 19:06:07 +00004574 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4575 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004576 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004577 }
4578
Nick Lewycky24653262014-12-16 21:39:02 +00004579 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4580 CmdArgs.push_back("-fspell-checking-limit");
4581 CmdArgs.push_back(A->getValue());
4582 }
4583
Daniel Dunbar2c978472009-11-04 06:24:47 +00004584 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004585 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004586 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004587 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004588 } else {
4589 // If -fmessage-length=N was not specified, determine whether this is a
4590 // terminal and, if so, implicitly define -fmessage-length appropriately.
4591 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004592 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004593 }
4594
John McCallb4a99d32013-02-19 01:57:35 +00004595 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4596 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4597 options::OPT_fvisibility_ms_compat)) {
4598 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4599 CmdArgs.push_back("-fvisibility");
4600 CmdArgs.push_back(A->getValue());
4601 } else {
4602 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4603 CmdArgs.push_back("-fvisibility");
4604 CmdArgs.push_back("hidden");
4605 CmdArgs.push_back("-ftype-visibility");
4606 CmdArgs.push_back("default");
4607 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004608 }
4609
Douglas Gregor08329632010-06-15 17:05:35 +00004610 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004611
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004612 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4613
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004614 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004615 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4616 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004617 CmdArgs.push_back("-ffreestanding");
4618
Daniel Dunbare357d562009-12-03 18:42:11 +00004619 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004620 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004621 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004622 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004623 // Emulated TLS is enabled by default on Android, and can be enabled manually
4624 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004625 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004626 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4627 EmulatedTLSDefault))
4628 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004629 // AltiVec-like language extensions aren't relevant for assembling.
4630 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004631 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004632 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4633 }
Richard Trieu91844232012-06-26 18:18:47 +00004634 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4635 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004636
Alexey Bataevdb390212015-05-20 04:24:19 +00004637 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004638 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4639 options::OPT_fno_openmp, false))
4640 switch (getOpenMPRuntime(getToolChain(), Args)) {
4641 case OMPRT_OMP:
4642 case OMPRT_IOMP5:
4643 // Clang can generate useful OpenMP code for these two runtime libraries.
4644 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004645
4646 // If no option regarding the use of TLS in OpenMP codegeneration is
4647 // given, decide a default based on the target. Otherwise rely on the
4648 // options and pass the right information to the frontend.
4649 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004650 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004651 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004652 break;
4653 default:
4654 // By default, if Clang doesn't know how to generate useful OpenMP code
4655 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4656 // down to the actual compilation.
4657 // FIXME: It would be better to have a mode which *only* omits IR
4658 // generation based on the OpenMP support so that we get consistent
4659 // semantic analysis, etc.
4660 break;
4661 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004662
Peter Collingbourne32701642013-11-01 18:16:25 +00004663 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004664 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004665
Eric Christopher459d2712013-02-19 06:16:53 +00004666 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004667 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4668 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4669 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4670 Arch == llvm::Triple::ppc64le))
4671 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4672 << "ppc/ppc64/ppc64le";
4673 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004674
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004675 // -fzvector is incompatible with -faltivec.
4676 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4677 if (Args.hasArg(options::OPT_faltivec))
4678 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4679 << "-faltivec";
4680
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004681 if (getToolChain().SupportsProfiling())
4682 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004683
4684 // -flax-vector-conversions is default.
4685 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4686 options::OPT_fno_lax_vector_conversions))
4687 CmdArgs.push_back("-fno-lax-vector-conversions");
4688
John Brawna7b4ec02015-08-10 11:11:28 +00004689 if (Args.getLastArg(options::OPT_fapple_kext) ||
4690 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004691 CmdArgs.push_back("-fapple-kext");
4692
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004693 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004694 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004695 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004696 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4697 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004698
4699 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4700 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004701 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004702 }
4703
Bob Wilson14adb362012-02-03 06:27:22 +00004704 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004705
Chandler Carruth6e501032011-03-27 00:04:55 +00004706 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4707 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004708 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004709 if (A->getOption().matches(options::OPT_fwrapv))
4710 CmdArgs.push_back("-fwrapv");
4711 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4712 options::OPT_fno_strict_overflow)) {
4713 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4714 CmdArgs.push_back("-fwrapv");
4715 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004716
4717 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4718 options::OPT_fno_reroll_loops))
4719 if (A->getOption().matches(options::OPT_freroll_loops))
4720 CmdArgs.push_back("-freroll-loops");
4721
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004722 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004723 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4724 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004725
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004726 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4727
Daniel Dunbar4930e332009-11-17 08:07:36 +00004728 // -stack-protector=0 is default.
4729 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004730 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4731 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4732 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4733 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4734 Args.ClaimAllArgs(options::OPT_fstack_protector);
4735 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004736 options::OPT_fstack_protector_all,
4737 options::OPT_fstack_protector_strong,
4738 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004739 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004740 StackProtectorLevel = std::max<unsigned>(
4741 LangOptions::SSPOn,
4742 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004743 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004744 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004745 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004746 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004747 } else {
4748 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004749 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004750 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004751 if (StackProtectorLevel) {
4752 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004753 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004754 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004755
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004756 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004757 for (const Arg *A : Args.filtered(options::OPT__param)) {
4758 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004759 if (Str.startswith("ssp-buffer-size=")) {
4760 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004761 CmdArgs.push_back("-stack-protector-buffer-size");
4762 // FIXME: Verify the argument is a valid integer.
4763 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004764 }
Sean Silva14facf32015-06-09 01:57:17 +00004765 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004766 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004767 }
4768
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004769 // Translate -mstackrealign
4770 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004771 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004772 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004773
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004774 if (Args.hasArg(options::OPT_mstack_alignment)) {
4775 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4776 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004777 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004778
Hans Wennborg77dc2362015-01-20 19:45:50 +00004779 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4780 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4781
4782 if (!Size.empty())
4783 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4784 else
4785 CmdArgs.push_back("-mstack-probe-size=0");
4786 }
4787
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004788 switch (getToolChain().getArch()) {
4789 case llvm::Triple::aarch64:
4790 case llvm::Triple::aarch64_be:
4791 case llvm::Triple::arm:
4792 case llvm::Triple::armeb:
4793 case llvm::Triple::thumb:
4794 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004795 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004796 break;
4797
4798 default:
4799 break;
4800 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004801
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004802 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4803 options::OPT_mno_restrict_it)) {
4804 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4805 CmdArgs.push_back("-backend-option");
4806 CmdArgs.push_back("-arm-restrict-it");
4807 } else {
4808 CmdArgs.push_back("-backend-option");
4809 CmdArgs.push_back("-arm-no-restrict-it");
4810 }
James Y Knight2db38f32015-08-15 03:45:25 +00004811 } else if (Triple.isOSWindows() &&
4812 (Triple.getArch() == llvm::Triple::arm ||
4813 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004814 // Windows on ARM expects restricted IT blocks
4815 CmdArgs.push_back("-backend-option");
4816 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004817 }
4818
Daniel Dunbard18049a2009-04-07 21:16:11 +00004819 // Forward -f options with positive and negative forms; we translate
4820 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004821 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4822 StringRef fname = A->getValue();
4823 if (!llvm::sys::fs::exists(fname))
4824 D.Diag(diag::err_drv_no_such_file) << fname;
4825 else
4826 A->render(Args, CmdArgs);
4827 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004828
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004829 // -fbuiltin is default unless -mkernel is used.
4830 bool UseBuiltins =
4831 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4832 !Args.hasArg(options::OPT_mkernel));
4833 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004834 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004835
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004836 // -ffreestanding implies -fno-builtin.
4837 if (Args.hasArg(options::OPT_ffreestanding))
4838 UseBuiltins = false;
4839
4840 // Process the -fno-builtin-* options.
4841 for (const auto &Arg : Args) {
4842 const Option &O = Arg->getOption();
4843 if (!O.matches(options::OPT_fno_builtin_))
4844 continue;
4845
4846 Arg->claim();
4847 // If -fno-builtin is specified, then there's no need to pass the option to
4848 // the frontend.
4849 if (!UseBuiltins)
4850 continue;
4851
4852 StringRef FuncName = Arg->getValue();
4853 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4854 }
4855
Nuno Lopes13c88c72009-12-16 16:59:22 +00004856 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4857 options::OPT_fno_assume_sane_operator_new))
4858 CmdArgs.push_back("-fno-assume-sane-operator-new");
4859
Daniel Dunbar4930e332009-11-17 08:07:36 +00004860 // -fblocks=0 is default.
4861 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004862 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004863 (Args.hasArg(options::OPT_fgnu_runtime) &&
4864 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4865 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004866 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004868 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004869 !getToolChain().hasBlocksRuntime())
4870 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004871 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004872
Richard Smith47972af2015-06-16 00:08:24 +00004873 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004874 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004875 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004876 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004877 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004878 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4879 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004880 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004881 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004882 HaveModules = true;
4883 }
4884 }
4885
Richard Smith47972af2015-06-16 00:08:24 +00004886 // -fmodule-maps enables implicit reading of module map files. By default,
4887 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004888 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4889 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004890 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004891 }
4892
Daniel Jasperac42b752013-10-21 06:34:34 +00004893 // -fmodules-decluse checks that modules used are declared so (off by
4894 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004895 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004896 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004897 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004898 }
4899
Daniel Jasper962b38e2014-04-11 11:47:45 +00004900 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4901 // all #included headers are part of modules.
4902 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004904 CmdArgs.push_back("-fmodules-strict-decluse");
4905 }
4906
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004907 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4908 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4909 options::OPT_fno_implicit_modules)) {
4910 CmdArgs.push_back("-fno-implicit-modules");
4911 }
4912
Daniel Jasperac42b752013-10-21 06:34:34 +00004913 // -fmodule-name specifies the module that is currently being built (or
4914 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004915 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004916
Richard Smith9887d792014-10-17 01:42:53 +00004917 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004918 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004919 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004920
Richard Smithe842a472014-10-22 02:05:46 +00004921 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004922 if (HaveModules)
4923 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4924 else
4925 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004926
4927 // -fmodule-cache-path specifies where our implicitly-built module files
4928 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004929 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004930 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004931 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004932 if (HaveModules) {
4933 if (C.isForDiagnostics()) {
4934 // When generating crash reports, we want to emit the modules along with
4935 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004936 Path = Output.getFilename();
4937 llvm::sys::path::replace_extension(Path, ".cache");
4938 llvm::sys::path::append(Path, "modules");
4939 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004940 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004941 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004942 llvm::sys::path::append(Path, "org.llvm.clang.");
4943 appendUserToPath(Path);
4944 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004945 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004946 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004947 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4948 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004949 }
4950
4951 // When building modules and generating crashdumps, we need to dump a module
4952 // dependency VFS alongside the output.
4953 if (HaveModules && C.isForDiagnostics()) {
4954 SmallString<128> VFSDir(Output.getFilename());
4955 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004956 // Add the cache directory as a temp so the crash diagnostics pick it up.
4957 C.addTempFile(Args.MakeArgString(VFSDir));
4958
Justin Bognera88f0122014-06-20 22:59:50 +00004959 llvm::sys::path::append(VFSDir, "vfs");
4960 CmdArgs.push_back("-module-dependency-dir");
4961 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004962 }
4963
Richard Smith9887d792014-10-17 01:42:53 +00004964 if (HaveModules)
4965 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004966
Douglas Gregor35b04d62013-02-07 19:01:24 +00004967 // Pass through all -fmodules-ignore-macro arguments.
4968 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004969 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4970 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004971
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004972 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4973
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004974 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4975 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4976 D.Diag(diag::err_drv_argument_not_allowed_with)
4977 << A->getAsString(Args) << "-fbuild-session-timestamp";
4978
4979 llvm::sys::fs::file_status Status;
4980 if (llvm::sys::fs::status(A->getValue(), Status))
4981 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004982 CmdArgs.push_back(Args.MakeArgString(
4983 "-fbuild-session-timestamp=" +
4984 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004985 }
4986
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004987 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004988 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4989 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004990 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4991
4992 Args.AddLastArg(CmdArgs,
4993 options::OPT_fmodules_validate_once_per_build_session);
4994 }
4995
Ben Langmuirdcf73862014-03-12 00:06:17 +00004996 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4997
John McCalldfea9982010-04-09 19:12:06 +00004998 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004999 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005000 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005001 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005002
Anders Carlssond470fef2010-11-21 00:09:52 +00005003 // -felide-constructors is the default.
5004 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005005 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005006 CmdArgs.push_back("-fno-elide-constructors");
5007
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005008 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005009
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005010 if (KernelOrKext || (types::isCXX(InputType) &&
5011 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5012 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005013 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005014
Tony Linthicum76329bf2011-12-12 21:14:55 +00005015 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005016 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5017 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005018 CmdArgs.push_back("-fshort-enums");
5019
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005020 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005021 if (Arg *A = Args.getLastArg(
5022 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5023 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5024 if (A->getOption().matches(options::OPT_funsigned_char) ||
5025 A->getOption().matches(options::OPT_fno_signed_char)) {
5026 CmdArgs.push_back("-fno-signed-char");
5027 }
5028 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005029 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005030 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005031
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005032 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005033 if (!Args.hasFlag(
5034 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5035 !IsWindowsCygnus && !IsWindowsGNU &&
5036 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5037 getToolChain().getArch() != llvm::Triple::hexagon &&
5038 getToolChain().getArch() != llvm::Triple::xcore &&
5039 ((getToolChain().getTriple().getVendor() !=
5040 llvm::Triple::MipsTechnologies) ||
5041 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005042 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005043 CmdArgs.push_back("-fno-use-cxa-atexit");
5044
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005045 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005046 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005047 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005048 CmdArgs.push_back("-fms-extensions");
5049
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005050 // -fno-use-line-directives is default.
5051 if (Args.hasFlag(options::OPT_fuse_line_directives,
5052 options::OPT_fno_use_line_directives, false))
5053 CmdArgs.push_back("-fuse-line-directives");
5054
Francois Pichet1b4f1632011-09-17 04:32:15 +00005055 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005056 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005057 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005058 (IsWindowsMSVC &&
5059 Args.hasFlag(options::OPT_fms_extensions,
5060 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005061 CmdArgs.push_back("-fms-compatibility");
5062
David Majnemerc371ff02015-03-22 08:39:22 +00005063 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005064 VersionTuple MSVT = visualstudio::getMSVCVersion(
5065 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5066 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005067 CmdArgs.push_back(
5068 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005069
David Majnemer8db91762015-05-18 04:49:30 +00005070 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5071 if (ImplyVCPPCXXVer) {
5072 if (IsMSVC2015Compatible)
5073 CmdArgs.push_back("-std=c++14");
5074 else
5075 CmdArgs.push_back("-std=c++11");
5076 }
5077
Eric Christopher5ecce122013-02-18 00:38:31 +00005078 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005079 if (Args.hasFlag(options::OPT_fborland_extensions,
5080 options::OPT_fno_borland_extensions, false))
5081 CmdArgs.push_back("-fborland-extensions");
5082
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005083 // -fno-declspec is default, except for PS4.
5084 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5085 getToolChain().getTriple().isPS4()))
5086 CmdArgs.push_back("-fdeclspec");
5087 else if (Args.hasArg(options::OPT_fno_declspec))
5088 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5089
David Majnemerc371ff02015-03-22 08:39:22 +00005090 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5091 // than 19.
5092 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5093 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005094 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005095 CmdArgs.push_back("-fno-threadsafe-statics");
5096
Francois Pichet02744872011-09-01 16:38:08 +00005097 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5098 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005099 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005100 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005101 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005102
Chandler Carruthe03aa552010-04-17 20:17:31 +00005103 // -fgnu-keywords default varies depending on language; only pass if
5104 // specified.
5105 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005106 options::OPT_fno_gnu_keywords))
5107 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005108
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005109 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005110 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005111 CmdArgs.push_back("-fgnu89-inline");
5112
Chad Rosier9c76d242012-03-15 22:31:42 +00005113 if (Args.hasArg(options::OPT_fno_inline))
5114 CmdArgs.push_back("-fno-inline");
5115
Chad Rosier64d6be92012-03-06 21:17:19 +00005116 if (Args.hasArg(options::OPT_fno_inline_functions))
5117 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005118
John McCall5fb5df92012-06-20 06:18:46 +00005119 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005120
John McCall5fb5df92012-06-20 06:18:46 +00005121 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005122 // legacy is the default. Except for deployment taget of 10.5,
5123 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5124 // gets ignored silently.
5125 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005126 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5127 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005128 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005129 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005130 if (getToolChain().UseObjCMixedDispatch())
5131 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5132 else
5133 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5134 }
5135 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005136
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005137 // When ObjectiveC legacy runtime is in effect on MacOSX,
5138 // turn on the option to do Array/Dictionary subscripting
5139 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005140 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005141 getToolChain().getTriple().isMacOSX() &&
5142 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5143 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005144 objcRuntime.isNeXTFamily())
5145 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005146
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005147 // -fencode-extended-block-signature=1 is default.
5148 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5149 CmdArgs.push_back("-fencode-extended-block-signature");
5150 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005151
John McCall24fc0de2011-07-06 00:26:06 +00005152 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5153 // NOTE: This logic is duplicated in ToolChains.cpp.
5154 bool ARC = isObjCAutoRefCount(Args);
5155 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005156 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005157
John McCall24fc0de2011-07-06 00:26:06 +00005158 CmdArgs.push_back("-fobjc-arc");
5159
Chandler Carruth491db322011-11-04 07:34:47 +00005160 // FIXME: It seems like this entire block, and several around it should be
5161 // wrapped in isObjC, but for now we just use it here as this is where it
5162 // was being used previously.
5163 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5164 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5165 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5166 else
5167 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5168 }
5169
John McCall24fc0de2011-07-06 00:26:06 +00005170 // Allow the user to enable full exceptions code emission.
5171 // We define off for Objective-CC, on for Objective-C++.
5172 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5173 options::OPT_fno_objc_arc_exceptions,
5174 /*default*/ types::isCXX(InputType)))
5175 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005176
John McCall24fc0de2011-07-06 00:26:06 +00005177 }
5178
5179 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5180 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005181 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005182 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005183
John McCall24fc0de2011-07-06 00:26:06 +00005184 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5185 // takes precedence.
5186 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5187 if (!GCArg)
5188 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5189 if (GCArg) {
5190 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005191 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005192 } else if (getToolChain().SupportsObjCGC()) {
5193 GCArg->render(Args, CmdArgs);
5194 } else {
5195 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005196 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005197 }
5198 }
5199
John McCallfbe5ed72015-11-05 19:19:56 +00005200 // Pass down -fobjc-weak or -fno-objc-weak if present.
5201 if (types::isObjC(InputType)) {
5202 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5203 options::OPT_fno_objc_weak);
5204 if (!WeakArg) {
5205 // nothing to do
5206 } else if (GCArg) {
5207 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5208 D.Diag(diag::err_objc_weak_with_gc);
5209 } else if (!objcRuntime.allowsWeak()) {
5210 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5211 D.Diag(diag::err_objc_weak_unsupported);
5212 } else {
5213 WeakArg->render(Args, CmdArgs);
5214 }
5215 }
5216
Bob Wilsonb111ec92015-03-02 19:01:14 +00005217 if (Args.hasFlag(options::OPT_fapplication_extension,
5218 options::OPT_fno_application_extension, false))
5219 CmdArgs.push_back("-fapplication-extension");
5220
Reid Klecknerc542d372014-06-27 17:02:02 +00005221 // Handle GCC-style exception args.
5222 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005223 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5224 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005225
Tim Northovere931f9f2015-10-30 16:30:41 +00005226 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005227 CmdArgs.push_back("-fsjlj-exceptions");
5228
5229 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005230 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5231 options::OPT_fno_assume_sane_operator_new))
5232 CmdArgs.push_back("-fno-assume-sane-operator-new");
5233
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005234 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5235 // most platforms.
5236 if (Args.hasFlag(options::OPT_fsized_deallocation,
5237 options::OPT_fno_sized_deallocation, false))
5238 CmdArgs.push_back("-fsized-deallocation");
5239
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005240 // -fconstant-cfstrings is default, and may be subject to argument translation
5241 // on Darwin.
5242 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5243 options::OPT_fno_constant_cfstrings) ||
5244 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5245 options::OPT_mno_constant_cfstrings))
5246 CmdArgs.push_back("-fno-constant-cfstrings");
5247
John Thompsoned4e2952009-11-05 20:14:16 +00005248 // -fshort-wchar default varies depending on platform; only
5249 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005250 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5251 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005252 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005253
Hans Wennborg28c96312013-07-31 23:39:13 +00005254 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005255 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005256 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005257 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005258
Daniel Dunbar096ed292011-10-05 21:04:55 +00005259 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5260 // -fno-pack-struct doesn't apply to -fpack-struct=.
5261 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005262 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005263 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005264 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005265 } else if (Args.hasFlag(options::OPT_fpack_struct,
5266 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005267 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005268 }
5269
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005270 // Handle -fmax-type-align=N and -fno-type-align
5271 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5272 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5273 if (!SkipMaxTypeAlign) {
5274 std::string MaxTypeAlignStr = "-fmax-type-align=";
5275 MaxTypeAlignStr += A->getValue();
5276 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5277 }
5278 } else if (getToolChain().getTriple().isOSDarwin()) {
5279 if (!SkipMaxTypeAlign) {
5280 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5281 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5282 }
5283 }
5284
John Brawna7b4ec02015-08-10 11:11:28 +00005285 // -fcommon is the default unless compiling kernel code or the target says so
5286 bool NoCommonDefault =
5287 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5288 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5289 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005290 CmdArgs.push_back("-fno-common");
5291
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005292 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005293 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005294 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005295 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005296 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005298
Daniel Dunbar6358d682010-10-15 22:30:42 +00005299 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005300 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005301 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005303
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005304 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005305 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5306 StringRef value = inputCharset->getValue();
5307 if (value != "UTF-8")
5308 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5309 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005310 }
5311
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005312 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005313 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5314 StringRef value = execCharset->getValue();
5315 if (value != "UTF-8")
5316 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5317 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005318 }
5319
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005320 // -fcaret-diagnostics is default.
5321 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5322 options::OPT_fno_caret_diagnostics, true))
5323 CmdArgs.push_back("-fno-caret-diagnostics");
5324
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005325 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005326 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005327 options::OPT_fno_diagnostics_fixit_info))
5328 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005329
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005330 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005331 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005332 options::OPT_fno_diagnostics_show_option))
5333 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005334
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005335 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005336 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005337 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005338 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005339 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005340
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005341 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005342 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005343 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005344 }
5345
Chandler Carruthb6766f02011-03-27 01:50:55 +00005346 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 options::OPT_fdiagnostics_show_note_include_stack,
5348 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005349 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005350 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005351 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5352 else
5353 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5354 }
5355
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005356 // Color diagnostics are the default, unless the terminal doesn't support
5357 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005358 // Support both clang's -f[no-]color-diagnostics and gcc's
5359 // -f[no-]diagnostics-colors[=never|always|auto].
5360 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005361 for (const auto &Arg : Args) {
5362 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005363 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5364 !O.matches(options::OPT_fdiagnostics_color) &&
5365 !O.matches(options::OPT_fno_color_diagnostics) &&
5366 !O.matches(options::OPT_fno_diagnostics_color) &&
5367 !O.matches(options::OPT_fdiagnostics_color_EQ))
5368 continue;
5369
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005370 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005371 if (O.matches(options::OPT_fcolor_diagnostics) ||
5372 O.matches(options::OPT_fdiagnostics_color)) {
5373 ShowColors = Colors_On;
5374 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5375 O.matches(options::OPT_fno_diagnostics_color)) {
5376 ShowColors = Colors_Off;
5377 } else {
5378 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005379 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005380 if (value == "always")
5381 ShowColors = Colors_On;
5382 else if (value == "never")
5383 ShowColors = Colors_Off;
5384 else if (value == "auto")
5385 ShowColors = Colors_Auto;
5386 else
5387 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005388 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005389 }
5390 }
5391 if (ShowColors == Colors_On ||
5392 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005393 CmdArgs.push_back("-fcolor-diagnostics");
5394
Nico Rieck7857d462013-09-11 00:38:02 +00005395 if (Args.hasArg(options::OPT_fansi_escape_codes))
5396 CmdArgs.push_back("-fansi-escape-codes");
5397
Daniel Dunbardb097022009-06-08 21:13:54 +00005398 if (!Args.hasFlag(options::OPT_fshow_source_location,
5399 options::OPT_fno_show_source_location))
5400 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005401
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005402 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005403 true))
5404 CmdArgs.push_back("-fno-show-column");
5405
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005406 if (!Args.hasFlag(options::OPT_fspell_checking,
5407 options::OPT_fno_spell_checking))
5408 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005409
Chad Rosierc8e56e82012-12-05 21:08:21 +00005410 // -fno-asm-blocks is default.
5411 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5412 false))
5413 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005414
Steven Wucb0d13f2015-01-16 23:05:28 +00005415 // -fgnu-inline-asm is default.
5416 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5417 options::OPT_fno_gnu_inline_asm, true))
5418 CmdArgs.push_back("-fno-gnu-inline-asm");
5419
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005420 // Enable vectorization per default according to the optimization level
5421 // selected. For optimization levels that want vectorization we use the alias
5422 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005423 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005424 OptSpecifier VectorizeAliasOption =
5425 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005426 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005427 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005428 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005429
Chad Rosier136d67d2014-04-28 19:30:57 +00005430 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005431 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005432 OptSpecifier SLPVectAliasOption =
5433 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005434 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005435 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005436 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005437
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005438 // -fno-slp-vectorize-aggressive is default.
5439 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005440 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005441 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005442
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005443 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5444 A->render(Args, CmdArgs);
5445
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005446 // -fdollars-in-identifiers default varies depending on platform and
5447 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005448 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005449 options::OPT_fno_dollars_in_identifiers)) {
5450 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005451 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005452 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005453 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005454 }
5455
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005456 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5457 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005458 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005459 options::OPT_fno_unit_at_a_time)) {
5460 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005461 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005462 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005463
Eli Friedman055c9702011-11-02 01:53:16 +00005464 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5465 options::OPT_fno_apple_pragma_pack, false))
5466 CmdArgs.push_back("-fapple-pragma-pack");
5467
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005468 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005469 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5470 // by default.
5471 if (getToolChain().getArch() == llvm::Triple::le32) {
5472 CmdArgs.push_back("-fno-math-builtin");
5473 }
5474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005475// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5476//
5477// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005478#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005479 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005480 (getToolChain().getArch() == llvm::Triple::arm ||
5481 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005482 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5483 CmdArgs.push_back("-fno-builtin-strcat");
5484 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5485 CmdArgs.push_back("-fno-builtin-strcpy");
5486 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005487#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005488
Justin Bognera88f0122014-06-20 22:59:50 +00005489 // Enable rewrite includes if the user's asked for it or if we're generating
5490 // diagnostics.
5491 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5492 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005493 if (Args.hasFlag(options::OPT_frewrite_includes,
5494 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005495 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005496 CmdArgs.push_back("-frewrite-includes");
5497
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005498 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005499 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005500 options::OPT_traditional_cpp)) {
5501 if (isa<PreprocessJobAction>(JA))
5502 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005503 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005504 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005505 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005506
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005507 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005508 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005509
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005510 // Handle serialized diagnostics.
5511 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5512 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005513 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005514 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005515
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005516 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5517 CmdArgs.push_back("-fretain-comments-from-system-headers");
5518
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005519 // Forward -fcomment-block-commands to -cc1.
5520 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005521 // Forward -fparse-all-comments to -cc1.
5522 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005523
John Brawnad31ace2015-09-23 13:55:40 +00005524 // Turn -fplugin=name.so into -load name.so
5525 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5526 CmdArgs.push_back("-load");
5527 CmdArgs.push_back(A->getValue());
5528 A->claim();
5529 }
5530
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005531 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5532 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005533 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005534 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5535 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005536
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005537 // We translate this by hand to the -cc1 argument, since nightly test uses
5538 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005539 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005540 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005541 } else
Sean Silva14facf32015-06-09 01:57:17 +00005542 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005543 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005544
Bob Wilson23a55f12014-12-21 07:00:00 +00005545 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005546 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5547 // by the frontend.
5548 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5549 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005550
Daniel Dunbard67a3222009-03-30 06:36:42 +00005551 if (Output.getType() == types::TY_Dependencies) {
5552 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005553 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005554 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005555 CmdArgs.push_back(Output.getFilename());
5556 } else {
5557 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005558 }
5559
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005560 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005561
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005562 if (Input.isFilename())
5563 CmdArgs.push_back(Input.getFilename());
5564 else
5565 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005566
Chris Lattnere9d7d782009-11-03 19:50:27 +00005567 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5568
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005569 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005570
5571 // Optionally embed the -cc1 level arguments into the debug info, for build
5572 // analysis.
5573 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005574 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005575 for (const auto &Arg : Args)
5576 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005577
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005578 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005579 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005580 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005581 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005582 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005583 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005584 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005585 }
5586 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005587 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005588 }
5589
Eric Christopherd3804002013-02-22 20:12:52 +00005590 // Add the split debug info name to the command lines here so we
5591 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005592 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5594 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005595 const char *SplitDwarfOut;
5596 if (SplitDwarf) {
5597 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005598 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005599 CmdArgs.push_back(SplitDwarfOut);
5600 }
5601
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005602 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5603 // Include them with -fcuda-include-gpubinary.
5604 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005605 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005606 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005607 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005608 }
5609
Eric Christopherd3804002013-02-22 20:12:52 +00005610 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005611 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005612 Output.getType() == types::TY_Object &&
5613 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005614 auto CLCommand =
5615 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005616 C.addCommand(llvm::make_unique<FallbackCommand>(
5617 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005618 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005619 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005620 }
5621
Eric Christopherf1545832013-02-22 23:50:16 +00005622 // Handle the debug info splitting at object creation time if we're
5623 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005624 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005625 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005626 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005627
Roman Divacky178e01602011-02-10 16:52:03 +00005628 if (Arg *A = Args.getLastArg(options::OPT_pg))
5629 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005630 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5631 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005632
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005633 // Claim some arguments which clang supports automatically.
5634
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005635 // -fpch-preprocess is used with gcc to add a special marker in the output to
5636 // include the PCH file. Clang's PTH solution is completely transparent, so we
5637 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005638 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005639
Daniel Dunbar17731772009-03-23 19:03:36 +00005640 // Claim some arguments which clang doesn't support, but we don't
5641 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005642 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5643 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005644
Rafael Espindolab0092d72013-09-04 19:37:35 +00005645 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005646 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005647}
5648
John McCall5fb5df92012-06-20 06:18:46 +00005649/// Add options related to the Objective-C runtime/ABI.
5650///
5651/// Returns true if the runtime is non-fragile.
5652ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5653 ArgStringList &cmdArgs,
5654 RewriteKind rewriteKind) const {
5655 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005656 Arg *runtimeArg =
5657 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5658 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005659
5660 // Just forward -fobjc-runtime= to the frontend. This supercedes
5661 // options about fragility.
5662 if (runtimeArg &&
5663 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5664 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005665 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005666 if (runtime.tryParse(value)) {
5667 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005668 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005669 }
5670
5671 runtimeArg->render(args, cmdArgs);
5672 return runtime;
5673 }
5674
5675 // Otherwise, we'll need the ABI "version". Version numbers are
5676 // slightly confusing for historical reasons:
5677 // 1 - Traditional "fragile" ABI
5678 // 2 - Non-fragile ABI, version 1
5679 // 3 - Non-fragile ABI, version 2
5680 unsigned objcABIVersion = 1;
5681 // If -fobjc-abi-version= is present, use that to set the version.
5682 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005683 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005684 if (value == "1")
5685 objcABIVersion = 1;
5686 else if (value == "2")
5687 objcABIVersion = 2;
5688 else if (value == "3")
5689 objcABIVersion = 3;
5690 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005691 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005692 } else {
5693 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005694 bool nonFragileABIIsDefault =
5695 (rewriteKind == RK_NonFragile ||
5696 (rewriteKind == RK_None &&
5697 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005698 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5699 options::OPT_fno_objc_nonfragile_abi,
5700 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005701// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005702#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5703 unsigned nonFragileABIVersion = 1;
5704#else
5705 unsigned nonFragileABIVersion = 2;
5706#endif
5707
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005708 if (Arg *abiArg =
5709 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005710 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005711 if (value == "1")
5712 nonFragileABIVersion = 1;
5713 else if (value == "2")
5714 nonFragileABIVersion = 2;
5715 else
5716 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005717 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005718 }
5719
5720 objcABIVersion = 1 + nonFragileABIVersion;
5721 } else {
5722 objcABIVersion = 1;
5723 }
5724 }
5725
5726 // We don't actually care about the ABI version other than whether
5727 // it's non-fragile.
5728 bool isNonFragile = objcABIVersion != 1;
5729
5730 // If we have no runtime argument, ask the toolchain for its default runtime.
5731 // However, the rewriter only really supports the Mac runtime, so assume that.
5732 ObjCRuntime runtime;
5733 if (!runtimeArg) {
5734 switch (rewriteKind) {
5735 case RK_None:
5736 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5737 break;
5738 case RK_Fragile:
5739 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5740 break;
5741 case RK_NonFragile:
5742 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5743 break;
5744 }
5745
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005746 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005747 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5748 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005749 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005750 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005752 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005753 } else {
5754 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5755 }
5756
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005757 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005758 } else {
5759 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005760 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005761 // non-fragile mode or the GCC runtime in fragile mode.
5762 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005763 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005764 else
5765 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005766 }
5767
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005768 cmdArgs.push_back(
5769 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005770 return runtime;
5771}
5772
Reid Klecknerc542d372014-06-27 17:02:02 +00005773static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5774 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5775 I += HaveDash;
5776 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005777}
Reid Klecknerc542d372014-06-27 17:02:02 +00005778
Benjamin Kramere003ca22015-10-28 13:54:16 +00005779namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005780struct EHFlags {
5781 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5782 bool Synch;
5783 bool Asynch;
5784 bool NoExceptC;
5785};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005786} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005787
5788/// /EH controls whether to run destructor cleanups when exceptions are
5789/// thrown. There are three modifiers:
5790/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5791/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5792/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5793/// - c: Assume that extern "C" functions are implicitly noexcept. This
5794/// modifier is an optimization, so we ignore it for now.
5795/// The default is /EHs-c-, meaning cleanups are disabled.
5796static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5797 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005798
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005799 std::vector<std::string> EHArgs =
5800 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005801 for (auto EHVal : EHArgs) {
5802 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5803 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005804 case 'a':
5805 EH.Asynch = maybeConsumeDash(EHVal, I);
5806 continue;
5807 case 'c':
5808 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5809 continue;
5810 case 's':
5811 EH.Synch = maybeConsumeDash(EHVal, I);
5812 continue;
5813 default:
5814 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005815 }
5816 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5817 break;
5818 }
5819 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005820
Reid Klecknerc542d372014-06-27 17:02:02 +00005821 return EH;
5822}
5823
Douglas Katzman3459ce22015-10-08 04:24:12 +00005824void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5825 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5826 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005827 unsigned RTOptionID = options::OPT__SLASH_MT;
5828
Hans Wennborgf1a74252013-09-10 20:18:04 +00005829 if (Args.hasArg(options::OPT__SLASH_LDd))
5830 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5831 // but defining _DEBUG is sticky.
5832 RTOptionID = options::OPT__SLASH_MTd;
5833
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005834 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005835 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005836
David Majnemere2afb472015-07-24 06:49:13 +00005837 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005838 switch (RTOptionID) {
5839 case options::OPT__SLASH_MD:
5840 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005841 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005842 CmdArgs.push_back("-D_MT");
5843 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005844 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005845 break;
5846 case options::OPT__SLASH_MDd:
5847 CmdArgs.push_back("-D_DEBUG");
5848 CmdArgs.push_back("-D_MT");
5849 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005850 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005851 break;
5852 case options::OPT__SLASH_MT:
5853 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005854 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005855 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005856 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005857 break;
5858 case options::OPT__SLASH_MTd:
5859 CmdArgs.push_back("-D_DEBUG");
5860 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005861 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005862 break;
5863 default:
5864 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005865 }
5866
David Majnemere2afb472015-07-24 06:49:13 +00005867 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5868 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5869 } else {
5870 CmdArgs.push_back(FlagForCRT.data());
5871
5872 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5873 // users want. The /Za flag to cl.exe turns this off, but it's not
5874 // implemented in clang.
5875 CmdArgs.push_back("--dependent-lib=oldnames");
5876 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005877
Hans Wennborg8858a032014-07-21 23:42:07 +00005878 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5879 // would produce interleaved output, so ignore /showIncludes in such cases.
5880 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5881 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5882 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005883
David Majnemerf6072342014-07-01 22:24:56 +00005884 // This controls whether or not we emit RTTI data for polymorphic types.
5885 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5886 /*default=*/false))
5887 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005888
Reid Kleckner124955a2015-08-05 18:51:13 +00005889 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005890 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005891 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5892 // If we are emitting CV but not DWARF, don't build information that LLVM
5893 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005894 if (*EmitCodeView && !EmitDwarf)
5895 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5896 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005897 CmdArgs.push_back("-gcodeview");
5898
Reid Klecknerc542d372014-06-27 17:02:02 +00005899 const Driver &D = getToolChain().getDriver();
5900 EHFlags EH = parseClangCLEHFlags(D, Args);
5901 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005902 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005903 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005904 CmdArgs.push_back("-fexceptions");
5905 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005906
Hans Wennborge50cec32014-06-13 20:59:54 +00005907 // /EP should expand to -E -P.
5908 if (Args.hasArg(options::OPT__SLASH_EP)) {
5909 CmdArgs.push_back("-E");
5910 CmdArgs.push_back("-P");
5911 }
5912
David Majnemera5b195a2015-02-14 01:35:12 +00005913 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005914 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5915 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005916 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5917 else
5918 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5919
5920 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5921 VolatileOptionID = A->getOption().getID();
5922
5923 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5924 CmdArgs.push_back("-fms-volatile");
5925
David Majnemer86c318f2014-02-11 21:05:00 +00005926 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5927 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5928 if (MostGeneralArg && BestCaseArg)
5929 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5930 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5931
5932 if (MostGeneralArg) {
5933 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5934 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5935 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5936
5937 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5938 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5939 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5940 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5941 << FirstConflict->getAsString(Args)
5942 << SecondConflict->getAsString(Args);
5943
5944 if (SingleArg)
5945 CmdArgs.push_back("-fms-memptr-rep=single");
5946 else if (MultipleArg)
5947 CmdArgs.push_back("-fms-memptr-rep=multiple");
5948 else
5949 CmdArgs.push_back("-fms-memptr-rep=virtual");
5950 }
5951
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005952 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5953 A->render(Args, CmdArgs);
5954
Hans Wennborg81f74482013-09-10 01:07:07 +00005955 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5956 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005957 if (Args.hasArg(options::OPT__SLASH_fallback))
5958 CmdArgs.push_back("msvc-fallback");
5959 else
5960 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005961 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005962}
5963
Douglas Katzman95354292015-06-23 20:42:09 +00005964visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005965 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005966 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005967 return CLFallback.get();
5968}
5969
Daniel Sanders7f933f42015-01-30 17:35:23 +00005970void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5971 ArgStringList &CmdArgs) const {
5972 StringRef CPUName;
5973 StringRef ABIName;
5974 const llvm::Triple &Triple = getToolChain().getTriple();
5975 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5976
5977 CmdArgs.push_back("-target-abi");
5978 CmdArgs.push_back(ABIName.data());
5979}
5980
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005981void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005982 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005983 const ArgList &Args,
5984 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005985 ArgStringList CmdArgs;
5986
5987 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5988 const InputInfo &Input = Inputs[0];
5989
James Y Knight2db38f32015-08-15 03:45:25 +00005990 std::string TripleStr =
5991 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5992 const llvm::Triple Triple(TripleStr);
5993
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005994 // Don't warn about "clang -w -c foo.s"
5995 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005996 // and "clang -emit-llvm -c foo.s"
5997 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005998
Rafael Espindola577637a2015-01-03 00:06:04 +00005999 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006000
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006001 // Invoke ourselves in -cc1as mode.
6002 //
6003 // FIXME: Implement custom jobs for internal actions.
6004 CmdArgs.push_back("-cc1as");
6005
6006 // Add the "effective" target triple.
6007 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006008 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6009
6010 // Set the output mode, we currently only expect to be used as a real
6011 // assembler.
6012 CmdArgs.push_back("-filetype");
6013 CmdArgs.push_back("obj");
6014
Eric Christopher45f2e712012-12-18 00:31:10 +00006015 // Set the main file name, so that debug info works even with
6016 // -save-temps or preprocessed assembly.
6017 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006018 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006019
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006020 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006021 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006022 if (!CPU.empty()) {
6023 CmdArgs.push_back("-target-cpu");
6024 CmdArgs.push_back(Args.MakeArgString(CPU));
6025 }
6026
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006027 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006028 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006029
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006030 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006031 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006032
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006033 // Pass along any -I options so we get proper .include search paths.
6034 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6035
Eric Christopherfc3ee562012-01-10 00:38:01 +00006036 // Determine the original source input.
6037 const Action *SourceAction = &JA;
6038 while (SourceAction->getKind() != Action::InputClass) {
6039 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6040 SourceAction = SourceAction->getInputs()[0];
6041 }
6042
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006043 // Forward -g and handle debug info related flags, assuming we are dealing
6044 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006045 if (SourceAction->getType() == types::TY_Asm ||
6046 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006047 bool WantDebug = false;
6048 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006049 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006050 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006051 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6052 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006053 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006054 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006055 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006056 if (DwarfVersion == 0)
6057 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006058 RenderDebugEnablingArgs(Args, CmdArgs,
6059 (WantDebug ? CodeGenOptions::LimitedDebugInfo
6060 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006061 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006062
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006063 // Add the -fdebug-compilation-dir flag if needed.
6064 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006065
6066 // Set the AT_producer to the clang version when using the integrated
6067 // assembler on assembly source files.
6068 CmdArgs.push_back("-dwarf-debug-producer");
6069 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006070
6071 // And pass along -I options
6072 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006073 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006074
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006075 // Handle -fPIC et al -- the relocation-model affects the assembler
6076 // for some targets.
6077 llvm::Reloc::Model RelocationModel;
6078 unsigned PICLevel;
6079 bool IsPIE;
6080 std::tie(RelocationModel, PICLevel, IsPIE) =
6081 ParsePICArgs(getToolChain(), Triple, Args);
6082
6083 const char *RMName = RelocationModelName(RelocationModel);
6084 if (RMName) {
6085 CmdArgs.push_back("-mrelocation-model");
6086 CmdArgs.push_back(RMName);
6087 }
6088
Kevin Enderby292dc082011-12-22 19:31:58 +00006089 // Optionally embed the -cc1as level arguments into the debug info, for build
6090 // analysis.
6091 if (getToolChain().UseDwarfDebugFlags()) {
6092 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006093 for (const auto &Arg : Args)
6094 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006095
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006096 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006097 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6098 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006099 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006100 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006101 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006102 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006103 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006104 }
6105 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006106 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006107 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006108
6109 // FIXME: Add -static support, once we have it.
6110
Daniel Sanders7f933f42015-01-30 17:35:23 +00006111 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006112 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006113 default:
6114 break;
6115
6116 case llvm::Triple::mips:
6117 case llvm::Triple::mipsel:
6118 case llvm::Triple::mips64:
6119 case llvm::Triple::mips64el:
6120 AddMIPSTargetArgs(Args, CmdArgs);
6121 break;
6122 }
6123
David Blaikie372d9502014-01-17 03:17:40 +00006124 // Consume all the warning flags. Usually this would be handled more
6125 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6126 // doesn't handle that so rather than warning about unused flags that are
6127 // actually used, we'll lie by omission instead.
6128 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006129 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006130
David Blaikie9260ed62013-07-25 21:19:01 +00006131 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6132 getToolChain().getDriver());
6133
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006134 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006135
6136 assert(Output.isFilename() && "Unexpected lipo output.");
6137 CmdArgs.push_back("-o");
6138 CmdArgs.push_back(Output.getFilename());
6139
Daniel Dunbarb440f562010-08-02 02:38:21 +00006140 assert(Input.isFilename() && "Invalid input.");
6141 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006142
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006143 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006144 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006145
6146 // Handle the debug info splitting at object creation time if we're
6147 // creating an object.
6148 // TODO: Currently only works on linux with newer objcopy.
6149 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006150 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006151 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006152 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006153}
6154
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006155void GnuTool::anchor() {}
6156
Daniel Dunbara3246a02009-03-18 08:07:30 +00006157void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006158 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006159 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006160 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006161 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006162 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006163
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006164 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006165 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006166 // It is unfortunate that we have to claim here, as this means
6167 // we will basically never report anything interesting for
6168 // platforms using a generic gcc, even if we are just using gcc
6169 // to get to the assembler.
6170 A->claim();
6171
Daniel Dunbar939c1212010-08-03 16:14:14 +00006172 // Don't forward any -g arguments to assembly steps.
6173 if (isa<AssembleJobAction>(JA) &&
6174 A->getOption().matches(options::OPT_g_Group))
6175 continue;
6176
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006177 // Don't forward any -W arguments to assembly and link steps.
6178 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6179 A->getOption().matches(options::OPT_W_Group))
6180 continue;
6181
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006182 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006183 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006184 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006185
Daniel Dunbar4e295052010-01-25 22:35:08 +00006186 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006187
6188 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006189 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006190 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006191 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006192 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006193 }
6194
Daniel Dunbar5716d872009-05-02 21:41:52 +00006195 // Try to force gcc to match the tool chain we want, if we recognize
6196 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006197 //
6198 // FIXME: The triple class should directly provide the information we want
6199 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006200 switch (getToolChain().getArch()) {
6201 default:
6202 break;
6203 case llvm::Triple::x86:
6204 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006205 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006206 break;
6207 case llvm::Triple::x86_64:
6208 case llvm::Triple::ppc64:
6209 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006210 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006211 break;
6212 case llvm::Triple::sparcel:
6213 CmdArgs.push_back("-EL");
6214 break;
6215 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006216
Daniel Dunbarb440f562010-08-02 02:38:21 +00006217 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006218 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006219 CmdArgs.push_back(Output.getFilename());
6220 } else {
6221 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006222 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006223 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006224
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006225 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006226
6227 // Only pass -x if gcc will understand it; otherwise hope gcc
6228 // understands the suffix correctly. The main use case this would go
6229 // wrong in is for linker inputs if they happened to have an odd
6230 // suffix; really the only way to get this to happen is a command
6231 // like '-x foobar a.c' which will treat a.c like a linker input.
6232 //
6233 // FIXME: For the linker case specifically, can we safely convert
6234 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006235 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006236 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006237 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006238 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006239 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006240 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006241 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006242 else if (II.getType() == types::TY_ModuleFile)
6243 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006244 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006245
Daniel Dunbara3246a02009-03-18 08:07:30 +00006246 if (types::canTypeBeUserSpecified(II.getType())) {
6247 CmdArgs.push_back("-x");
6248 CmdArgs.push_back(types::getTypeName(II.getType()));
6249 }
6250
Daniel Dunbarb440f562010-08-02 02:38:21 +00006251 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006252 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006253 else {
6254 const Arg &A = II.getInputArg();
6255
6256 // Reverse translate some rewritten options.
6257 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6258 CmdArgs.push_back("-lstdc++");
6259 continue;
6260 }
6261
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006262 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006263 A.render(Args, CmdArgs);
6264 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006265 }
6266
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006267 const std::string customGCCName = D.getCCCGenericGCCName();
6268 const char *GCCName;
6269 if (!customGCCName.empty())
6270 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006271 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006272 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006273 } else
6274 GCCName = "gcc";
6275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006276 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006277 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006278}
6279
Douglas Katzman95354292015-06-23 20:42:09 +00006280void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6281 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006282 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006283}
6284
Douglas Katzman95354292015-06-23 20:42:09 +00006285void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6286 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006287 const Driver &D = getToolChain().getDriver();
6288
Eric Christophercc7ff502015-01-29 00:56:17 +00006289 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006290 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006291 case types::TY_LLVM_IR:
6292 case types::TY_LTO_IR:
6293 case types::TY_LLVM_BC:
6294 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006295 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006296 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006297 // We assume we've got an "integrated" assembler in that gcc will produce an
6298 // object file itself.
6299 case types::TY_Object:
6300 CmdArgs.push_back("-c");
6301 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006302 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006303 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006304 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006305 case types::TY_Nothing:
6306 CmdArgs.push_back("-fsyntax-only");
6307 break;
6308 default:
6309 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006310 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006311}
6312
Douglas Katzman95354292015-06-23 20:42:09 +00006313void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6314 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006315 // The types are (hopefully) good enough.
6316}
6317
Tony Linthicum76329bf2011-12-12 21:14:55 +00006318// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006319void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006320 ArgStringList &CmdArgs) const {
6321}
6322
Douglas Katzman95354292015-06-23 20:42:09 +00006323void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6324 const InputInfo &Output,
6325 const InputInfoList &Inputs,
6326 const ArgList &Args,
6327 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006328 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006329
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006330 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6331 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006332 ArgStringList CmdArgs;
6333
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006334 std::string MArchString = "-march=hexagon";
6335 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006336
6337 RenderExtraToolArgs(JA, CmdArgs);
6338
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006339 std::string AsName = "hexagon-llvm-mc";
6340 std::string MCpuString = "-mcpu=hexagon" +
6341 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6342 CmdArgs.push_back("-filetype=obj");
6343 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6344
Tony Linthicum76329bf2011-12-12 21:14:55 +00006345 if (Output.isFilename()) {
6346 CmdArgs.push_back("-o");
6347 CmdArgs.push_back(Output.getFilename());
6348 } else {
6349 assert(Output.isNothing() && "Unexpected output");
6350 CmdArgs.push_back("-fsyntax-only");
6351 }
6352
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006353 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6354 std::string N = llvm::utostr(G.getValue());
6355 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6356 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006357
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006358 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006359
Tony Linthicum76329bf2011-12-12 21:14:55 +00006360 // Only pass -x if gcc will understand it; otherwise hope gcc
6361 // understands the suffix correctly. The main use case this would go
6362 // wrong in is for linker inputs if they happened to have an odd
6363 // suffix; really the only way to get this to happen is a command
6364 // like '-x foobar a.c' which will treat a.c like a linker input.
6365 //
6366 // FIXME: For the linker case specifically, can we safely convert
6367 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006368 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006369 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006370 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006371 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006372 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006373 else if (II.getType() == types::TY_AST)
6374 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006375 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006376 else if (II.getType() == types::TY_ModuleFile)
6377 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006378 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006379
6380 if (II.isFilename())
6381 CmdArgs.push_back(II.getFilename());
6382 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006383 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006384 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006385 II.getInputArg().render(Args, CmdArgs);
6386 }
6387
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006388 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006389 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006390}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006391
Douglas Katzman95354292015-06-23 20:42:09 +00006392void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6393 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006394}
6395
Douglas Katzman54366072015-07-27 16:53:08 +00006396static void
6397constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006398 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006399 const InputInfo &Output, const InputInfoList &Inputs,
6400 const ArgList &Args, ArgStringList &CmdArgs,
6401 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006402
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006403 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006404
Matthew Curtise689b052012-12-06 15:46:07 +00006405 //----------------------------------------------------------------------------
6406 //
6407 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006408 bool IsStatic = Args.hasArg(options::OPT_static);
6409 bool IsShared = Args.hasArg(options::OPT_shared);
6410 bool IsPIE = Args.hasArg(options::OPT_pie);
6411 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6412 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6413 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6414 bool UseG0 = false;
6415 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006416
Matthew Curtise689b052012-12-06 15:46:07 +00006417 //----------------------------------------------------------------------------
6418 // Silence warnings for various options
6419 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006420 Args.ClaimAllArgs(options::OPT_g_Group);
6421 Args.ClaimAllArgs(options::OPT_emit_llvm);
6422 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6423 // handled somewhere else.
6424 Args.ClaimAllArgs(options::OPT_static_libgcc);
6425
6426 //----------------------------------------------------------------------------
6427 //
6428 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006429 if (Args.hasArg(options::OPT_s))
6430 CmdArgs.push_back("-s");
6431
6432 if (Args.hasArg(options::OPT_r))
6433 CmdArgs.push_back("-r");
6434
6435 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006436 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006437
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006438 CmdArgs.push_back("-march=hexagon");
6439 std::string CpuVer =
6440 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6441 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6442 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006443
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006444 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006445 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446 // The following should be the default, but doing as hexagon-gcc does.
6447 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006448 }
6449
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006450 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006451 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006452
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006454 CmdArgs.push_back("-pie");
6455
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006456 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6457 std::string N = llvm::utostr(G.getValue());
6458 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6459 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006460 }
6461
Matthew Curtise689b052012-12-06 15:46:07 +00006462 //----------------------------------------------------------------------------
6463 //
6464 //----------------------------------------------------------------------------
6465 CmdArgs.push_back("-o");
6466 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006467
Matthew Curtise689b052012-12-06 15:46:07 +00006468 //----------------------------------------------------------------------------
6469 // moslib
6470 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006471 std::vector<std::string> OsLibs;
6472 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006473
Sean Silva14facf32015-06-09 01:57:17 +00006474 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6475 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006476 OsLibs.emplace_back(A->getValue());
6477 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006478 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006479 if (OsLibs.empty()) {
6480 OsLibs.push_back("standalone");
6481 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006482 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006483
Matthew Curtise689b052012-12-06 15:46:07 +00006484 //----------------------------------------------------------------------------
6485 // Start Files
6486 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006487 const std::string MCpuSuffix = "/" + CpuVer;
6488 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6489 const std::string RootDir =
6490 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6491 const std::string StartSubDir =
6492 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006493
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006494 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6495 const char *Name) -> std::string {
6496 std::string RelName = SubDir + Name;
6497 std::string P = HTC.GetFilePath(RelName.c_str());
6498 if (llvm::sys::fs::exists(P))
6499 return P;
6500 return RootDir + RelName;
6501 };
6502
6503 if (IncStdLib && IncStartFiles) {
6504 if (!IsShared) {
6505 if (HasStandalone) {
6506 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6507 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006508 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006509 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6510 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006511 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006512 std::string Init = UseShared
6513 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6514 : Find(RootDir, StartSubDir, "/init.o");
6515 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006516 }
6517
6518 //----------------------------------------------------------------------------
6519 // Library Search Paths
6520 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006521 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6522 for (const auto &LibPath : LibPaths)
6523 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006524
6525 //----------------------------------------------------------------------------
6526 //
6527 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006528 Args.AddAllArgs(CmdArgs,
6529 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6530 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006531
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006532 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006533
6534 //----------------------------------------------------------------------------
6535 // Libraries
6536 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006537 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006538 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006539 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006540 CmdArgs.push_back("-lm");
6541 }
6542
6543 CmdArgs.push_back("--start-group");
6544
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006545 if (!IsShared) {
6546 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006547 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006548 CmdArgs.push_back("-lc");
6549 }
6550 CmdArgs.push_back("-lgcc");
6551
6552 CmdArgs.push_back("--end-group");
6553 }
6554
6555 //----------------------------------------------------------------------------
6556 // End files
6557 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006558 if (IncStdLib && IncStartFiles) {
6559 std::string Fini = UseShared
6560 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6561 : Find(RootDir, StartSubDir, "/fini.o");
6562 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006563 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006564}
6565
Douglas Katzman95354292015-06-23 20:42:09 +00006566void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6567 const InputInfo &Output,
6568 const InputInfoList &Inputs,
6569 const ArgList &Args,
6570 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006571 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006572
6573 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006575 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006576
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006578 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006579 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006580}
6581// Hexagon tools end.
6582
Tom Stellard8fa33092015-07-18 01:49:05 +00006583void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6584 const InputInfo &Output,
6585 const InputInfoList &Inputs,
6586 const ArgList &Args,
6587 const char *LinkingOutput) const {
6588
6589 std::string Linker = getToolChain().GetProgramPath(getShortName());
6590 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006591 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6592 CmdArgs.push_back("-o");
6593 CmdArgs.push_back(Output.getFilename());
6594 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6595 CmdArgs, Inputs));
6596}
6597// AMDGPU tools end.
6598
Dan Gohman52816862015-12-16 23:30:41 +00006599wasm::Linker::Linker(const ToolChain &TC)
6600 : GnuTool("wasm::Linker", "lld", TC) {}
6601
6602bool wasm::Linker::isLinkJob() const {
6603 return true;
6604}
6605
6606bool wasm::Linker::hasIntegratedCPP() const {
6607 return false;
6608}
6609
6610void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6611 const InputInfo &Output,
6612 const InputInfoList &Inputs,
6613 const ArgList &Args,
6614 const char *LinkingOutput) const {
6615 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6616 ArgStringList CmdArgs;
6617 CmdArgs.push_back("-flavor");
6618 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006619
6620 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006621 // size is of particular importance. This is significantly facilitated by
6622 // the enabling of -ffunction-sections and -fdata-sections in
6623 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006624 if (areOptimizationsEnabled(Args))
6625 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006626
Dan Gohman52816862015-12-16 23:30:41 +00006627 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6628 CmdArgs.push_back("-o");
6629 CmdArgs.push_back(Output.getFilename());
6630 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6631}
6632
Renato Golin7c542b42015-07-27 23:44:45 +00006633const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006634 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006635 if (!Arch.empty())
6636 MArch = Arch;
6637 else
Bernard Ogden31561762013-12-12 13:27:11 +00006638 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006639 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006640
6641 // Handle -march=native.
6642 if (MArch == "native") {
6643 std::string CPU = llvm::sys::getHostCPUName();
6644 if (CPU != "generic") {
6645 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006646 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006647 // If there is no valid architecture suffix for this CPU we don't know how
6648 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006649 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006650 MArch = "";
6651 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006652 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006653 }
6654 }
6655
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006656 return MArch;
6657}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006658
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006659/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006660StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006661 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006662 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6663 // here means an -march=native that we can't handle, so instead return no CPU.
6664 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006665 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006666
John Brawna95c1a82015-05-08 12:52:18 +00006667 // We need to return an empty string here on invalid MArch values as the
6668 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006669 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006670}
6671
6672/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006673std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006674 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006675 // FIXME: Warn on inconsistent use of -mcpu and -march.
6676 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006677 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006678 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006679 // Handle -mcpu=native.
6680 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006681 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006682 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006683 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006684 }
6685
Renato Goline17c5802015-07-27 23:44:42 +00006686 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006687}
6688
6689/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006690/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006691// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006692StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6693 const llvm::Triple &Triple) {
6694 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006695 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006696 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006697 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006698 if (ArchKind == llvm::ARM::AK_INVALID)
6699 // In case of generic Arch, i.e. "arm",
6700 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006701 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006702 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006703 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6704 // armv7k triple if it's actually been specified via "-arch armv7k".
6705 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006706 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006707 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006708 }
Renato Golin3c007252015-05-28 15:05:53 +00006709 if (ArchKind == llvm::ARM::AK_INVALID)
6710 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006711 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006712}
6713
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006714void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006715 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006716 if (Args.hasArg(options::OPT_r))
6717 return;
6718
John Brawn94fd9632015-05-21 12:19:49 +00006719 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6720 // to generate BE-8 executables.
6721 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6722 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006723}
6724
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006725mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006726 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6727 // was first introduced in Release 3. However, other compilers have
6728 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006729 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6730 .Case("mips1", NanLegacy)
6731 .Case("mips2", NanLegacy)
6732 .Case("mips3", NanLegacy)
6733 .Case("mips4", NanLegacy)
6734 .Case("mips5", NanLegacy)
6735 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006736 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006737 .Case("mips32r3", NanLegacy | Nan2008)
6738 .Case("mips32r5", NanLegacy | Nan2008)
6739 .Case("mips32r6", Nan2008)
6740 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006741 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006742 .Case("mips64r3", NanLegacy | Nan2008)
6743 .Case("mips64r5", NanLegacy | Nan2008)
6744 .Case("mips64r6", Nan2008)
6745 .Default(NanLegacy);
6746}
6747
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006748bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6749 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6750 return A && (A->getValue() == StringRef(Value));
6751}
6752
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006753bool mips::isUCLibc(const ArgList &Args) {
6754 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006755 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006756}
6757
Daniel Sanders2bf13662014-07-10 14:40:57 +00006758bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006759 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6760 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006761 .Case("2008", true)
6762 .Case("legacy", false)
6763 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006764
6765 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006766 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006767 .Cases("mips32r6", "mips64r6", true)
6768 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006769
6770 return false;
6771}
6772
Daniel Sanders379d44b2014-07-16 11:52:23 +00006773bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006774 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006775 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006776 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006777 return false;
6778
6779 if (ABIName != "32")
6780 return false;
6781
Toma Tabacu94ea6862015-06-16 13:54:13 +00006782 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6783 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006784 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006785 return false;
6786
Daniel Sanders379d44b2014-07-16 11:52:23 +00006787 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006788 .Cases("mips2", "mips3", "mips4", "mips5", true)
6789 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6790 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6791 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006792}
6793
Toma Tabacu94ea6862015-06-16 13:54:13 +00006794bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6795 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006796 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006797 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6798
6799 // FPXX shouldn't be used if -msingle-float is present.
6800 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6801 options::OPT_mdouble_float))
6802 if (A->getOption().matches(options::OPT_msingle_float))
6803 UseFPXX = false;
6804
6805 return UseFPXX;
6806}
6807
Tim Northover157d9112014-01-16 08:48:16 +00006808llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006809 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6810 // archs which Darwin doesn't use.
6811
6812 // The matching this routine does is fairly pointless, since it is neither the
6813 // complete architecture list, nor a reasonable subset. The problem is that
6814 // historically the driver driver accepts this and also ties its -march=
6815 // handling to the architecture name, so we need to be careful before removing
6816 // support for it.
6817
6818 // This code must be kept in sync with Clang's Darwin specific argument
6819 // translation.
6820
6821 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006822 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6823 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6824 .Case("ppc64", llvm::Triple::ppc64)
6825 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6826 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6827 llvm::Triple::x86)
6828 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6829 // This is derived from the driver driver.
6830 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6831 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6832 .Cases("armv7s", "xscale", llvm::Triple::arm)
6833 .Case("arm64", llvm::Triple::aarch64)
6834 .Case("r600", llvm::Triple::r600)
6835 .Case("amdgcn", llvm::Triple::amdgcn)
6836 .Case("nvptx", llvm::Triple::nvptx)
6837 .Case("nvptx64", llvm::Triple::nvptx64)
6838 .Case("amdil", llvm::Triple::amdil)
6839 .Case("spir", llvm::Triple::spir)
6840 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006841}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006842
Tim Northover157d9112014-01-16 08:48:16 +00006843void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006844 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006845 T.setArch(Arch);
6846
6847 if (Str == "x86_64h")
6848 T.setArchName(Str);
6849 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6850 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006851 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006852 }
6853}
6854
Bob Wilsondecc03e2012-11-23 06:14:39 +00006855const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006856 const InputInfo &Input) {
6857 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006858}
6859
Bob Wilsondecc03e2012-11-23 06:14:39 +00006860const char *Clang::getBaseInputStem(const ArgList &Args,
6861 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006862 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006863
Chris Lattner906bb902011-01-16 08:14:11 +00006864 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006865 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006866
6867 return Str;
6868}
6869
Bob Wilsondecc03e2012-11-23 06:14:39 +00006870const char *Clang::getDependencyFileName(const ArgList &Args,
6871 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006872 // FIXME: Think about this more.
6873 std::string Res;
6874
6875 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006876 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006877 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006878 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006879 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006880 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006881 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006882}
6883
Douglas Katzman95354292015-06-23 20:42:09 +00006884void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6885 const InputInfo &Output,
6886 const InputInfoList &Inputs,
6887 const ArgList &Args,
6888 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006889 const ToolChain &ToolChain = getToolChain();
6890 const Driver &D = ToolChain.getDriver();
6891 ArgStringList CmdArgs;
6892
6893 // Silence warning for "clang -g foo.o -o foo"
6894 Args.ClaimAllArgs(options::OPT_g_Group);
6895 // and "clang -emit-llvm foo.o -o foo"
6896 Args.ClaimAllArgs(options::OPT_emit_llvm);
6897 // and for "clang -w foo.o -o foo". Other warning options are already
6898 // handled somewhere else.
6899 Args.ClaimAllArgs(options::OPT_w);
6900
6901 if (!D.SysRoot.empty())
6902 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6903
6904 // CloudABI only supports static linkage.
6905 CmdArgs.push_back("-Bstatic");
6906 CmdArgs.push_back("--eh-frame-hdr");
6907 CmdArgs.push_back("--gc-sections");
6908
6909 if (Output.isFilename()) {
6910 CmdArgs.push_back("-o");
6911 CmdArgs.push_back(Output.getFilename());
6912 } else {
6913 assert(Output.isNothing() && "Invalid output.");
6914 }
6915
Douglas Katzman78b37b02015-11-17 20:28:07 +00006916 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006917 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6918 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6919 }
6920
6921 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006922 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006923 Args.AddAllArgs(CmdArgs,
6924 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6925 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006926
Teresa Johnson945bc502015-10-15 20:35:53 +00006927 if (D.isUsingLTO())
6928 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006929
6930 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6931
Douglas Katzman78b37b02015-11-17 20:28:07 +00006932 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006933 if (D.CCCIsCXX())
6934 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6935 CmdArgs.push_back("-lc");
6936 CmdArgs.push_back("-lcompiler_rt");
6937 }
6938
Douglas Katzman78b37b02015-11-17 20:28:07 +00006939 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006940 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6941
6942 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006943 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006944}
6945
Douglas Katzman95354292015-06-23 20:42:09 +00006946void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6947 const InputInfo &Output,
6948 const InputInfoList &Inputs,
6949 const ArgList &Args,
6950 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006951 ArgStringList CmdArgs;
6952
6953 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6954 const InputInfo &Input = Inputs[0];
6955
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006956 // Determine the original source input.
6957 const Action *SourceAction = &JA;
6958 while (SourceAction->getKind() != Action::InputClass) {
6959 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6960 SourceAction = SourceAction->getInputs()[0];
6961 }
6962
Eric Christopherf5a8f492015-12-08 00:10:10 +00006963 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006964 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006965 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6966 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006967 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006968 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006969 const llvm::Triple &T(getToolChain().getTriple());
6970 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006971 CmdArgs.push_back("-Q");
6972 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006973
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006974 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006975 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006976 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006977 if (Args.hasArg(options::OPT_gstabs))
6978 CmdArgs.push_back("--gstabs");
6979 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006980 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006981 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006982
Daniel Dunbarbe220842009-03-20 16:06:39 +00006983 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006984 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006985
Daniel Dunbar6d484762010-07-22 01:47:22 +00006986 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006987 if (getToolChain().getArch() == llvm::Triple::x86 ||
6988 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006989 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6990 CmdArgs.push_back("-force_cpusubtype_ALL");
6991
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006992 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006993 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006994 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006995 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006996 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006997 CmdArgs.push_back("-static");
6998
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006999 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007000
7001 assert(Output.isFilename() && "Unexpected lipo output.");
7002 CmdArgs.push_back("-o");
7003 CmdArgs.push_back(Output.getFilename());
7004
Daniel Dunbarb440f562010-08-02 02:38:21 +00007005 assert(Input.isFilename() && "Invalid input.");
7006 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007007
7008 // asm_final spec is empty.
7009
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007010 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007011 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007012}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007013
Tim Northover157d9112014-01-16 08:48:16 +00007014void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007015
Tim Northover157d9112014-01-16 08:48:16 +00007016void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7017 ArgStringList &CmdArgs) const {
7018 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007019
Daniel Dunbarc1964212009-03-26 16:23:12 +00007020 // Derived from darwin_arch spec.
7021 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007022 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007023
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007024 // FIXME: Is this needed anymore?
7025 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007026 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007027}
7028
Douglas Katzman95354292015-06-23 20:42:09 +00007029bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007030 // We only need to generate a temp path for LTO if we aren't compiling object
7031 // files. When compiling source files, we run 'dsymutil' after linking. We
7032 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007033 for (const auto &Input : Inputs)
7034 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007035 return true;
7036
7037 return false;
7038}
7039
Douglas Katzman95354292015-06-23 20:42:09 +00007040void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7041 ArgStringList &CmdArgs,
7042 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007043 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007044 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007045
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007046 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007047 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7048 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007049 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7050 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007051 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007052 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007053 }
7054
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007055 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007056 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007057 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7058 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007059
Bob Wilson3d27dad2013-08-02 22:25:34 +00007060 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7061 CmdArgs.push_back("-export_dynamic");
7062
Bob Wilsonb111ec92015-03-02 19:01:14 +00007063 // If we are using App Extension restrictions, pass a flag to the linker
7064 // telling it that the compiled code has been audited.
7065 if (Args.hasFlag(options::OPT_fapplication_extension,
7066 options::OPT_fno_application_extension, false))
7067 CmdArgs.push_back("-application_extension");
7068
Teresa Johnson945bc502015-10-15 20:35:53 +00007069 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007070 // If we are using LTO, then automatically create a temporary file path for
7071 // the linker to use, so that it's lifetime will extend past a possible
7072 // dsymutil step.
7073 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7074 const char *TmpPath = C.getArgs().MakeArgString(
7075 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7076 C.addTempFile(TmpPath);
7077 CmdArgs.push_back("-object_path_lto");
7078 CmdArgs.push_back(TmpPath);
7079 }
7080
7081 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7082 // it in clang installed libraries. If not found, the option is not used
7083 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7084 if (Version[0] >= 133) {
7085 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7086 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7087 SmallString<128> LibLTOPath(P);
7088 llvm::sys::path::append(LibLTOPath, "lib");
7089 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7090 if (llvm::sys::fs::exists(LibLTOPath)) {
7091 CmdArgs.push_back("-lto_library");
7092 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7093 } else {
7094 D.Diag(diag::warn_drv_lto_libpath);
7095 }
7096 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007097 }
7098
Daniel Dunbarc1964212009-03-26 16:23:12 +00007099 // Derived from the "link" spec.
7100 Args.AddAllArgs(CmdArgs, options::OPT_static);
7101 if (!Args.hasArg(options::OPT_static))
7102 CmdArgs.push_back("-dynamic");
7103 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7104 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7105 // here. How do we wish to handle such things?
7106 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007107
Daniel Dunbarc1964212009-03-26 16:23:12 +00007108 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007109 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007110 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007111 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007112
7113 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7114 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7115 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7116
7117 Arg *A;
7118 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7119 (A = Args.getLastArg(options::OPT_current__version)) ||
7120 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007121 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7122 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007123
7124 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7125 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7126 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7127 } else {
7128 CmdArgs.push_back("-dylib");
7129
7130 Arg *A;
7131 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7132 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7133 (A = Args.getLastArg(options::OPT_client__name)) ||
7134 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7135 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7136 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007137 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7138 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007139
Daniel Dunbarc1964212009-03-26 16:23:12 +00007140 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7141 "-dylib_compatibility_version");
7142 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7143 "-dylib_current_version");
7144
Tim Northover157d9112014-01-16 08:48:16 +00007145 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007146
7147 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7148 "-dylib_install_name");
7149 }
7150
7151 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7152 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7153 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007154 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007155 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007156 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7157 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7158 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7159 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7160 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7161 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007162 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007163 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7164 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7165 Args.AddAllArgs(CmdArgs, options::OPT_init);
7166
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007167 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007168 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007169
Daniel Dunbarc1964212009-03-26 16:23:12 +00007170 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7171 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7172 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7173 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7174 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007176 if (const Arg *A =
7177 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7178 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007179 if (A->getOption().matches(options::OPT_fpie) ||
7180 A->getOption().matches(options::OPT_fPIE))
7181 CmdArgs.push_back("-pie");
7182 else
7183 CmdArgs.push_back("-no_pie");
7184 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007185
7186 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7187 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7188 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7189 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7190 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7191 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7192 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7193 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7194 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7195 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7196 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7197 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7198 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7199 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7200 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7201 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007202
Daniel Dunbar84384642011-05-02 21:03:47 +00007203 // Give --sysroot= preference, over the Apple specific behavior to also use
7204 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007205 StringRef sysroot = C.getSysRoot();
7206 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007207 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007208 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007209 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7210 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007211 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007212 }
7213
Daniel Dunbarc1964212009-03-26 16:23:12 +00007214 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7215 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7216 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7217 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7218 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007219 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007220 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7221 Args.AddAllArgs(CmdArgs, options::OPT_y);
7222 Args.AddLastArg(CmdArgs, options::OPT_w);
7223 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7224 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7225 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7226 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7227 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7228 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7229 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7230 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7231 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7232 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7233 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7234 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7235}
7236
Douglas Katzman95354292015-06-23 20:42:09 +00007237void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7238 const InputInfo &Output,
7239 const InputInfoList &Inputs,
7240 const ArgList &Args,
7241 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007242 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007243
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007244 // If the number of arguments surpasses the system limits, we will encode the
7245 // input files in a separate file, shortening the command line. To this end,
7246 // build a list of input file names that can be passed via a file with the
7247 // -filelist linker option.
7248 llvm::opt::ArgStringList InputFileList;
7249
Daniel Dunbarc1964212009-03-26 16:23:12 +00007250 // The logic here is derived from gcc's behavior; most of which
7251 // comes from specs (starting with link_command). Consult gcc for
7252 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007253 ArgStringList CmdArgs;
7254
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007255 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7256 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7257 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007258 for (const auto &Arg : Args)
7259 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007260 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007261 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007262 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007263 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007264 return;
7265 }
7266
Daniel Dunbarc1964212009-03-26 16:23:12 +00007267 // I'm not sure why this particular decomposition exists in gcc, but
7268 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007269 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007270
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007271 // It seems that the 'e' option is completely ignored for dynamic executables
7272 // (the default), and with static executables, the last one wins, as expected.
7273 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7274 options::OPT_Z_Flag, options::OPT_u_Group,
7275 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007276
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007277 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7278 // members of static archive libraries which implement Objective-C classes or
7279 // categories.
7280 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7281 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007282
Daniel Dunbarc1964212009-03-26 16:23:12 +00007283 CmdArgs.push_back("-o");
7284 CmdArgs.push_back(Output.getFilename());
7285
Douglas Katzman78b37b02015-11-17 20:28:07 +00007286 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007287 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007288
Peter Collingbournec4122c12015-06-15 21:08:13 +00007289 // SafeStack requires its own runtime libraries
7290 // These libraries should be linked first, to make sure the
7291 // __safestack_init constructor executes before everything else
7292 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7293 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7294 "libclang_rt.safestack_osx.a",
7295 /*AlwaysLink=*/true);
7296 }
7297
Daniel Dunbarc1964212009-03-26 16:23:12 +00007298 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007299
Douglas Gregor9295df02012-05-15 21:00:27 +00007300 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007301 // Build the input file for -filelist (list of linker input files) in case we
7302 // need it later
7303 for (const auto &II : Inputs) {
7304 if (!II.isFilename()) {
7305 // This is a linker input argument.
7306 // We cannot mix input arguments and file names in a -filelist input, thus
7307 // we prematurely stop our list (remaining files shall be passed as
7308 // arguments).
7309 if (InputFileList.size() > 0)
7310 break;
7311
7312 continue;
7313 }
7314
7315 InputFileList.push_back(II.getFilename());
7316 }
7317
Douglas Katzman78b37b02015-11-17 20:28:07 +00007318 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007319 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7320
Douglas Katzman78b37b02015-11-17 20:28:07 +00007321 if (isObjCRuntimeLinked(Args) &&
7322 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007323 // We use arclite library for both ARC and subscripting support.
7324 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7325
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007326 CmdArgs.push_back("-framework");
7327 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007328 // Link libobj.
7329 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007330 }
John McCall31168b02011-06-15 23:02:42 +00007331
Daniel Dunbarc1964212009-03-26 16:23:12 +00007332 if (LinkingOutput) {
7333 CmdArgs.push_back("-arch_multiple");
7334 CmdArgs.push_back("-final_output");
7335 CmdArgs.push_back(LinkingOutput);
7336 }
7337
Daniel Dunbarc1964212009-03-26 16:23:12 +00007338 if (Args.hasArg(options::OPT_fnested_functions))
7339 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007340
Justin Bognerc7701242015-05-12 05:44:36 +00007341 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7342
Douglas Katzman78b37b02015-11-17 20:28:07 +00007343 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007344 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007345 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007346
Daniel Dunbarc1964212009-03-26 16:23:12 +00007347 // link_ssp spec is empty.
7348
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007349 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007350 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007351 }
7352
Douglas Katzman78b37b02015-11-17 20:28:07 +00007353 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007354 // endfile_spec is empty.
7355 }
7356
7357 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7358 Args.AddAllArgs(CmdArgs, options::OPT_F);
7359
Steven Wu3ffb61b2015-02-06 18:08:29 +00007360 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007361 for (const Arg *A : Args.filtered(options::OPT_iframework))
7362 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007363
Douglas Katzman78b37b02015-11-17 20:28:07 +00007364 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007365 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7366 if (A->getValue() == StringRef("Accelerate")) {
7367 CmdArgs.push_back("-framework");
7368 CmdArgs.push_back("Accelerate");
7369 }
7370 }
7371 }
7372
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007373 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007374 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007375 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007376 Cmd->setInputFileList(std::move(InputFileList));
7377 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007378}
7379
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007380void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007381 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007382 const InputInfoList &Inputs,
7383 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007384 const char *LinkingOutput) const {
7385 ArgStringList CmdArgs;
7386
7387 CmdArgs.push_back("-create");
7388 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007389
7390 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007391 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007392
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007393 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007394 assert(II.isFilename() && "Unexpected lipo input.");
7395 CmdArgs.push_back(II.getFilename());
7396 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007397
7398 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007399 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007400}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007401
Daniel Dunbar88299622010-06-04 18:28:36 +00007402void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007403 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007404 const InputInfoList &Inputs,
7405 const ArgList &Args,
7406 const char *LinkingOutput) const {
7407 ArgStringList CmdArgs;
7408
Daniel Dunbareb86b042011-05-09 17:23:16 +00007409 CmdArgs.push_back("-o");
7410 CmdArgs.push_back(Output.getFilename());
7411
Daniel Dunbar88299622010-06-04 18:28:36 +00007412 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7413 const InputInfo &Input = Inputs[0];
7414 assert(Input.isFilename() && "Unexpected dsymutil input.");
7415 CmdArgs.push_back(Input.getFilename());
7416
Daniel Dunbar88299622010-06-04 18:28:36 +00007417 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007418 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007419 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007420}
7421
Eric Christopher551ef452011-08-23 17:56:55 +00007422void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007423 const InputInfo &Output,
7424 const InputInfoList &Inputs,
7425 const ArgList &Args,
7426 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007427 ArgStringList CmdArgs;
7428 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007429 CmdArgs.push_back("--debug-info");
7430 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007431 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007432
7433 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7434 const InputInfo &Input = Inputs[0];
7435 assert(Input.isFilename() && "Unexpected verify input");
7436
7437 // Grabbing the output of the earlier dsymutil run.
7438 CmdArgs.push_back(Input.getFilename());
7439
7440 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007441 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007442 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007443}
7444
Douglas Katzman95354292015-06-23 20:42:09 +00007445void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007446 const InputInfo &Output,
7447 const InputInfoList &Inputs,
7448 const ArgList &Args,
7449 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007450 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007451 ArgStringList CmdArgs;
7452
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007453 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007454
7455 CmdArgs.push_back("-o");
7456 CmdArgs.push_back(Output.getFilename());
7457
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007458 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007459 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007460
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007461 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007462 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007463}
7464
Douglas Katzman95354292015-06-23 20:42:09 +00007465void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7466 const InputInfo &Output,
7467 const InputInfoList &Inputs,
7468 const ArgList &Args,
7469 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007470 ArgStringList CmdArgs;
7471
David Chisnall272a0712012-02-29 15:06:12 +00007472 // Demangle C++ names in errors
7473 CmdArgs.push_back("-C");
7474
Douglas Katzman78b37b02015-11-17 20:28:07 +00007475 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007476 CmdArgs.push_back("-e");
7477 CmdArgs.push_back("_start");
7478 }
7479
7480 if (Args.hasArg(options::OPT_static)) {
7481 CmdArgs.push_back("-Bstatic");
7482 CmdArgs.push_back("-dn");
7483 } else {
7484 CmdArgs.push_back("-Bdynamic");
7485 if (Args.hasArg(options::OPT_shared)) {
7486 CmdArgs.push_back("-shared");
7487 } else {
7488 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007489 CmdArgs.push_back(
7490 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007491 }
7492 }
7493
7494 if (Output.isFilename()) {
7495 CmdArgs.push_back("-o");
7496 CmdArgs.push_back(Output.getFilename());
7497 } else {
7498 assert(Output.isNothing() && "Invalid output.");
7499 }
7500
Douglas Katzman78b37b02015-11-17 20:28:07 +00007501 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007502 if (!Args.hasArg(options::OPT_shared))
7503 CmdArgs.push_back(
7504 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7505
7506 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7507 CmdArgs.push_back(
7508 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7509 CmdArgs.push_back(
7510 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007511 }
7512
Douglas Katzman6059ef92015-11-17 17:41:23 +00007513 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007514
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007515 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7516 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007517
7518 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7519
Douglas Katzman78b37b02015-11-17 20:28:07 +00007520 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007521 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007522 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007523 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007524 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007525 if (!Args.hasArg(options::OPT_shared)) {
7526 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007527 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007528 }
David Chisnallf571cde2012-02-15 13:39:01 +00007529 }
7530
Douglas Katzman78b37b02015-11-17 20:28:07 +00007531 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007532 CmdArgs.push_back(
7533 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007534 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007535 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007536
Xinliang David Li69306c02015-10-22 06:15:31 +00007537 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007538
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007539 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007540 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007541}
7542
Douglas Katzman95354292015-06-23 20:42:09 +00007543void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7544 const InputInfo &Output,
7545 const InputInfoList &Inputs,
7546 const ArgList &Args,
7547 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007548 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007549 ArgStringList CmdArgs;
7550
Rafael Espindolacc126272014-02-28 01:55:21 +00007551 switch (getToolChain().getArch()) {
7552 case llvm::Triple::x86:
7553 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7554 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007555 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007556 break;
7557
7558 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007559 CmdArgs.push_back("-mppc");
7560 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007561 break;
7562
7563 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007564 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007565 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007566 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7567 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7568 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007569 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007570 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007571
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007572 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007573 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007574 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7575 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7576 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007577 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007578 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007579
7580 case llvm::Triple::mips64:
7581 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007582 StringRef CPUName;
7583 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007584 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007585
7586 CmdArgs.push_back("-mabi");
7587 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7588
7589 if (getToolChain().getArch() == llvm::Triple::mips64)
7590 CmdArgs.push_back("-EB");
7591 else
7592 CmdArgs.push_back("-EL");
7593
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007594 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007595 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007596 }
7597
Rafael Espindolacc126272014-02-28 01:55:21 +00007598 default:
7599 break;
7600 }
7601
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007602 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007603
7604 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007605 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007606
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007607 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007608 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007609
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007610 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007611 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007612}
7613
Douglas Katzman95354292015-06-23 20:42:09 +00007614void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7615 const InputInfo &Output,
7616 const InputInfoList &Inputs,
7617 const ArgList &Args,
7618 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007619 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007620 ArgStringList CmdArgs;
7621
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007622 // Silence warning for "clang -g foo.o -o foo"
7623 Args.ClaimAllArgs(options::OPT_g_Group);
7624 // and "clang -emit-llvm foo.o -o foo"
7625 Args.ClaimAllArgs(options::OPT_emit_llvm);
7626 // and for "clang -w foo.o -o foo". Other warning options are already
7627 // handled somewhere else.
7628 Args.ClaimAllArgs(options::OPT_w);
7629
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007630 if (getToolChain().getArch() == llvm::Triple::mips64)
7631 CmdArgs.push_back("-EB");
7632 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7633 CmdArgs.push_back("-EL");
7634
Douglas Katzman78b37b02015-11-17 20:28:07 +00007635 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007636 CmdArgs.push_back("-e");
7637 CmdArgs.push_back("__start");
7638 }
7639
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007640 if (Args.hasArg(options::OPT_static)) {
7641 CmdArgs.push_back("-Bstatic");
7642 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007643 if (Args.hasArg(options::OPT_rdynamic))
7644 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007645 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007646 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007647 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007648 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007649 } else {
7650 CmdArgs.push_back("-dynamic-linker");
7651 CmdArgs.push_back("/usr/libexec/ld.so");
7652 }
7653 }
7654
Rafael Espindola044f7832013-06-05 04:28:55 +00007655 if (Args.hasArg(options::OPT_nopie))
7656 CmdArgs.push_back("-nopie");
7657
Daniel Dunbarb440f562010-08-02 02:38:21 +00007658 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007659 CmdArgs.push_back("-o");
7660 CmdArgs.push_back(Output.getFilename());
7661 } else {
7662 assert(Output.isNothing() && "Invalid output.");
7663 }
7664
Douglas Katzman78b37b02015-11-17 20:28:07 +00007665 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007666 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007667 if (Args.hasArg(options::OPT_pg))
7668 CmdArgs.push_back(
7669 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007670 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007671 CmdArgs.push_back(
7672 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7673 CmdArgs.push_back(
7674 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007675 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007676 CmdArgs.push_back(
7677 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007678 }
7679 }
7680
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007681 std::string Triple = getToolChain().getTripleString();
7682 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007683 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007684 CmdArgs.push_back(
7685 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007686
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007687 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7688 options::OPT_e, options::OPT_s, options::OPT_t,
7689 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007690
Daniel Dunbar54423b22010-09-17 00:24:54 +00007691 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007692
Douglas Katzman78b37b02015-11-17 20:28:07 +00007693 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007694 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007695 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007696 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007697 CmdArgs.push_back("-lm_p");
7698 else
7699 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007700 }
7701
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007702 // FIXME: For some reason GCC passes -lgcc before adding
7703 // the default system libraries. Just mimic this for now.
7704 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007705
Eric Christopher17674ec2012-09-13 06:32:34 +00007706 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007707 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7708 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007709 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007710 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007711 }
7712
Chandler Carruth45661652011-12-17 22:32:42 +00007713 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007714 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007715 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007716 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007717 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007718 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007719
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007720 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007721 }
7722
Douglas Katzman78b37b02015-11-17 20:28:07 +00007723 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007724 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007725 CmdArgs.push_back(
7726 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007727 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007728 CmdArgs.push_back(
7729 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007730 }
7731
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007732 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007733 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007734}
Ed Schoutene33194b2009-04-02 19:13:12 +00007735
Douglas Katzman95354292015-06-23 20:42:09 +00007736void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7737 const InputInfo &Output,
7738 const InputInfoList &Inputs,
7739 const ArgList &Args,
7740 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007741 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007742 ArgStringList CmdArgs;
7743
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007744 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007745
7746 CmdArgs.push_back("-o");
7747 CmdArgs.push_back(Output.getFilename());
7748
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007749 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007750 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007751
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007752 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007754}
7755
Douglas Katzman95354292015-06-23 20:42:09 +00007756void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7757 const InputInfo &Output,
7758 const InputInfoList &Inputs,
7759 const ArgList &Args,
7760 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007761 const Driver &D = getToolChain().getDriver();
7762 ArgStringList CmdArgs;
7763
Douglas Katzman78b37b02015-11-17 20:28:07 +00007764 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007765 CmdArgs.push_back("-e");
7766 CmdArgs.push_back("__start");
7767 }
7768
7769 if (Args.hasArg(options::OPT_static)) {
7770 CmdArgs.push_back("-Bstatic");
7771 } else {
7772 if (Args.hasArg(options::OPT_rdynamic))
7773 CmdArgs.push_back("-export-dynamic");
7774 CmdArgs.push_back("--eh-frame-hdr");
7775 CmdArgs.push_back("-Bdynamic");
7776 if (Args.hasArg(options::OPT_shared)) {
7777 CmdArgs.push_back("-shared");
7778 } else {
7779 CmdArgs.push_back("-dynamic-linker");
7780 CmdArgs.push_back("/usr/libexec/ld.so");
7781 }
7782 }
7783
7784 if (Output.isFilename()) {
7785 CmdArgs.push_back("-o");
7786 CmdArgs.push_back(Output.getFilename());
7787 } else {
7788 assert(Output.isNothing() && "Invalid output.");
7789 }
7790
Douglas Katzman78b37b02015-11-17 20:28:07 +00007791 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007792 if (!Args.hasArg(options::OPT_shared)) {
7793 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007794 CmdArgs.push_back(
7795 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007796 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007797 CmdArgs.push_back(
7798 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7799 CmdArgs.push_back(
7800 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007801 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007802 CmdArgs.push_back(
7803 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007804 }
7805 }
7806
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007807 Args.AddAllArgs(CmdArgs,
7808 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007809
7810 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7811
Douglas Katzman78b37b02015-11-17 20:28:07 +00007812 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007813 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007814 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7815 if (Args.hasArg(options::OPT_pg))
7816 CmdArgs.push_back("-lm_p");
7817 else
7818 CmdArgs.push_back("-lm");
7819 }
7820
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007821 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007822 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007823 CmdArgs.push_back("-lpthread_p");
7824 else
7825 CmdArgs.push_back("-lpthread");
7826 }
7827
Eli Friedman9fa28852012-08-08 23:57:20 +00007828 if (!Args.hasArg(options::OPT_shared)) {
7829 if (Args.hasArg(options::OPT_pg))
7830 CmdArgs.push_back("-lc_p");
7831 else
7832 CmdArgs.push_back("-lc");
7833 }
7834
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007835 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007836 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007837 case llvm::Triple::arm:
7838 MyArch = "arm";
7839 break;
7840 case llvm::Triple::x86:
7841 MyArch = "i386";
7842 break;
7843 case llvm::Triple::x86_64:
7844 MyArch = "amd64";
7845 break;
7846 default:
7847 llvm_unreachable("Unsupported architecture");
7848 }
7849 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007850 }
7851
Douglas Katzman78b37b02015-11-17 20:28:07 +00007852 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007853 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007854 CmdArgs.push_back(
7855 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007856 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007857 CmdArgs.push_back(
7858 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007859 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007860
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007861 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007862 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007863}
7864
Douglas Katzman95354292015-06-23 20:42:09 +00007865void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7866 const InputInfo &Output,
7867 const InputInfoList &Inputs,
7868 const ArgList &Args,
7869 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007870 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007871 ArgStringList CmdArgs;
7872
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007873 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7874 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007875 switch (getToolChain().getArch()) {
7876 default:
7877 break;
7878 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007879 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007880 break;
7881 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007882 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007883 break;
7884 case llvm::Triple::mips:
7885 case llvm::Triple::mipsel:
7886 case llvm::Triple::mips64:
7887 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007888 StringRef CPUName;
7889 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007890 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007891
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007892 CmdArgs.push_back("-march");
7893 CmdArgs.push_back(CPUName.data());
7894
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007895 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007896 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007897
7898 if (getToolChain().getArch() == llvm::Triple::mips ||
7899 getToolChain().getArch() == llvm::Triple::mips64)
7900 CmdArgs.push_back("-EB");
7901 else
7902 CmdArgs.push_back("-EL");
7903
Dimitry Andric46f338c2015-12-27 10:36:44 +00007904 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7905 StringRef v = A->getValue();
7906 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7907 A->claim();
7908 }
7909
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007910 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007911 break;
7912 }
7913 case llvm::Triple::arm:
7914 case llvm::Triple::armeb:
7915 case llvm::Triple::thumb:
7916 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007917 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007918
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007919 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007920 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007921 else
Renato Golinf4421f72014-02-19 10:44:07 +00007922 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007923
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007924 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007925 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007926 case llvm::Triple::GNUEABI:
7927 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007928 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007929 break;
7930
7931 default:
7932 CmdArgs.push_back("-matpcs");
7933 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007934 break;
7935 }
7936 case llvm::Triple::sparc:
7937 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007938 case llvm::Triple::sparcv9: {
7939 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7940 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007941 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007942 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007943 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007944 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007945
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007946 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007947
7948 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007949 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007950
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007951 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007952 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007953
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007954 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007955 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007956}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007957
Douglas Katzman95354292015-06-23 20:42:09 +00007958void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7959 const InputInfo &Output,
7960 const InputInfoList &Inputs,
7961 const ArgList &Args,
7962 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007963 const toolchains::FreeBSD &ToolChain =
7964 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007965 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007966 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007967 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007968 !Args.hasArg(options::OPT_shared) &&
7969 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007970 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007971
7972 // Silence warning for "clang -g foo.o -o foo"
7973 Args.ClaimAllArgs(options::OPT_g_Group);
7974 // and "clang -emit-llvm foo.o -o foo"
7975 Args.ClaimAllArgs(options::OPT_emit_llvm);
7976 // and for "clang -w foo.o -o foo". Other warning options are already
7977 // handled somewhere else.
7978 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007979
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007980 if (!D.SysRoot.empty())
7981 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7982
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007983 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007984 CmdArgs.push_back("-pie");
7985
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007986 if (Args.hasArg(options::OPT_static)) {
7987 CmdArgs.push_back("-Bstatic");
7988 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007989 if (Args.hasArg(options::OPT_rdynamic))
7990 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007991 CmdArgs.push_back("--eh-frame-hdr");
7992 if (Args.hasArg(options::OPT_shared)) {
7993 CmdArgs.push_back("-Bshareable");
7994 } else {
7995 CmdArgs.push_back("-dynamic-linker");
7996 CmdArgs.push_back("/libexec/ld-elf.so.1");
7997 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007998 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007999 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8000 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8001 CmdArgs.push_back("--hash-style=both");
8002 }
8003 }
8004 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008005 }
8006
8007 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8008 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008009 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008010 CmdArgs.push_back("-m");
8011 CmdArgs.push_back("elf_i386_fbsd");
8012 }
8013
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008014 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008015 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008016 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008017 }
8018
Dimitry Andric904895f2015-12-27 06:47:09 +00008019 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8020 if (ToolChain.getArch() == llvm::Triple::mips ||
8021 ToolChain.getArch() == llvm::Triple::mipsel ||
8022 ToolChain.getArch() == llvm::Triple::mips64 ||
8023 ToolChain.getArch() == llvm::Triple::mips64el) {
8024 StringRef v = A->getValue();
8025 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8026 A->claim();
8027 }
8028 }
8029
Daniel Dunbarb440f562010-08-02 02:38:21 +00008030 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008031 CmdArgs.push_back("-o");
8032 CmdArgs.push_back(Output.getFilename());
8033 } else {
8034 assert(Output.isNothing() && "Invalid output.");
8035 }
8036
Douglas Katzman78b37b02015-11-17 20:28:07 +00008037 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008038 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008039 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008040 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008041 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008042 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008043 crt1 = "Scrt1.o";
8044 else
8045 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008046 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008047 if (crt1)
8048 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8049
8050 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8051
Craig Topper92fc2df2014-05-17 16:56:41 +00008052 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008053 if (Args.hasArg(options::OPT_static))
8054 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008055 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008056 crtbegin = "crtbeginS.o";
8057 else
8058 crtbegin = "crtbegin.o";
8059
8060 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008061 }
8062
8063 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008064 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008065 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8066 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008067 Args.AddAllArgs(CmdArgs, options::OPT_s);
8068 Args.AddAllArgs(CmdArgs, options::OPT_t);
8069 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8070 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008071
Teresa Johnson945bc502015-10-15 20:35:53 +00008072 if (D.isUsingLTO())
8073 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008074
Alexey Samsonov52550342014-09-15 19:58:40 +00008075 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008076 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008077
Douglas Katzman78b37b02015-11-17 20:28:07 +00008078 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008079 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008080 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008081 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008082 if (Args.hasArg(options::OPT_pg))
8083 CmdArgs.push_back("-lm_p");
8084 else
8085 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008086 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008087 if (NeedsSanitizerDeps)
8088 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008089 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8090 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008091 if (Args.hasArg(options::OPT_pg))
8092 CmdArgs.push_back("-lgcc_p");
8093 else
8094 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008095 if (Args.hasArg(options::OPT_static)) {
8096 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008097 } else if (Args.hasArg(options::OPT_pg)) {
8098 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008099 } else {
8100 CmdArgs.push_back("--as-needed");
8101 CmdArgs.push_back("-lgcc_s");
8102 CmdArgs.push_back("--no-as-needed");
8103 }
8104
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008105 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008106 if (Args.hasArg(options::OPT_pg))
8107 CmdArgs.push_back("-lpthread_p");
8108 else
8109 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008110 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008111
Roman Divacky66f22762011-02-10 16:59:40 +00008112 if (Args.hasArg(options::OPT_pg)) {
8113 if (Args.hasArg(options::OPT_shared))
8114 CmdArgs.push_back("-lc");
8115 else
8116 CmdArgs.push_back("-lc_p");
8117 CmdArgs.push_back("-lgcc_p");
8118 } else {
8119 CmdArgs.push_back("-lc");
8120 CmdArgs.push_back("-lgcc");
8121 }
8122
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008123 if (Args.hasArg(options::OPT_static)) {
8124 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008125 } else if (Args.hasArg(options::OPT_pg)) {
8126 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008127 } else {
8128 CmdArgs.push_back("--as-needed");
8129 CmdArgs.push_back("-lgcc_s");
8130 CmdArgs.push_back("--no-as-needed");
8131 }
8132 }
8133
Douglas Katzman78b37b02015-11-17 20:28:07 +00008134 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008135 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008136 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008137 else
8138 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008139 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008140 }
8141
Xinliang David Li69306c02015-10-22 06:15:31 +00008142 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008144 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008145 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008146}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008147
Douglas Katzman95354292015-06-23 20:42:09 +00008148void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008149 const InputInfo &Output,
8150 const InputInfoList &Inputs,
8151 const ArgList &Args,
8152 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008153 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008154 ArgStringList CmdArgs;
8155
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008156 // GNU as needs different flags for creating the correct output format
8157 // on architectures with different ABIs or optional feature sets.
8158 switch (getToolChain().getArch()) {
8159 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008160 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008161 break;
8162 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008163 case llvm::Triple::armeb:
8164 case llvm::Triple::thumb:
8165 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008166 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008167 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8168 std::string Arch =
8169 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008170 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008171 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008172 }
8173
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008174 case llvm::Triple::mips:
8175 case llvm::Triple::mipsel:
8176 case llvm::Triple::mips64:
8177 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008178 StringRef CPUName;
8179 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008180 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008181
8182 CmdArgs.push_back("-march");
8183 CmdArgs.push_back(CPUName.data());
8184
8185 CmdArgs.push_back("-mabi");
8186 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8187
8188 if (getToolChain().getArch() == llvm::Triple::mips ||
8189 getToolChain().getArch() == llvm::Triple::mips64)
8190 CmdArgs.push_back("-EB");
8191 else
8192 CmdArgs.push_back("-EL");
8193
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008194 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008195 break;
8196 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008197
8198 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008199 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008200 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008201 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8202 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008203 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008204 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008205 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008206
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008207 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008208 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008209 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8210 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008211 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008212 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008213 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008214
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008215 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008216 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008217 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008218
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008219 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008220
8221 CmdArgs.push_back("-o");
8222 CmdArgs.push_back(Output.getFilename());
8223
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008224 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008225 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008226
David Chisnallddbd68f2011-09-27 22:03:18 +00008227 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008229}
8230
Douglas Katzman95354292015-06-23 20:42:09 +00008231void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8232 const InputInfo &Output,
8233 const InputInfoList &Inputs,
8234 const ArgList &Args,
8235 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008236 const Driver &D = getToolChain().getDriver();
8237 ArgStringList CmdArgs;
8238
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008239 if (!D.SysRoot.empty())
8240 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8241
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008242 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008243 if (Args.hasArg(options::OPT_static)) {
8244 CmdArgs.push_back("-Bstatic");
8245 } else {
8246 if (Args.hasArg(options::OPT_rdynamic))
8247 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008248 if (Args.hasArg(options::OPT_shared)) {
8249 CmdArgs.push_back("-Bshareable");
8250 } else {
8251 CmdArgs.push_back("-dynamic-linker");
8252 CmdArgs.push_back("/libexec/ld.elf_so");
8253 }
8254 }
8255
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008256 // Many NetBSD architectures support more than one ABI.
8257 // Determine the correct emulation for ld.
8258 switch (getToolChain().getArch()) {
8259 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008260 CmdArgs.push_back("-m");
8261 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008262 break;
8263 case llvm::Triple::arm:
8264 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008265 CmdArgs.push_back("-m");
8266 switch (getToolChain().getTriple().getEnvironment()) {
8267 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008268 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008269 CmdArgs.push_back("armelf_nbsd_eabi");
8270 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008271 case llvm::Triple::EABIHF:
8272 case llvm::Triple::GNUEABIHF:
8273 CmdArgs.push_back("armelf_nbsd_eabihf");
8274 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008275 default:
8276 CmdArgs.push_back("armelf_nbsd");
8277 break;
8278 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008279 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008280 case llvm::Triple::armeb:
8281 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008282 arm::appendEBLinkFlags(
8283 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008284 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008285 CmdArgs.push_back("-m");
8286 switch (getToolChain().getTriple().getEnvironment()) {
8287 case llvm::Triple::EABI:
8288 case llvm::Triple::GNUEABI:
8289 CmdArgs.push_back("armelfb_nbsd_eabi");
8290 break;
8291 case llvm::Triple::EABIHF:
8292 case llvm::Triple::GNUEABIHF:
8293 CmdArgs.push_back("armelfb_nbsd_eabihf");
8294 break;
8295 default:
8296 CmdArgs.push_back("armelfb_nbsd");
8297 break;
8298 }
8299 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008300 case llvm::Triple::mips64:
8301 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008302 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008303 CmdArgs.push_back("-m");
8304 if (getToolChain().getArch() == llvm::Triple::mips64)
8305 CmdArgs.push_back("elf32btsmip");
8306 else
8307 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008308 } else if (mips::hasMipsAbiArg(Args, "64")) {
8309 CmdArgs.push_back("-m");
8310 if (getToolChain().getArch() == llvm::Triple::mips64)
8311 CmdArgs.push_back("elf64btsmip");
8312 else
8313 CmdArgs.push_back("elf64ltsmip");
8314 }
8315 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008316 case llvm::Triple::ppc:
8317 CmdArgs.push_back("-m");
8318 CmdArgs.push_back("elf32ppc_nbsd");
8319 break;
8320
8321 case llvm::Triple::ppc64:
8322 case llvm::Triple::ppc64le:
8323 CmdArgs.push_back("-m");
8324 CmdArgs.push_back("elf64ppc");
8325 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008326
8327 case llvm::Triple::sparc:
8328 CmdArgs.push_back("-m");
8329 CmdArgs.push_back("elf32_sparc");
8330 break;
8331
8332 case llvm::Triple::sparcv9:
8333 CmdArgs.push_back("-m");
8334 CmdArgs.push_back("elf64_sparc");
8335 break;
8336
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008337 default:
8338 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008339 }
8340
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008341 if (Output.isFilename()) {
8342 CmdArgs.push_back("-o");
8343 CmdArgs.push_back(Output.getFilename());
8344 } else {
8345 assert(Output.isNothing() && "Invalid output.");
8346 }
8347
Douglas Katzman78b37b02015-11-17 20:28:07 +00008348 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008349 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008350 CmdArgs.push_back(
8351 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8352 CmdArgs.push_back(
8353 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8354 CmdArgs.push_back(
8355 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008356 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008357 CmdArgs.push_back(
8358 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8359 CmdArgs.push_back(
8360 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008361 }
8362 }
8363
8364 Args.AddAllArgs(CmdArgs, options::OPT_L);
8365 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8366 Args.AddAllArgs(CmdArgs, options::OPT_e);
8367 Args.AddAllArgs(CmdArgs, options::OPT_s);
8368 Args.AddAllArgs(CmdArgs, options::OPT_t);
8369 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8370 Args.AddAllArgs(CmdArgs, options::OPT_r);
8371
8372 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8373
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008374 unsigned Major, Minor, Micro;
8375 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8376 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008377 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008378 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008379 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008380 case llvm::Triple::arm:
8381 case llvm::Triple::armeb:
8382 case llvm::Triple::thumb:
8383 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008384 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008385 case llvm::Triple::ppc64:
8386 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008387 case llvm::Triple::x86:
8388 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008389 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008390 break;
8391 default:
8392 break;
8393 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008394 }
8395
Douglas Katzman78b37b02015-11-17 20:28:07 +00008396 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008397 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008398 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008399 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8400 CmdArgs.push_back("-lm");
8401 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008402 if (Args.hasArg(options::OPT_pthread))
8403 CmdArgs.push_back("-lpthread");
8404 CmdArgs.push_back("-lc");
8405
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008406 if (useLibgcc) {
8407 if (Args.hasArg(options::OPT_static)) {
8408 // libgcc_eh depends on libc, so resolve as much as possible,
8409 // pull in any new requirements from libc and then get the rest
8410 // of libgcc.
8411 CmdArgs.push_back("-lgcc_eh");
8412 CmdArgs.push_back("-lc");
8413 CmdArgs.push_back("-lgcc");
8414 } else {
8415 CmdArgs.push_back("-lgcc");
8416 CmdArgs.push_back("--as-needed");
8417 CmdArgs.push_back("-lgcc_s");
8418 CmdArgs.push_back("--no-as-needed");
8419 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008420 }
8421 }
8422
Douglas Katzman78b37b02015-11-17 20:28:07 +00008423 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008424 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008425 CmdArgs.push_back(
8426 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008427 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008428 CmdArgs.push_back(
8429 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8430 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008431 }
8432
Xinliang David Li69306c02015-10-22 06:15:31 +00008433 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008434
Logan Chieneb9162f2014-06-26 14:23:45 +00008435 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008437}
8438
Douglas Katzman95354292015-06-23 20:42:09 +00008439void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8440 const InputInfo &Output,
8441 const InputInfoList &Inputs,
8442 const ArgList &Args,
8443 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008444 claimNoWarnArgs(Args);
8445
James Y Knight2db38f32015-08-15 03:45:25 +00008446 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8447 llvm::Triple Triple = llvm::Triple(TripleStr);
8448
Rafael Espindola92b00932010-08-10 00:25:48 +00008449 ArgStringList CmdArgs;
8450
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008451 llvm::Reloc::Model RelocationModel;
8452 unsigned PICLevel;
8453 bool IsPIE;
8454 std::tie(RelocationModel, PICLevel, IsPIE) =
8455 ParsePICArgs(getToolChain(), Triple, Args);
8456
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008457 switch (getToolChain().getArch()) {
8458 default:
8459 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008460 // Add --32/--64 to make sure we get the format we want.
8461 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008462 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008463 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008464 break;
8465 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008466 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8467 CmdArgs.push_back("--x32");
8468 else
8469 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008470 break;
8471 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008472 CmdArgs.push_back("-a32");
8473 CmdArgs.push_back("-mppc");
8474 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008475 break;
8476 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008477 CmdArgs.push_back("-a64");
8478 CmdArgs.push_back("-mppc64");
8479 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008480 break;
8481 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008482 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008483 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008484 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008485 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008486 break;
8487 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008488 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008489 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008490 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8491 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8492 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008493 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008494 }
8495 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008496 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008497 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8498 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8499 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008500 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008501 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008502 case llvm::Triple::arm:
8503 case llvm::Triple::armeb:
8504 case llvm::Triple::thumb:
8505 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008506 const llvm::Triple &Triple2 = getToolChain().getTriple();
8507 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008508 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008509 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008510 break;
8511 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008512 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008513 break;
8514 default:
8515 break;
8516 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008517
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008518 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008519 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8520 case arm::FloatABI::Soft:
8521 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8522 break;
8523 case arm::FloatABI::SoftFP:
8524 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8525 break;
8526 case arm::FloatABI::Hard:
8527 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8528 break;
8529 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008530
8531 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008532
8533 // FIXME: remove krait check when GNU tools support krait cpu
8534 // for now replace it with -march=armv7-a to avoid a lower
8535 // march from being picked in the absence of a cpu flag.
8536 Arg *A;
8537 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008538 StringRef(A->getValue()).lower() == "krait")
8539 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008540 else
8541 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008542 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008543 break;
8544 }
8545 case llvm::Triple::mips:
8546 case llvm::Triple::mipsel:
8547 case llvm::Triple::mips64:
8548 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008549 StringRef CPUName;
8550 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008551 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008552 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008553
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008554 CmdArgs.push_back("-march");
8555 CmdArgs.push_back(CPUName.data());
8556
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008557 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008558 CmdArgs.push_back(ABIName.data());
8559
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008560 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8561 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008562 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008563 CmdArgs.push_back("-mno-shared");
8564
Daniel Sanders379d44b2014-07-16 11:52:23 +00008565 // LLVM doesn't support -mplt yet and acts as if it is always given.
8566 // However, -mplt has no effect with the N64 ABI.
8567 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008568
8569 if (getToolChain().getArch() == llvm::Triple::mips ||
8570 getToolChain().getArch() == llvm::Triple::mips64)
8571 CmdArgs.push_back("-EB");
8572 else
8573 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008574
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008575 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8576 if (StringRef(A->getValue()) == "2008")
8577 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8578 }
8579
Daniel Sanders379d44b2014-07-16 11:52:23 +00008580 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8581 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8582 options::OPT_mfp64)) {
8583 A->claim();
8584 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008585 } else if (mips::shouldUseFPXX(
8586 Args, getToolChain().getTriple(), CPUName, ABIName,
8587 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008588 CmdArgs.push_back("-mfpxx");
8589
8590 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8591 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008592 if (Arg *A =
8593 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008594 if (A->getOption().matches(options::OPT_mips16)) {
8595 A->claim();
8596 A->render(Args, CmdArgs);
8597 } else {
8598 A->claim();
8599 CmdArgs.push_back("-no-mips16");
8600 }
8601 }
8602
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008603 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8604 options::OPT_mno_micromips);
8605 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8606 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8607
Simon Atanasyanbd986632013-11-26 11:58:04 +00008608 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8609 // Do not use AddLastArg because not all versions of MIPS assembler
8610 // support -mmsa / -mno-msa options.
8611 if (A->getOption().matches(options::OPT_mmsa))
8612 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8613 }
8614
Daniel Sanders379d44b2014-07-16 11:52:23 +00008615 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8616 options::OPT_msoft_float);
8617
Toma Tabacub36d6102015-06-11 12:13:18 +00008618 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8619 options::OPT_msingle_float);
8620
Daniel Sanders379d44b2014-07-16 11:52:23 +00008621 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8622 options::OPT_mno_odd_spreg);
8623
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008624 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008625 break;
8626 }
8627 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008628 // Always pass an -march option, since our default of z10 is later
8629 // than the GNU assembler's default.
8630 StringRef CPUName = getSystemZTargetCPU(Args);
8631 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008632 break;
8633 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008634 }
8635
Renato Golina74bbc72015-07-22 15:32:36 +00008636 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008637 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008638
8639 CmdArgs.push_back("-o");
8640 CmdArgs.push_back(Output.getFilename());
8641
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008642 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008643 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008644
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008645 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008646 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008647
8648 // Handle the debug info splitting at object creation time if we're
8649 // creating an object.
8650 // TODO: Currently only works on linux with newer objcopy.
8651 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008652 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008653 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008654 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008655}
8656
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008657static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008658 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008659 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008660 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008661 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8662 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008663 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008664 CmdArgs.push_back("-lgcc");
8665
Logan Chien3d3373c2012-11-19 12:04:11 +00008666 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008667 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008668 CmdArgs.push_back("-lgcc");
8669 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008670 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008671 CmdArgs.push_back("--as-needed");
8672 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008673 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008674 CmdArgs.push_back("--no-as-needed");
8675 }
8676
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008677 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008678 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008679 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008680 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008681
8682 // According to Android ABI, we have to link with libdl if we are
8683 // linking with non-static libgcc.
8684 //
8685 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8686 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8687 if (isAndroid && !StaticLibgcc)
8688 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008689}
8690
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008691static std::string getLinuxDynamicLinker(const ArgList &Args,
8692 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008693 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8694
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008695 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008696 if (ToolChain.getTriple().isArch64Bit())
8697 return "/system/bin/linker64";
8698 else
8699 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008700 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8701 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008702 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008703 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008704 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008705 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008706 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008707 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008708 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008709 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008710 return "/lib/ld-linux-armhf.so.3";
8711 else
8712 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008713 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8714 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008715 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008716 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008717 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008718 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008719 return "/lib/ld-linux.so.3";
8720 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8721 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008722 std::string LibDir =
8723 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008724 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008725 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008726 if (mips::isUCLibc(Args))
8727 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008728 else if (!ToolChain.getTriple().hasEnvironment()) {
8729 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8730 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8731 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8732 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008733 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008734
8735 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008736 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008737 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008738 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008739 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8740 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008741 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008742 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008743 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8744 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008745 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008746 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008747 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008748 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008749 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008750 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008751 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8752 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008753 else
8754 return "/lib64/ld-linux-x86-64.so.2";
8755}
8756
Renato Golinc4b49242014-02-13 10:01:16 +00008757static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008758 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008759 // Make use of compiler-rt if --rtlib option is used
8760 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8761
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008762 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008763 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008764 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008765 default:
8766 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008767 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008768 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008769 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008770 break;
8771 }
Renato Golinc4b49242014-02-13 10:01:16 +00008772 break;
8773 case ToolChain::RLT_Libgcc:
8774 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8775 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008776 }
8777}
8778
Rafael Espindola1e085772014-08-15 17:14:35 +00008779static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8780 switch (T.getArch()) {
8781 case llvm::Triple::x86:
8782 return "elf_i386";
8783 case llvm::Triple::aarch64:
8784 return "aarch64linux";
8785 case llvm::Triple::aarch64_be:
8786 return "aarch64_be_linux";
8787 case llvm::Triple::arm:
8788 case llvm::Triple::thumb:
8789 return "armelf_linux_eabi";
8790 case llvm::Triple::armeb:
8791 case llvm::Triple::thumbeb:
8792 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8793 case llvm::Triple::ppc:
8794 return "elf32ppclinux";
8795 case llvm::Triple::ppc64:
8796 return "elf64ppc";
8797 case llvm::Triple::ppc64le:
8798 return "elf64lppc";
8799 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008800 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008801 return "elf32_sparc";
8802 case llvm::Triple::sparcv9:
8803 return "elf64_sparc";
8804 case llvm::Triple::mips:
8805 return "elf32btsmip";
8806 case llvm::Triple::mipsel:
8807 return "elf32ltsmip";
8808 case llvm::Triple::mips64:
8809 if (mips::hasMipsAbiArg(Args, "n32"))
8810 return "elf32btsmipn32";
8811 return "elf64btsmip";
8812 case llvm::Triple::mips64el:
8813 if (mips::hasMipsAbiArg(Args, "n32"))
8814 return "elf32ltsmipn32";
8815 return "elf64ltsmip";
8816 case llvm::Triple::systemz:
8817 return "elf64_s390";
8818 case llvm::Triple::x86_64:
8819 if (T.getEnvironment() == llvm::Triple::GNUX32)
8820 return "elf32_x86_64";
8821 return "elf_x86_64";
8822 default:
8823 llvm_unreachable("Unexpected arch");
8824 }
8825}
8826
Douglas Katzman95354292015-06-23 20:42:09 +00008827void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8828 const InputInfo &Output,
8829 const InputInfoList &Inputs,
8830 const ArgList &Args,
8831 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008832 const toolchains::Linux &ToolChain =
8833 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008834 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008835
8836 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8837 llvm::Triple Triple = llvm::Triple(TripleStr);
8838
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008839 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008840 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008841 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008842 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8843 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008844 const bool HasCRTBeginEndFiles =
8845 ToolChain.getTriple().hasEnvironment() ||
8846 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008847
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008848 ArgStringList CmdArgs;
8849
Rafael Espindolad1002f62010-11-15 18:28:16 +00008850 // Silence warning for "clang -g foo.o -o foo"
8851 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008852 // and "clang -emit-llvm foo.o -o foo"
8853 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008854 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008855 // handled somewhere else.
8856 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008857
Peter Collingbourne39719a72015-11-20 20:49:39 +00008858 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8859 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008860 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008861 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008862 CmdArgs.push_back("-target");
8863 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8864 }
8865
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008866 if (!D.SysRoot.empty())
8867 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008868
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008869 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008870 CmdArgs.push_back("-pie");
8871
Rafael Espindola1c76c592010-11-07 22:57:16 +00008872 if (Args.hasArg(options::OPT_rdynamic))
8873 CmdArgs.push_back("-export-dynamic");
8874
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008875 if (Args.hasArg(options::OPT_s))
8876 CmdArgs.push_back("-s");
8877
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008878 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008879 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008880
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008881 for (const auto &Opt : ToolChain.ExtraOpts)
8882 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008883
8884 if (!Args.hasArg(options::OPT_static)) {
8885 CmdArgs.push_back("--eh-frame-hdr");
8886 }
8887
8888 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008889 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008890
8891 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008892 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8893 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008894 CmdArgs.push_back("-Bstatic");
8895 else
8896 CmdArgs.push_back("-static");
8897 } else if (Args.hasArg(options::OPT_shared)) {
8898 CmdArgs.push_back("-shared");
8899 }
8900
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008901 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8902 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008903 (!Args.hasArg(options::OPT_static) &&
8904 !Args.hasArg(options::OPT_shared))) {
8905 CmdArgs.push_back("-dynamic-linker");
8906 CmdArgs.push_back(Args.MakeArgString(
8907 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8908 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008909
8910 CmdArgs.push_back("-o");
8911 CmdArgs.push_back(Output.getFilename());
8912
Douglas Katzman78b37b02015-11-17 20:28:07 +00008913 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008914 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008915 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008916 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008917 if (Args.hasArg(options::OPT_pg))
8918 crt1 = "gcrt1.o";
8919 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008920 crt1 = "Scrt1.o";
8921 else
8922 crt1 = "crt1.o";
8923 }
8924 if (crt1)
8925 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008926
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008927 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8928 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008929
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008930 const char *crtbegin;
8931 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008932 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008933 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008934 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008935 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008936 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008937 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008938 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008939
8940 if (HasCRTBeginEndFiles)
8941 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008942
8943 // Add crtfastmath.o if available and fast math is enabled.
8944 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008945 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008946
8947 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008948 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008949
Douglas Katzman6059ef92015-11-17 17:41:23 +00008950 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008951
Teresa Johnson945bc502015-10-15 20:35:53 +00008952 if (D.isUsingLTO())
8953 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008954
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008955 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8956 CmdArgs.push_back("--no-demangle");
8957
Alexey Samsonov52550342014-09-15 19:58:40 +00008958 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008959 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008960 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008961 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008962
Douglas Katzman78b37b02015-11-17 20:28:07 +00008963 if (D.CCCIsCXX() &&
8964 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008965 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008966 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008967 if (OnlyLibstdcxxStatic)
8968 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008969 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008970 if (OnlyLibstdcxxStatic)
8971 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008972 CmdArgs.push_back("-lm");
8973 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008974 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8975 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008976
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008977 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008978 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8979 if (Args.hasArg(options::OPT_static))
8980 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008981
Alexey Samsonov52550342014-09-15 19:58:40 +00008982 if (NeedsSanitizerDeps)
8983 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8984
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008985 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8986 Args.hasArg(options::OPT_pthreads);
8987
8988 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8989 options::OPT_fno_openmp, false)) {
8990 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8991 // FIXME: Does this really make sense for all GNU toolchains?
8992 WantPthread = true;
8993
8994 // Also link the particular OpenMP runtimes.
8995 switch (getOpenMPRuntime(ToolChain, Args)) {
8996 case OMPRT_OMP:
8997 CmdArgs.push_back("-lomp");
8998 break;
8999 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009000 CmdArgs.push_back("-lgomp");
9001
9002 // FIXME: Exclude this for platforms with libgomp that don't require
9003 // librt. Most modern Linux platforms require it, but some may not.
9004 CmdArgs.push_back("-lrt");
9005 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009006 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009007 CmdArgs.push_back("-liomp5");
9008 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009009 case OMPRT_Unknown:
9010 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009011 break;
9012 }
Chandler Carruth01538002013-01-17 13:19:29 +00009013 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009014
Renato Golinc4b49242014-02-13 10:01:16 +00009015 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009016
Richard Smith31d1de22015-05-20 22:48:44 +00009017 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009018 CmdArgs.push_back("-lpthread");
9019
Rafael Espindolab17bc532016-01-25 18:29:16 +00009020 if (Args.hasArg(options::OPT_fsplit_stack))
9021 CmdArgs.push_back("--wrap=pthread_create");
9022
Chandler Carruth94a32012012-05-14 18:31:18 +00009023 CmdArgs.push_back("-lc");
9024
9025 if (Args.hasArg(options::OPT_static))
9026 CmdArgs.push_back("--end-group");
9027 else
Renato Golinc4b49242014-02-13 10:01:16 +00009028 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009029 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009030
Rafael Espindola81937ec2010-12-01 01:52:43 +00009031 if (!Args.hasArg(options::OPT_nostartfiles)) {
9032 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009033 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009034 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009035 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009036 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009037 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009038 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009039
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009040 if (HasCRTBeginEndFiles)
9041 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009042 if (!isAndroid)
9043 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009044 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009045 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009046
Peter Collingbourne39719a72015-11-20 20:49:39 +00009047 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009048}
9049
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009050// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9051// for the various SFI requirements like register masking. The assembly tool
9052// inserts the file containing the macros as an input into all the assembly
9053// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009054void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9055 const InputInfo &Output,
9056 const InputInfoList &Inputs,
9057 const ArgList &Args,
9058 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009059 const toolchains::NaClToolChain &ToolChain =
9060 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009061 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009062 "nacl-arm-macros.s");
9063 InputInfoList NewInputs;
9064 NewInputs.push_back(NaClMacros);
9065 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009066 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9067 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009068}
9069
Douglas Katzman750cfc52015-06-29 18:42:16 +00009070// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009071// we use static by default, do not yet support sanitizers or LTO, and a few
9072// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009073// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009074void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9075 const InputInfo &Output,
9076 const InputInfoList &Inputs,
9077 const ArgList &Args,
9078 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009079
Douglas Katzman54366072015-07-27 16:53:08 +00009080 const toolchains::NaClToolChain &ToolChain =
9081 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009082 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009083 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009084 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009085 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009086
9087 ArgStringList CmdArgs;
9088
9089 // Silence warning for "clang -g foo.o -o foo"
9090 Args.ClaimAllArgs(options::OPT_g_Group);
9091 // and "clang -emit-llvm foo.o -o foo"
9092 Args.ClaimAllArgs(options::OPT_emit_llvm);
9093 // and for "clang -w foo.o -o foo". Other warning options are already
9094 // handled somewhere else.
9095 Args.ClaimAllArgs(options::OPT_w);
9096
9097 if (!D.SysRoot.empty())
9098 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9099
9100 if (Args.hasArg(options::OPT_rdynamic))
9101 CmdArgs.push_back("-export-dynamic");
9102
9103 if (Args.hasArg(options::OPT_s))
9104 CmdArgs.push_back("-s");
9105
Douglas Katzman54366072015-07-27 16:53:08 +00009106 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9107 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009108 CmdArgs.push_back("--build-id");
9109
9110 if (!IsStatic)
9111 CmdArgs.push_back("--eh-frame-hdr");
9112
9113 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009114 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009115 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009116 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009117 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009118 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009119 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009120 else if (Arch == llvm::Triple::mipsel)
9121 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009122 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009123 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9124 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009125
9126 if (IsStatic)
9127 CmdArgs.push_back("-static");
9128 else if (Args.hasArg(options::OPT_shared))
9129 CmdArgs.push_back("-shared");
9130
9131 CmdArgs.push_back("-o");
9132 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009133 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009134 if (!Args.hasArg(options::OPT_shared))
9135 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9136 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9137
9138 const char *crtbegin;
9139 if (IsStatic)
9140 crtbegin = "crtbeginT.o";
9141 else if (Args.hasArg(options::OPT_shared))
9142 crtbegin = "crtbeginS.o";
9143 else
9144 crtbegin = "crtbegin.o";
9145 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9146 }
9147
9148 Args.AddAllArgs(CmdArgs, options::OPT_L);
9149 Args.AddAllArgs(CmdArgs, options::OPT_u);
9150
Douglas Katzman6059ef92015-11-17 17:41:23 +00009151 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009152
9153 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9154 CmdArgs.push_back("--no-demangle");
9155
9156 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9157
Douglas Katzman78b37b02015-11-17 20:28:07 +00009158 if (D.CCCIsCXX() &&
9159 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009160 bool OnlyLibstdcxxStatic =
9161 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009162 if (OnlyLibstdcxxStatic)
9163 CmdArgs.push_back("-Bstatic");
9164 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9165 if (OnlyLibstdcxxStatic)
9166 CmdArgs.push_back("-Bdynamic");
9167 CmdArgs.push_back("-lm");
9168 }
9169
9170 if (!Args.hasArg(options::OPT_nostdlib)) {
9171 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9172 // Always use groups, since it has no effect on dynamic libraries.
9173 CmdArgs.push_back("--start-group");
9174 CmdArgs.push_back("-lc");
9175 // NaCl's libc++ currently requires libpthread, so just always include it
9176 // in the group for C++.
9177 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009178 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009179 // Gold, used by Mips, handles nested groups differently than ld, and
9180 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9181 // which is not a desired behaviour here.
9182 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9183 if (getToolChain().getArch() == llvm::Triple::mipsel)
9184 CmdArgs.push_back("-lnacl");
9185
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009186 CmdArgs.push_back("-lpthread");
9187 }
9188
9189 CmdArgs.push_back("-lgcc");
9190 CmdArgs.push_back("--as-needed");
9191 if (IsStatic)
9192 CmdArgs.push_back("-lgcc_eh");
9193 else
9194 CmdArgs.push_back("-lgcc_s");
9195 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009196
9197 // Mips needs to create and use pnacl_legacy library that contains
9198 // definitions from bitcode/pnaclmm.c and definitions for
9199 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9200 if (getToolChain().getArch() == llvm::Triple::mipsel)
9201 CmdArgs.push_back("-lpnacl_legacy");
9202
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009203 CmdArgs.push_back("--end-group");
9204 }
9205
9206 if (!Args.hasArg(options::OPT_nostartfiles)) {
9207 const char *crtend;
9208 if (Args.hasArg(options::OPT_shared))
9209 crtend = "crtendS.o";
9210 else
9211 crtend = "crtend.o";
9212
9213 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9214 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9215 }
9216 }
9217
Peter Collingbourne39719a72015-11-20 20:49:39 +00009218 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9219 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009220}
9221
Douglas Katzman95354292015-06-23 20:42:09 +00009222void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9223 const InputInfo &Output,
9224 const InputInfoList &Inputs,
9225 const ArgList &Args,
9226 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009227 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009228 ArgStringList CmdArgs;
9229
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009230 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009231
9232 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009233 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009235 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009236 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009237
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009238 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009239 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009240}
9241
Douglas Katzman95354292015-06-23 20:42:09 +00009242void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9243 const InputInfo &Output,
9244 const InputInfoList &Inputs,
9245 const ArgList &Args,
9246 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009247 const Driver &D = getToolChain().getDriver();
9248 ArgStringList CmdArgs;
9249
Daniel Dunbarb440f562010-08-02 02:38:21 +00009250 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009251 CmdArgs.push_back("-o");
9252 CmdArgs.push_back(Output.getFilename());
9253 } else {
9254 assert(Output.isNothing() && "Invalid output.");
9255 }
9256
Douglas Katzman78b37b02015-11-17 20:28:07 +00009257 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009258 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9259 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9260 CmdArgs.push_back(
9261 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9262 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009263 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009264
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009265 Args.AddAllArgs(CmdArgs,
9266 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009267
Daniel Dunbar54423b22010-09-17 00:24:54 +00009268 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009269
Xinliang David Li69306c02015-10-22 06:15:31 +00009270 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009271
Douglas Katzman78b37b02015-11-17 20:28:07 +00009272 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009273 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009274 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009275 CmdArgs.push_back("-lm");
9276 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009277 }
9278
Douglas Katzman78b37b02015-11-17 20:28:07 +00009279 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009280 if (Args.hasArg(options::OPT_pthread))
9281 CmdArgs.push_back("-lpthread");
9282 CmdArgs.push_back("-lc");
9283 CmdArgs.push_back("-lCompilerRT-Generic");
9284 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9285 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009286 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009287 }
9288
Logan Chieneb9162f2014-06-26 14:23:45 +00009289 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009290 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009291}
9292
Daniel Dunbarcc912342009-05-02 18:28:39 +00009293/// DragonFly Tools
9294
9295// For now, DragonFly Assemble does just about the same as for
9296// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009297void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9298 const InputInfo &Output,
9299 const InputInfoList &Inputs,
9300 const ArgList &Args,
9301 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009302 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009303 ArgStringList CmdArgs;
9304
9305 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9306 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009307 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009308 CmdArgs.push_back("--32");
9309
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009310 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009311
9312 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009313 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009314
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009315 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009316 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009317
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009318 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009319 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009320}
9321
Douglas Katzman95354292015-06-23 20:42:09 +00009322void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9323 const InputInfo &Output,
9324 const InputInfoList &Inputs,
9325 const ArgList &Args,
9326 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009327 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009328 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009329
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009330 if (!D.SysRoot.empty())
9331 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9332
John McCall65b8da02013-04-11 22:55:55 +00009333 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009334 if (Args.hasArg(options::OPT_static)) {
9335 CmdArgs.push_back("-Bstatic");
9336 } else {
John McCall65b8da02013-04-11 22:55:55 +00009337 if (Args.hasArg(options::OPT_rdynamic))
9338 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009339 if (Args.hasArg(options::OPT_shared))
9340 CmdArgs.push_back("-Bshareable");
9341 else {
9342 CmdArgs.push_back("-dynamic-linker");
9343 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9344 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009345 CmdArgs.push_back("--hash-style=gnu");
9346 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009347 }
9348
9349 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9350 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009351 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009352 CmdArgs.push_back("-m");
9353 CmdArgs.push_back("elf_i386");
9354 }
9355
Daniel Dunbarb440f562010-08-02 02:38:21 +00009356 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009357 CmdArgs.push_back("-o");
9358 CmdArgs.push_back(Output.getFilename());
9359 } else {
9360 assert(Output.isNothing() && "Invalid output.");
9361 }
9362
Douglas Katzman78b37b02015-11-17 20:28:07 +00009363 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009364 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009365 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009366 CmdArgs.push_back(
9367 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009368 else {
9369 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009370 CmdArgs.push_back(
9371 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009372 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009373 CmdArgs.push_back(
9374 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009375 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009376 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009377 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009378 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009379 CmdArgs.push_back(
9380 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009381 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009382 CmdArgs.push_back(
9383 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009384 }
9385
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009386 Args.AddAllArgs(CmdArgs,
9387 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009388
Daniel Dunbar54423b22010-09-17 00:24:54 +00009389 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009390
Douglas Katzman78b37b02015-11-17 20:28:07 +00009391 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009392 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009393
9394 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009395 CmdArgs.push_back("-rpath");
9396 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009397 }
9398
Hans Wennborg70850d82013-07-18 20:29:38 +00009399 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009400 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009401 CmdArgs.push_back("-lm");
9402 }
9403
Daniel Dunbarcc912342009-05-02 18:28:39 +00009404 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009405 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009406
9407 if (!Args.hasArg(options::OPT_nolibc)) {
9408 CmdArgs.push_back("-lc");
9409 }
9410
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009411 if (Args.hasArg(options::OPT_static) ||
9412 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009413 CmdArgs.push_back("-lgcc");
9414 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009415 } else {
9416 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009417 CmdArgs.push_back("-lgcc_pic");
9418 if (!Args.hasArg(options::OPT_shared))
9419 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009420 } else {
John McCall65b8da02013-04-11 22:55:55 +00009421 CmdArgs.push_back("-lgcc");
9422 CmdArgs.push_back("--as-needed");
9423 CmdArgs.push_back("-lgcc_pic");
9424 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009425 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009426 }
9427 }
9428
Douglas Katzman78b37b02015-11-17 20:28:07 +00009429 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009430 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009431 CmdArgs.push_back(
9432 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009433 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009434 CmdArgs.push_back(
9435 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9436 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009437 }
9438
Xinliang David Li69306c02015-10-22 06:15:31 +00009439 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009440
Logan Chieneb9162f2014-06-26 14:23:45 +00009441 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009442 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009443}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009444
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009445// Try to find Exe from a Visual Studio distribution. This first tries to find
9446// an installed copy of Visual Studio and, failing that, looks in the PATH,
9447// making sure that whatever executable that's found is not a same-named exe
9448// from clang itself to prevent clang from falling back to itself.
9449static std::string FindVisualStudioExecutable(const ToolChain &TC,
9450 const char *Exe,
9451 const char *ClangProgramPath) {
9452 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9453 std::string visualStudioBinDir;
9454 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9455 visualStudioBinDir)) {
9456 SmallString<128> FilePath(visualStudioBinDir);
9457 llvm::sys::path::append(FilePath, Exe);
9458 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9459 return FilePath.str();
9460 }
9461
9462 return Exe;
9463}
9464
Douglas Katzman95354292015-06-23 20:42:09 +00009465void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9466 const InputInfo &Output,
9467 const InputInfoList &Inputs,
9468 const ArgList &Args,
9469 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009470 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009471 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009472
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009473 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9474 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009475 CmdArgs.push_back(
9476 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009477
Douglas Katzman78b37b02015-11-17 20:28:07 +00009478 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9479 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009480 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009481
Zachary Turner10d75b22014-10-22 20:40:43 +00009482 if (!llvm::sys::Process::GetEnv("LIB")) {
9483 // If the VC environment hasn't been configured (perhaps because the user
9484 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009485 // the environment variable is set however, assume the user knows what
9486 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009487 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009488 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009489 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9490 SmallString<128> LibDir(VisualStudioDir);
9491 llvm::sys::path::append(LibDir, "VC", "lib");
9492 switch (MSVC.getArch()) {
9493 case llvm::Triple::x86:
9494 // x86 just puts the libraries directly in lib
9495 break;
9496 case llvm::Triple::x86_64:
9497 llvm::sys::path::append(LibDir, "amd64");
9498 break;
9499 case llvm::Triple::arm:
9500 llvm::sys::path::append(LibDir, "arm");
9501 break;
9502 default:
9503 break;
9504 }
9505 CmdArgs.push_back(
9506 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009507
9508 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9509 std::string UniversalCRTLibPath;
9510 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9511 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9512 UniversalCRTLibPath.c_str()));
9513 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009514 }
9515
9516 std::string WindowsSdkLibPath;
9517 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9518 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9519 WindowsSdkLibPath.c_str()));
9520 }
9521
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009522 CmdArgs.push_back("-nologo");
9523
Reid Kleckner124955a2015-08-05 18:51:13 +00009524 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009525 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009526
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009527 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009528 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009529 if (DLL) {
9530 CmdArgs.push_back(Args.MakeArgString("-dll"));
9531
9532 SmallString<128> ImplibName(Output.getFilename());
9533 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009534 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009535 }
9536
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009537 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009538 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009539 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009540 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009541 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9542 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009543 // Make sure the dynamic runtime thunk is not optimized out at link time
9544 // to ensure proper SEH handling.
9545 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009546 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009547 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009548 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009549 for (const auto &Lib : {"asan", "asan_cxx"})
9550 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009551 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009552 }
9553
Hans Wennborg2e274592013-08-13 23:38:57 +00009554 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009555
Alexey Bataevc7e84352015-08-19 04:49:01 +00009556 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9557 options::OPT_fno_openmp, false)) {
9558 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9559 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9560 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9561 TC.getDriver().Dir + "/../lib"));
9562 switch (getOpenMPRuntime(getToolChain(), Args)) {
9563 case OMPRT_OMP:
9564 CmdArgs.push_back("-defaultlib:libomp.lib");
9565 break;
9566 case OMPRT_IOMP5:
9567 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9568 break;
9569 case OMPRT_GOMP:
9570 break;
9571 case OMPRT_Unknown:
9572 // Already diagnosed.
9573 break;
9574 }
9575 }
9576
Reid Kleckner337188f2014-09-16 19:22:00 +00009577 // Add filenames, libraries, and other linker inputs.
9578 for (const auto &Input : Inputs) {
9579 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009580 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009581 continue;
9582 }
9583
9584 const Arg &A = Input.getInputArg();
9585
9586 // Render -l options differently for the MSVC linker.
9587 if (A.getOption().matches(options::OPT_l)) {
9588 StringRef Lib = A.getValue();
9589 const char *LinkLibArg;
9590 if (Lib.endswith(".lib"))
9591 LinkLibArg = Args.MakeArgString(Lib);
9592 else
9593 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9594 CmdArgs.push_back(LinkLibArg);
9595 continue;
9596 }
9597
9598 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9599 // or -L. Render it, even if MSVC doesn't understand it.
9600 A.renderAsInput(Args, CmdArgs);
9601 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009602
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009603 TC.addProfileRTLibs(Args, CmdArgs);
9604
Zachary Turner719f58c2014-12-01 23:06:47 +00009605 // We need to special case some linker paths. In the case of lld, we need to
9606 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9607 // linker, we need to use a special search algorithm.
9608 llvm::SmallString<128> linkPath;
9609 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9610 if (Linker.equals_lower("lld"))
9611 Linker = "lld-link";
9612
9613 if (Linker.equals_lower("link")) {
9614 // If we're using the MSVC linker, it's not sufficient to just use link
9615 // from the program PATH, because other environments like GnuWin32 install
9616 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009617 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009618 C.getDriver().getClangProgramPath());
9619 } else {
9620 linkPath = Linker;
9621 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009622 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009623 }
9624
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009625 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009626 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009627}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009628
Douglas Katzman95354292015-06-23 20:42:09 +00009629void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9630 const InputInfo &Output,
9631 const InputInfoList &Inputs,
9632 const ArgList &Args,
9633 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009634 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9635}
9636
Douglas Katzman95354292015-06-23 20:42:09 +00009637std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009638 Compilation &C, const JobAction &JA, const InputInfo &Output,
9639 const InputInfoList &Inputs, const ArgList &Args,
9640 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009641 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009642 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009643 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009644 CmdArgs.push_back("/W0"); // No warnings.
9645
9646 // The goal is to be able to invoke this tool correctly based on
9647 // any flag accepted by clang-cl.
9648
9649 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009650 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009651
9652 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009653 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9654 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9655 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009656 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9657 if (A->getOption().getID() == options::OPT_O0) {
9658 CmdArgs.push_back("/Od");
9659 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009660 CmdArgs.push_back("/Og");
9661
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009662 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009663 if (OptLevel == "s" || OptLevel == "z")
9664 CmdArgs.push_back("/Os");
9665 else
9666 CmdArgs.push_back("/Ot");
9667
9668 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009669 }
9670 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009671 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9672 options::OPT_fno_omit_frame_pointer))
9673 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9674 ? "/Oy"
9675 : "/Oy-");
9676 if (!Args.hasArg(options::OPT_fwritable_strings))
9677 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009678
Nico Weber3f8dafb2015-03-12 19:37:10 +00009679 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009680 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9681
David Majnemerf6072342014-07-01 22:24:56 +00009682 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9683 /*default=*/false))
9684 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009685 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9686 options::OPT_fno_function_sections))
9687 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9688 ? "/Gy"
9689 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009690 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9691 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009692 CmdArgs.push_back(
9693 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009694 if (Args.hasArg(options::OPT_fsyntax_only))
9695 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009696 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9697 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009698 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009699
Nico Weber3f8dafb2015-03-12 19:37:10 +00009700 std::vector<std::string> Includes =
9701 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009702 for (const auto &Include : Includes)
9703 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009704
Hans Wennborg87cfa712013-09-19 20:32:16 +00009705 // Flags that can simply be passed through.
9706 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9707 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009708 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009709 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009710
9711 // The order of these flags is relevant, so pick the last one.
9712 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9713 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9714 A->render(Args, CmdArgs);
9715
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009716 // Pass through all unknown arguments so that the fallback command can see
9717 // them too.
9718 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9719
Hans Wennborg87cfa712013-09-19 20:32:16 +00009720 // Input filename.
9721 assert(Inputs.size() == 1);
9722 const InputInfo &II = Inputs[0];
9723 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9724 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9725 if (II.isFilename())
9726 CmdArgs.push_back(II.getFilename());
9727 else
9728 II.getInputArg().renderAsInput(Args, CmdArgs);
9729
9730 // Output filename.
9731 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009732 const char *Fo =
9733 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009734 CmdArgs.push_back(Fo);
9735
Hans Wennborg188382e2013-09-20 18:16:35 +00009736 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009737 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9738 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009739 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009740 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009741}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009742
Yaron Keren1c0070c2015-07-02 04:45:27 +00009743/// MinGW Tools
9744void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9745 const InputInfo &Output,
9746 const InputInfoList &Inputs,
9747 const ArgList &Args,
9748 const char *LinkingOutput) const {
9749 claimNoWarnArgs(Args);
9750 ArgStringList CmdArgs;
9751
9752 if (getToolChain().getArch() == llvm::Triple::x86) {
9753 CmdArgs.push_back("--32");
9754 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9755 CmdArgs.push_back("--64");
9756 }
9757
9758 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9759
9760 CmdArgs.push_back("-o");
9761 CmdArgs.push_back(Output.getFilename());
9762
9763 for (const auto &II : Inputs)
9764 CmdArgs.push_back(II.getFilename());
9765
9766 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009767 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009768
9769 if (Args.hasArg(options::OPT_gsplit_dwarf))
9770 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9771 SplitDebugName(Args, Inputs[0]));
9772}
9773
9774void MinGW::Linker::AddLibGCC(const ArgList &Args,
9775 ArgStringList &CmdArgs) const {
9776 if (Args.hasArg(options::OPT_mthreads))
9777 CmdArgs.push_back("-lmingwthrd");
9778 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009779
Yaron Kerenaa281332015-08-09 00:24:07 +00009780 // Make use of compiler-rt if --rtlib option is used
9781 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9782 if (RLT == ToolChain::RLT_Libgcc) {
9783 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9784 Args.hasArg(options::OPT_static);
9785 bool Shared = Args.hasArg(options::OPT_shared);
9786 bool CXX = getToolChain().getDriver().CCCIsCXX();
9787
9788 if (Static || (!CXX && !Shared)) {
9789 CmdArgs.push_back("-lgcc");
9790 CmdArgs.push_back("-lgcc_eh");
9791 } else {
9792 CmdArgs.push_back("-lgcc_s");
9793 CmdArgs.push_back("-lgcc");
9794 }
9795 } else {
9796 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9797 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009798
Yaron Keren1c0070c2015-07-02 04:45:27 +00009799 CmdArgs.push_back("-lmoldname");
9800 CmdArgs.push_back("-lmingwex");
9801 CmdArgs.push_back("-lmsvcrt");
9802}
9803
9804void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9805 const InputInfo &Output,
9806 const InputInfoList &Inputs,
9807 const ArgList &Args,
9808 const char *LinkingOutput) const {
9809 const ToolChain &TC = getToolChain();
9810 const Driver &D = TC.getDriver();
9811 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9812
9813 ArgStringList CmdArgs;
9814
9815 // Silence warning for "clang -g foo.o -o foo"
9816 Args.ClaimAllArgs(options::OPT_g_Group);
9817 // and "clang -emit-llvm foo.o -o foo"
9818 Args.ClaimAllArgs(options::OPT_emit_llvm);
9819 // and for "clang -w foo.o -o foo". Other warning options are already
9820 // handled somewhere else.
9821 Args.ClaimAllArgs(options::OPT_w);
9822
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009823 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9824 if (LinkerName.equals_lower("lld")) {
9825 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009826 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009827 } else if (!LinkerName.equals_lower("ld")) {
9828 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009829 }
9830
Yaron Keren1c0070c2015-07-02 04:45:27 +00009831 if (!D.SysRoot.empty())
9832 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9833
9834 if (Args.hasArg(options::OPT_s))
9835 CmdArgs.push_back("-s");
9836
9837 CmdArgs.push_back("-m");
9838 if (TC.getArch() == llvm::Triple::x86)
9839 CmdArgs.push_back("i386pe");
9840 if (TC.getArch() == llvm::Triple::x86_64)
9841 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009842 if (TC.getArch() == llvm::Triple::arm)
9843 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009844
9845 if (Args.hasArg(options::OPT_mwindows)) {
9846 CmdArgs.push_back("--subsystem");
9847 CmdArgs.push_back("windows");
9848 } else if (Args.hasArg(options::OPT_mconsole)) {
9849 CmdArgs.push_back("--subsystem");
9850 CmdArgs.push_back("console");
9851 }
9852
9853 if (Args.hasArg(options::OPT_static))
9854 CmdArgs.push_back("-Bstatic");
9855 else {
9856 if (Args.hasArg(options::OPT_mdll))
9857 CmdArgs.push_back("--dll");
9858 else if (Args.hasArg(options::OPT_shared))
9859 CmdArgs.push_back("--shared");
9860 CmdArgs.push_back("-Bdynamic");
9861 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9862 CmdArgs.push_back("-e");
9863 if (TC.getArch() == llvm::Triple::x86)
9864 CmdArgs.push_back("_DllMainCRTStartup@12");
9865 else
9866 CmdArgs.push_back("DllMainCRTStartup");
9867 CmdArgs.push_back("--enable-auto-image-base");
9868 }
9869 }
9870
9871 CmdArgs.push_back("-o");
9872 CmdArgs.push_back(Output.getFilename());
9873
9874 Args.AddAllArgs(CmdArgs, options::OPT_e);
9875 // FIXME: add -N, -n flags
9876 Args.AddLastArg(CmdArgs, options::OPT_r);
9877 Args.AddLastArg(CmdArgs, options::OPT_s);
9878 Args.AddLastArg(CmdArgs, options::OPT_t);
9879 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9880 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9881
Douglas Katzman78b37b02015-11-17 20:28:07 +00009882 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009883 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9884 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9885 } else {
9886 if (Args.hasArg(options::OPT_municode))
9887 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9888 else
9889 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9890 }
9891 if (Args.hasArg(options::OPT_pg))
9892 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9893 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9894 }
9895
9896 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009897 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009898 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9899
9900 // TODO: Add ASan stuff here
9901
9902 // TODO: Add profile stuff here
9903
Douglas Katzman78b37b02015-11-17 20:28:07 +00009904 if (D.CCCIsCXX() &&
9905 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009906 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9907 !Args.hasArg(options::OPT_static);
9908 if (OnlyLibstdcxxStatic)
9909 CmdArgs.push_back("-Bstatic");
9910 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9911 if (OnlyLibstdcxxStatic)
9912 CmdArgs.push_back("-Bdynamic");
9913 }
9914
9915 if (!Args.hasArg(options::OPT_nostdlib)) {
9916 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9917 if (Args.hasArg(options::OPT_static))
9918 CmdArgs.push_back("--start-group");
9919
9920 if (Args.hasArg(options::OPT_fstack_protector) ||
9921 Args.hasArg(options::OPT_fstack_protector_strong) ||
9922 Args.hasArg(options::OPT_fstack_protector_all)) {
9923 CmdArgs.push_back("-lssp_nonshared");
9924 CmdArgs.push_back("-lssp");
9925 }
9926 if (Args.hasArg(options::OPT_fopenmp))
9927 CmdArgs.push_back("-lgomp");
9928
9929 AddLibGCC(Args, CmdArgs);
9930
9931 if (Args.hasArg(options::OPT_pg))
9932 CmdArgs.push_back("-lgmon");
9933
Yaron Kerenadce68e2015-07-06 18:52:19 +00009934 if (Args.hasArg(options::OPT_pthread))
9935 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009936
9937 // add system libraries
9938 if (Args.hasArg(options::OPT_mwindows)) {
9939 CmdArgs.push_back("-lgdi32");
9940 CmdArgs.push_back("-lcomdlg32");
9941 }
9942 CmdArgs.push_back("-ladvapi32");
9943 CmdArgs.push_back("-lshell32");
9944 CmdArgs.push_back("-luser32");
9945 CmdArgs.push_back("-lkernel32");
9946
9947 if (Args.hasArg(options::OPT_static))
9948 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009949 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009950 AddLibGCC(Args, CmdArgs);
9951 }
9952
9953 if (!Args.hasArg(options::OPT_nostartfiles)) {
9954 // Add crtfastmath.o if available and fast math is enabled.
9955 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9956
9957 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9958 }
9959 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009960 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009961 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009962}
9963
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009964/// XCore Tools
9965// We pass assemble and link construction to the xcc tool.
9966
Douglas Katzman95354292015-06-23 20:42:09 +00009967void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9968 const InputInfo &Output,
9969 const InputInfoList &Inputs,
9970 const ArgList &Args,
9971 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009972 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009973 ArgStringList CmdArgs;
9974
9975 CmdArgs.push_back("-o");
9976 CmdArgs.push_back(Output.getFilename());
9977
9978 CmdArgs.push_back("-c");
9979
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009980 if (Args.hasArg(options::OPT_v))
9981 CmdArgs.push_back("-v");
9982
Robert Lytton894d25c2014-05-02 09:33:25 +00009983 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9984 if (!A->getOption().matches(options::OPT_g0))
9985 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009986
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009987 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9988 false))
9989 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009990
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009991 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009992
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009993 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009994 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009995
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009996 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009997 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009998}
9999
Douglas Katzman95354292015-06-23 20:42:09 +000010000void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10001 const InputInfo &Output,
10002 const InputInfoList &Inputs,
10003 const ArgList &Args,
10004 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010005 ArgStringList CmdArgs;
10006
10007 if (Output.isFilename()) {
10008 CmdArgs.push_back("-o");
10009 CmdArgs.push_back(Output.getFilename());
10010 } else {
10011 assert(Output.isNothing() && "Invalid output.");
10012 }
10013
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010014 if (Args.hasArg(options::OPT_v))
10015 CmdArgs.push_back("-v");
10016
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010017 // Pass -fexceptions through to the linker if it was present.
10018 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10019 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010020 CmdArgs.push_back("-fexceptions");
10021
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010022 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10023
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010024 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010025 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010026}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010027
Douglas Katzman95354292015-06-23 20:42:09 +000010028void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10029 const InputInfo &Output,
10030 const InputInfoList &Inputs,
10031 const ArgList &Args,
10032 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010033 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010034 const auto &TC =
10035 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10036 ArgStringList CmdArgs;
10037 const char *Exec;
10038
10039 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010040 default:
10041 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010042 case llvm::Triple::arm:
10043 case llvm::Triple::thumb:
10044 break;
10045 case llvm::Triple::x86:
10046 CmdArgs.push_back("--32");
10047 break;
10048 case llvm::Triple::x86_64:
10049 CmdArgs.push_back("--64");
10050 break;
10051 }
10052
10053 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10054
10055 CmdArgs.push_back("-o");
10056 CmdArgs.push_back(Output.getFilename());
10057
10058 for (const auto &Input : Inputs)
10059 CmdArgs.push_back(Input.getFilename());
10060
10061 const std::string Assembler = TC.GetProgramPath("as");
10062 Exec = Args.MakeArgString(Assembler);
10063
Justin Bognerd3371d82015-07-17 03:35:54 +000010064 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010065}
10066
Douglas Katzman95354292015-06-23 20:42:09 +000010067void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10068 const InputInfo &Output,
10069 const InputInfoList &Inputs,
10070 const ArgList &Args,
10071 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010072 const auto &TC =
10073 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10074 const llvm::Triple &T = TC.getTriple();
10075 const Driver &D = TC.getDriver();
10076 SmallString<128> EntryPoint;
10077 ArgStringList CmdArgs;
10078 const char *Exec;
10079
10080 // Silence warning for "clang -g foo.o -o foo"
10081 Args.ClaimAllArgs(options::OPT_g_Group);
10082 // and "clang -emit-llvm foo.o -o foo"
10083 Args.ClaimAllArgs(options::OPT_emit_llvm);
10084 // and for "clang -w foo.o -o foo"
10085 Args.ClaimAllArgs(options::OPT_w);
10086 // Other warning options are already handled somewhere else.
10087
10088 if (!D.SysRoot.empty())
10089 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10090
10091 if (Args.hasArg(options::OPT_pie))
10092 CmdArgs.push_back("-pie");
10093 if (Args.hasArg(options::OPT_rdynamic))
10094 CmdArgs.push_back("-export-dynamic");
10095 if (Args.hasArg(options::OPT_s))
10096 CmdArgs.push_back("--strip-all");
10097
10098 CmdArgs.push_back("-m");
10099 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010100 default:
10101 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010102 case llvm::Triple::arm:
10103 case llvm::Triple::thumb:
10104 // FIXME: this is incorrect for WinCE
10105 CmdArgs.push_back("thumb2pe");
10106 break;
10107 case llvm::Triple::x86:
10108 CmdArgs.push_back("i386pe");
10109 EntryPoint.append("_");
10110 break;
10111 case llvm::Triple::x86_64:
10112 CmdArgs.push_back("i386pep");
10113 break;
10114 }
10115
10116 if (Args.hasArg(options::OPT_shared)) {
10117 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010118 default:
10119 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010120 case llvm::Triple::arm:
10121 case llvm::Triple::thumb:
10122 case llvm::Triple::x86_64:
10123 EntryPoint.append("_DllMainCRTStartup");
10124 break;
10125 case llvm::Triple::x86:
10126 EntryPoint.append("_DllMainCRTStartup@12");
10127 break;
10128 }
10129
10130 CmdArgs.push_back("-shared");
10131 CmdArgs.push_back("-Bdynamic");
10132
10133 CmdArgs.push_back("--enable-auto-image-base");
10134
10135 CmdArgs.push_back("--entry");
10136 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10137 } else {
10138 EntryPoint.append("mainCRTStartup");
10139
10140 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10141 : "-Bdynamic");
10142
Douglas Katzman78b37b02015-11-17 20:28:07 +000010143 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010144 CmdArgs.push_back("--entry");
10145 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10146 }
10147
10148 // FIXME: handle subsystem
10149 }
10150
10151 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010152 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010153
10154 CmdArgs.push_back("-o");
10155 CmdArgs.push_back(Output.getFilename());
10156
10157 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10158 SmallString<261> ImpLib(Output.getFilename());
10159 llvm::sys::path::replace_extension(ImpLib, ".lib");
10160
10161 CmdArgs.push_back("--out-implib");
10162 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10163 }
10164
Douglas Katzman78b37b02015-11-17 20:28:07 +000010165 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010166 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10167 const char *CRTBegin;
10168
10169 CRTBegin =
10170 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10171 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10172 }
10173
10174 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010175 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010176 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10177
10178 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10179 !Args.hasArg(options::OPT_nodefaultlibs)) {
10180 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10181 !Args.hasArg(options::OPT_static);
10182 if (StaticCXX)
10183 CmdArgs.push_back("-Bstatic");
10184 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10185 if (StaticCXX)
10186 CmdArgs.push_back("-Bdynamic");
10187 }
10188
10189 if (!Args.hasArg(options::OPT_nostdlib)) {
10190 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10191 // TODO handle /MT[d] /MD[d]
10192 CmdArgs.push_back("-lmsvcrt");
10193 AddRunTimeLibs(TC, D, CmdArgs, Args);
10194 }
10195 }
10196
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010197 if (TC.getSanitizerArgs().needsAsanRt()) {
10198 // TODO handle /MT[d] /MD[d]
10199 if (Args.hasArg(options::OPT_shared)) {
10200 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10201 } else {
10202 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10203 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10204 // Make sure the dynamic runtime thunk is not optimized out at link time
10205 // to ensure proper SEH handling.
10206 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10207 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10208 ? "___asan_seh_interceptor"
10209 : "__asan_seh_interceptor"));
10210 }
10211 }
10212
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010213 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010214
Justin Bognerd3371d82015-07-17 03:35:54 +000010215 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010216}
Douglas Katzman84a75642015-06-19 14:55:19 +000010217
Douglas Katzman95354292015-06-23 20:42:09 +000010218void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10219 const InputInfo &Output,
10220 const InputInfoList &Inputs,
10221 const ArgList &Args,
10222 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010223 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010224 assert(Inputs.size() == 1);
10225 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010226 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10227 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010228
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010229 if (JA.getKind() == Action::PreprocessJobClass) {
10230 Args.ClaimAllArgs();
10231 CmdArgs.push_back("-E");
10232 } else {
10233 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10234 CmdArgs.push_back("-S");
10235 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10236 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010237 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010238 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010239
Douglas Katzmanf6071112015-08-03 14:34:22 +000010240 // Append all -I, -iquote, -isystem paths, defines/undefines,
10241 // 'f' flags, optimize flags, and warning options.
10242 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010243 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010244 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010245 options::OPT_f_Group, options::OPT_f_clang_Group,
10246 options::OPT_g_Group, options::OPT_M_Group,
10247 options::OPT_O_Group, options::OPT_W_Group});
10248
10249 // If we're producing a dependency file, and assembly is the final action,
10250 // then the name of the target in the dependency file should be the '.o'
10251 // file, not the '.s' file produced by this step. For example, instead of
10252 // /tmp/mumble.s: mumble.c .../someheader.h
10253 // the filename on the lefthand side should be "mumble.o"
10254 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10255 C.getActions().size() == 1 &&
10256 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10257 Arg *A = Args.getLastArg(options::OPT_o);
10258 if (A) {
10259 CmdArgs.push_back("-MT");
10260 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10261 }
10262 }
10263
Douglas Katzman84a75642015-06-19 14:55:19 +000010264 CmdArgs.push_back(II.getFilename());
10265 CmdArgs.push_back("-o");
10266 CmdArgs.push_back(Output.getFilename());
10267
10268 std::string Exec =
10269 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010270 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10271 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010272}
10273
Douglas Katzman95354292015-06-23 20:42:09 +000010274void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10275 const InputInfo &Output,
10276 const InputInfoList &Inputs,
10277 const ArgList &Args,
10278 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010279 ArgStringList CmdArgs;
10280
10281 assert(Inputs.size() == 1);
10282 const InputInfo &II = Inputs[0];
10283 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10284 assert(Output.getType() == types::TY_Object);
10285
10286 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010287 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010288 CmdArgs.push_back("-noSPrefixing");
10289 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010290 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10291 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10292 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010293 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010294 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010295 }
10296 CmdArgs.push_back("-elf"); // Output format.
10297 CmdArgs.push_back(II.getFilename());
10298 CmdArgs.push_back(
10299 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10300
10301 std::string Exec =
10302 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010303 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10304 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010305}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010306
10307void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10308 const InputInfo &Output,
10309 const InputInfoList &Inputs,
10310 const ArgList &Args,
10311 const char *LinkingOutput) const {
10312 const auto &TC =
10313 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10314 const llvm::Triple &T = TC.getTriple();
10315 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010316 bool UseStartfiles =
10317 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010318 bool UseDefaultLibs =
10319 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010320
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010321 if (T.getArch() == llvm::Triple::sparc)
10322 CmdArgs.push_back("-EB");
10323 else // SHAVE assumes little-endian, and sparcel is expressly so.
10324 CmdArgs.push_back("-EL");
10325
10326 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10327 // but we never pass through a --sysroot option and various other bits.
10328 // For example, there are no sanitizers (yet) nor gold linker.
10329
10330 // Eat some arguments that may be present but have no effect.
10331 Args.ClaimAllArgs(options::OPT_g_Group);
10332 Args.ClaimAllArgs(options::OPT_w);
10333 Args.ClaimAllArgs(options::OPT_static_libgcc);
10334
10335 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10336 CmdArgs.push_back("-s");
10337
10338 CmdArgs.push_back("-o");
10339 CmdArgs.push_back(Output.getFilename());
10340
10341 if (UseStartfiles) {
10342 // If you want startfiles, it means you want the builtin crti and crtbegin,
10343 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010344 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10345 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010346 }
10347
10348 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10349 options::OPT_e, options::OPT_s, options::OPT_t,
10350 options::OPT_Z_Flag, options::OPT_r});
10351
Douglas Katzman674a3122015-11-18 16:24:46 +000010352 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010353
10354 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10355
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010356 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010357 if (C.getDriver().CCCIsCXX())
10358 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010359 if (T.getOS() == llvm::Triple::RTEMS) {
10360 CmdArgs.push_back("--start-group");
10361 CmdArgs.push_back("-lc");
10362 // You must provide your own "-L" option to enable finding these.
10363 CmdArgs.push_back("-lrtemscpu");
10364 CmdArgs.push_back("-lrtemsbsp");
10365 CmdArgs.push_back("--end-group");
10366 } else {
10367 CmdArgs.push_back("-lc");
10368 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010369 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010370 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010371 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010372 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10373 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010374 }
10375
10376 std::string Exec =
10377 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10378 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10379 CmdArgs, Inputs));
10380}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010381
10382void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10383 const InputInfo &Output,
10384 const InputInfoList &Inputs,
10385 const ArgList &Args,
10386 const char *LinkingOutput) const {
10387 claimNoWarnArgs(Args);
10388 ArgStringList CmdArgs;
10389
10390 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10391
10392 CmdArgs.push_back("-o");
10393 CmdArgs.push_back(Output.getFilename());
10394
10395 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10396 const InputInfo &Input = Inputs[0];
10397 assert(Input.isFilename() && "Invalid input.");
10398 CmdArgs.push_back(Input.getFilename());
10399
10400 const char *Exec =
10401 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10402 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10403}
10404
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010405static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10406 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10407 if (SanArgs.needsUbsanRt()) {
10408 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10409 }
10410 if (SanArgs.needsAsanRt()) {
10411 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10412 }
10413}
10414
10415static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10416 const JobAction &JA, const InputInfo &Output,
10417 const InputInfoList &Inputs,
10418 const ArgList &Args,
10419 const char *LinkingOutput) {
10420 const toolchains::FreeBSD &ToolChain =
10421 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10422 const Driver &D = ToolChain.getDriver();
10423 ArgStringList CmdArgs;
10424
10425 // Silence warning for "clang -g foo.o -o foo"
10426 Args.ClaimAllArgs(options::OPT_g_Group);
10427 // and "clang -emit-llvm foo.o -o foo"
10428 Args.ClaimAllArgs(options::OPT_emit_llvm);
10429 // and for "clang -w foo.o -o foo". Other warning options are already
10430 // handled somewhere else.
10431 Args.ClaimAllArgs(options::OPT_w);
10432
10433 if (!D.SysRoot.empty())
10434 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10435
10436 if (Args.hasArg(options::OPT_pie))
10437 CmdArgs.push_back("-pie");
10438
10439 if (Args.hasArg(options::OPT_rdynamic))
10440 CmdArgs.push_back("-export-dynamic");
10441 if (Args.hasArg(options::OPT_shared))
10442 CmdArgs.push_back("--oformat=so");
10443
10444 if (Output.isFilename()) {
10445 CmdArgs.push_back("-o");
10446 CmdArgs.push_back(Output.getFilename());
10447 } else {
10448 assert(Output.isNothing() && "Invalid output.");
10449 }
10450
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010451 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10452
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010453 Args.AddAllArgs(CmdArgs, options::OPT_L);
10454 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10455 Args.AddAllArgs(CmdArgs, options::OPT_e);
10456 Args.AddAllArgs(CmdArgs, options::OPT_s);
10457 Args.AddAllArgs(CmdArgs, options::OPT_t);
10458 Args.AddAllArgs(CmdArgs, options::OPT_r);
10459
10460 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10461 CmdArgs.push_back("--no-demangle");
10462
10463 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10464
10465 if (Args.hasArg(options::OPT_pthread)) {
10466 CmdArgs.push_back("-lpthread");
10467 }
10468
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010469 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10470
10471 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10472}
10473
10474static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10475 const JobAction &JA, const InputInfo &Output,
10476 const InputInfoList &Inputs,
10477 const ArgList &Args,
10478 const char *LinkingOutput) {
10479 const toolchains::FreeBSD &ToolChain =
10480 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10481 const Driver &D = ToolChain.getDriver();
10482 ArgStringList CmdArgs;
10483
10484 // Silence warning for "clang -g foo.o -o foo"
10485 Args.ClaimAllArgs(options::OPT_g_Group);
10486 // and "clang -emit-llvm foo.o -o foo"
10487 Args.ClaimAllArgs(options::OPT_emit_llvm);
10488 // and for "clang -w foo.o -o foo". Other warning options are already
10489 // handled somewhere else.
10490 Args.ClaimAllArgs(options::OPT_w);
10491
10492 if (!D.SysRoot.empty())
10493 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10494
10495 if (Args.hasArg(options::OPT_pie))
10496 CmdArgs.push_back("-pie");
10497
10498 if (Args.hasArg(options::OPT_static)) {
10499 CmdArgs.push_back("-Bstatic");
10500 } else {
10501 if (Args.hasArg(options::OPT_rdynamic))
10502 CmdArgs.push_back("-export-dynamic");
10503 CmdArgs.push_back("--eh-frame-hdr");
10504 if (Args.hasArg(options::OPT_shared)) {
10505 CmdArgs.push_back("-Bshareable");
10506 } else {
10507 CmdArgs.push_back("-dynamic-linker");
10508 CmdArgs.push_back("/libexec/ld-elf.so.1");
10509 }
10510 CmdArgs.push_back("--enable-new-dtags");
10511 }
10512
10513 if (Output.isFilename()) {
10514 CmdArgs.push_back("-o");
10515 CmdArgs.push_back(Output.getFilename());
10516 } else {
10517 assert(Output.isNothing() && "Invalid output.");
10518 }
10519
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010520 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10521
Douglas Katzman78b37b02015-11-17 20:28:07 +000010522 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010523 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010524 if (!Args.hasArg(options::OPT_shared)) {
10525 if (Args.hasArg(options::OPT_pg))
10526 crt1 = "gcrt1.o";
10527 else if (Args.hasArg(options::OPT_pie))
10528 crt1 = "Scrt1.o";
10529 else
10530 crt1 = "crt1.o";
10531 }
10532 if (crt1)
10533 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10534
10535 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10536
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010537 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010538 if (Args.hasArg(options::OPT_static))
10539 crtbegin = "crtbeginT.o";
10540 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10541 crtbegin = "crtbeginS.o";
10542 else
10543 crtbegin = "crtbegin.o";
10544
10545 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10546 }
10547
10548 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010549 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010550 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10551 Args.AddAllArgs(CmdArgs, options::OPT_e);
10552 Args.AddAllArgs(CmdArgs, options::OPT_s);
10553 Args.AddAllArgs(CmdArgs, options::OPT_t);
10554 Args.AddAllArgs(CmdArgs, options::OPT_r);
10555
10556 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10557 CmdArgs.push_back("--no-demangle");
10558
10559 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10560
Douglas Katzman78b37b02015-11-17 20:28:07 +000010561 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010562 // For PS4, we always want to pass libm, libstdc++ and libkernel
10563 // libraries for both C and C++ compilations.
10564 CmdArgs.push_back("-lkernel");
10565 if (D.CCCIsCXX()) {
10566 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10567 if (Args.hasArg(options::OPT_pg))
10568 CmdArgs.push_back("-lm_p");
10569 else
10570 CmdArgs.push_back("-lm");
10571 }
10572 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10573 // the default system libraries. Just mimic this for now.
10574 if (Args.hasArg(options::OPT_pg))
10575 CmdArgs.push_back("-lgcc_p");
10576 else
10577 CmdArgs.push_back("-lcompiler_rt");
10578 if (Args.hasArg(options::OPT_static)) {
10579 CmdArgs.push_back("-lstdc++");
10580 } else if (Args.hasArg(options::OPT_pg)) {
10581 CmdArgs.push_back("-lgcc_eh_p");
10582 } else {
10583 CmdArgs.push_back("--as-needed");
10584 CmdArgs.push_back("-lstdc++");
10585 CmdArgs.push_back("--no-as-needed");
10586 }
10587
10588 if (Args.hasArg(options::OPT_pthread)) {
10589 if (Args.hasArg(options::OPT_pg))
10590 CmdArgs.push_back("-lpthread_p");
10591 else
10592 CmdArgs.push_back("-lpthread");
10593 }
10594
10595 if (Args.hasArg(options::OPT_pg)) {
10596 if (Args.hasArg(options::OPT_shared))
10597 CmdArgs.push_back("-lc");
10598 else {
10599 if (Args.hasArg(options::OPT_static)) {
10600 CmdArgs.push_back("--start-group");
10601 CmdArgs.push_back("-lc_p");
10602 CmdArgs.push_back("-lpthread_p");
10603 CmdArgs.push_back("--end-group");
10604 } else {
10605 CmdArgs.push_back("-lc_p");
10606 }
10607 }
10608 CmdArgs.push_back("-lgcc_p");
10609 } else {
10610 if (Args.hasArg(options::OPT_static)) {
10611 CmdArgs.push_back("--start-group");
10612 CmdArgs.push_back("-lc");
10613 CmdArgs.push_back("-lpthread");
10614 CmdArgs.push_back("--end-group");
10615 } else {
10616 CmdArgs.push_back("-lc");
10617 }
10618 CmdArgs.push_back("-lcompiler_rt");
10619 }
10620
10621 if (Args.hasArg(options::OPT_static)) {
10622 CmdArgs.push_back("-lstdc++");
10623 } else if (Args.hasArg(options::OPT_pg)) {
10624 CmdArgs.push_back("-lgcc_eh_p");
10625 } else {
10626 CmdArgs.push_back("--as-needed");
10627 CmdArgs.push_back("-lstdc++");
10628 CmdArgs.push_back("--no-as-needed");
10629 }
10630 }
10631
Douglas Katzman78b37b02015-11-17 20:28:07 +000010632 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010633 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10634 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10635 else
10636 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10637 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10638 }
10639
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010640 const char *Exec =
10641#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010642 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010643#else
10644 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10645#endif
10646
10647 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10648}
10649
10650void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10651 const InputInfo &Output,
10652 const InputInfoList &Inputs,
10653 const ArgList &Args,
10654 const char *LinkingOutput) const {
10655 const toolchains::FreeBSD &ToolChain =
10656 static_cast<const toolchains::FreeBSD &>(getToolChain());
10657 const Driver &D = ToolChain.getDriver();
10658 bool PS4Linker;
10659 StringRef LinkerOptName;
10660 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10661 LinkerOptName = A->getValue();
10662 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10663 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10664 }
10665
10666 if (LinkerOptName == "gold")
10667 PS4Linker = false;
10668 else if (LinkerOptName == "ps4")
10669 PS4Linker = true;
10670 else
10671 PS4Linker = !Args.hasArg(options::OPT_shared);
10672
10673 if (PS4Linker)
10674 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10675 else
10676 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10677}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010678
10679void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10680 const InputInfo &Output,
10681 const InputInfoList &Inputs,
10682 const ArgList &Args,
10683 const char *LinkingOutput) const {
10684 const auto &TC =
10685 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010686 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010687
10688 std::vector<std::string> gpu_archs =
10689 Args.getAllArgValues(options::OPT_march_EQ);
10690 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10691 const std::string& gpu_arch = gpu_archs[0];
10692
10693
10694 ArgStringList CmdArgs;
10695 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
10696
Justin Lebar2836dcd2016-01-19 19:52:21 +000010697 // Map the -O we received to -O{0,1,2,3}.
10698 //
10699 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's default,
10700 // so it may correspond more closely to the spirit of clang -O2.
10701 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10702 // -O3 seems like the least-bad option when -Osomething is specified to
10703 // clang but it isn't handled below.
10704 StringRef OOpt = "3";
10705 if (A->getOption().matches(options::OPT_O4) ||
10706 A->getOption().matches(options::OPT_Ofast))
10707 OOpt = "3";
10708 else if (A->getOption().matches(options::OPT_O0))
10709 OOpt = "0";
10710 else if (A->getOption().matches(options::OPT_O)) {
10711 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10712 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10713 .Case("1", "1")
10714 .Case("2", "2")
10715 .Case("3", "3")
10716 .Case("s", "2")
10717 .Case("z", "2")
10718 .Default("2");
10719 }
10720 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10721 } else {
10722 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10723 // to no optimizations, but ptxas's default is -O3.
10724 CmdArgs.push_back("-O0");
10725 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010726
10727 // Don't bother passing -g to ptxas: It's enabled by default at -O0, and
10728 // not supported at other optimization levels.
10729
10730 CmdArgs.push_back("--gpu-name");
10731 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10732 CmdArgs.push_back("--output-file");
10733 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10734 for (const auto& II : Inputs)
10735 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10736
10737 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10738 CmdArgs.push_back(Args.MakeArgString(A));
10739
10740 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10741 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10742}
10743
10744// All inputs to this linker must be from CudaDeviceActions, as we need to look
10745// at the Inputs' Actions in order to figure out which GPU architecture they
10746// correspond to.
10747void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10748 const InputInfo &Output,
10749 const InputInfoList &Inputs,
10750 const ArgList &Args,
10751 const char *LinkingOutput) const {
10752 const auto &TC =
10753 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010754 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010755
10756 ArgStringList CmdArgs;
10757 CmdArgs.push_back("--cuda");
10758 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10759 CmdArgs.push_back(Args.MakeArgString("--create"));
10760 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10761
10762 for (const auto& II : Inputs) {
10763 auto* A = cast<const CudaDeviceAction>(II.getAction());
10764 // We need to pass an Arch of the form "sm_XX" for cubin files and
10765 // "compute_XX" for ptx.
10766 const char *Arch = (II.getType() == types::TY_PP_Asm)
10767 ? A->getComputeArchName()
10768 : A->getGpuArchName();
10769 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10770 Arch + ",file=" + II.getFilename()));
10771 }
10772
10773 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10774 CmdArgs.push_back(Args.MakeArgString(A));
10775
10776 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10777 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10778}